12
Tecgraf PUC-Rio maio de 2011 Aplicação Java cliente do DataService Openbus

Tecgraf PUC-Rio maio de 2011 Aplicação Java cliente do DataService Openbus

Embed Size (px)

Citation preview

Page 1: Tecgraf PUC-Rio maio de 2011 Aplicação Java cliente do DataService Openbus

Tecgraf PUC-Riomaio de 2011

Aplicação Java cliente do DataService Openbus

Page 2: Tecgraf PUC-Rio maio de 2011 Aplicação Java cliente do DataService Openbus

Sobre o exemplo

• Mostraremos um exemplo de uma aplicação cliente que usa o DataService publicado pelo Serviço de Projetos dos sistemas CSBase.

• Para tal, vamos assumir que existe um CSGrid (ou outro sistema CSBase) executando e que tenha publicado em um barramento OpenBus o DataService.• O serviço de Projetos CSBase implementa um

componente de serviço IHierarchicalDataService

Page 3: Tecgraf PUC-Rio maio de 2011 Aplicação Java cliente do DataService Openbus

Passo 1: Obtendo as libs do DataService

• A última versão das bibliotecas java do Serviço de Dados pode ser obtida em:• https://jira.tecgraf.puc-rio.br/confluence/pages/vie

wpage.action?pageId=27067037• A biblioteca com os tipos usados no serviço de

dados dos data sources (ex: repositório de projetos do CSGrid) devem ser requisitadas ao administrador do próprio sistema.

Page 4: Tecgraf PUC-Rio maio de 2011 Aplicação Java cliente do DataService Openbus

Libs do DataService

• Core:• openbus-data_service-api-1.0.1.jar• openbus-data_service-idl-jacorb-1.0.1.jar• openbus-data_service-valuetype-1.0.1.jar

• Serviço de Projetos CSBase:• openbus-data_service-project-idl-jacorb-1.0.1.jar• openbus-data_service-project-valuetype-1.0.1.jar

Page 5: Tecgraf PUC-Rio maio de 2011 Aplicação Java cliente do DataService Openbus

Passo 2: Implementando o Cliente

• O programa cliente se encarrega de:– inicializar o Openbus e registrar as fábricas dos

value types utilizados– fazer a autenticação no barramento– exibir a estrutura de pastas e arquivos que

compôem um projeto CSBase– copiar o conteúdo de um arquivo local para uma

pasta de um projeto CSBase– ler um arquivo remoto

Page 6: Tecgraf PUC-Rio maio de 2011 Aplicação Java cliente do DataService Openbus

Registro das fábricas dos valuetypesimport tecgraf.openbus.data_service.DataDescriptionFactory;import tecgraf.openbus.data_service.DataDescriptionHelper;import tecgraf.openbus.project.ProjectItemDescriptionHelper;import tecgraf.openbus.data_service.project.ProjectItemDescriptionFactory;import tecgraf.openbus.data_service.UnstructuredDataFactory;import tecgraf.openbus.data_service.UnstructuredDataHelper;...

Openbus bus = Openbus.getInstance();ORB orb = (ORB) bus.getORB();orb.register_value_factory(DataDescriptionHelper.id(), new DataDescriptionFactory());orb.register_value_factory(ProjectItemDescriptionHelper.id(), new ProjectItemDescriptionFactory());orb.register_value_factory(UnstructuredDataHelper.id(), new UnstructuredDataFactory());

Page 7: Tecgraf PUC-Rio maio de 2011 Aplicação Java cliente do DataService Openbus

Procurando o serviço ProjectDataService String componentName = props.getProperty("dataservice.component.name”);String componentVersion = props.getProperty("dataservice.component.version”);String componentId = componentName + ":" + componentVersion;Property property = new Property("component_id", new String[] { componentId });

String facetName = "ProjectDataService";ServiceOffer[] servicesOffers = registryService.findByCriteria( new String[] {facetName}, new Property[] { property });if (servicesOffers.length == 0) { throw new ProjectServiceClientException("Não foi encontrado um serviço " + facetName + " com identificador: " + componentId);}if (servicesOffers.length > 1) { throw new ProjectServiceClientException( "Foi encontrado mais de um serviço " + facetName + " com identificador: " + componentId);}ServiceOffer serviceOffer = servicesOffers[0];IComponent component = serviceOffer.member;IHierarchicalDataService dataService = IHierarchicalDataServiceHelper.narrow(component .getFacet(IHierarchicalDataServiceHelper.id()));

• Outra forma de procurar pelo componente é usando a propriedade registered_by com o nome da entidade que publicou o componente f

Page 8: Tecgraf PUC-Rio maio de 2011 Aplicação Java cliente do DataService Openbus

Obtendo o descritor da raiz do projeto String projectName = props.getProperty("dataservice.project.name");DataDescription[] rootDescList = dataService.getRoots();if (rootDescList.length < 1) { throw new ProjectServiceClientException("O usuário não possui projetos");}for (int i = 0; i < rootDescList.length; i++) { DataDescription rootDesc = rootDescList[i]; if (!(rootDesc instanceof ProjectItemDescription)) { throw new ProjectServiceClientException("Descritor inválido:" + rootDesc.toString()); } if (rootDesc.fName.equals(projectName)) { return rootDesc; }}

• O valuetype ProjectItemDescription precisa estar registradono ORB com a sua respectiva fábrica

Page 9: Tecgraf PUC-Rio maio de 2011 Aplicação Java cliente do DataService Openbus

Exibindo a árvore de dados do projeto private void showFolder(int count, DataDescription desc) throws ProjectServiceClientException { try { StringBuffer ident = new StringBuffer(); for (int i = 0; i < count; i++) { ident.append(' '); } DataDescription[] children = dataService.getChildren(desc.fKey); for (DataDescription child : children) { String childName = child.fName; ProjectItemDescription childDesc = (ProjectItemDescription) dataService.getDataDescription(child.fKey); if (childDesc.fIsContainer) { System.out.println(ident + "+ Diretorio: " + childName); showFolder(count + 3, child); } else { System.out.println(ident + "- Arquivo: " + childName); } } } catch (Exception e) { throw new ProjectServiceClientException( "Erro na exibição do conteúdo da pasta" + desc.fName, e); } }

Page 10: Tecgraf PUC-Rio maio de 2011 Aplicação Java cliente do DataService Openbus

Para criar um arquivo

• Precisamos instanciar um ProjectItemDescriptionImpl

/** * Constrói uma descrição de um item de projeto. * @param key A chave unívoca do item de projeto. * @param name O nome do item de projeto. * @param views As visões oferecidas para o item de projeto. * @param metadata Os metadados do item de projeto. * @param owner O dono do item. * @param description Um texto explicativo. * @param path O caminho. * @param type O tipo. * @param size O tamanho. * @param isContainer Indica se o item pode conter outros itens. * @param canRead Indica se o item pode ser lido. * @param canWrite Indica se o item pode ser alterado. * @param creationDate A data de criação. * @param modificationDate A data de última modificação. */ public ProjectItemDescriptionImpl(byte[] key, String name, Set<String> views, List<Metadata> metadata, String owner, String description, String path, String type, long size, boolean isContainer, boolean canRead, boolean canWrite, long creationDate, long modificationDate) {...}

Page 11: Tecgraf PUC-Rio maio de 2011 Aplicação Java cliente do DataService Openbus

Escrevendo um arquivo usando o FTC public DataDescription createRemoteFile(String fileName, byte[] data, DataDescription desc) throws ProjectServiceClientException { try { long currentDate = Calendar.getInstance().getTimeInMillis(); ProjectItemDescription prototype = new ProjectItemDescriptionImpl(fileName, new HashSet<String>(), new ArrayList<Metadata>(), userLogin, null, null, "TEXT", 0, false, true, true, currentDate, currentDate); byte[] fileKey = dataService.createData(desc.fKey, prototype); UnstructuredData view = (UnstructuredData) dataService.getDataView(fileKey, UnstructuredDataHelper.id()); DataKey dataKey = new DataKey(view.fKey); RemoteFileChannel rfc = new RemoteFileChannelImpl(dataKey.getDataId().getBytes( Utils.CHARSET_ENCODING), view.fWritable, view.fHost, view.fPort, view.fAccessKey); rfc.open(false); rfc.write(data); rfc.close(); return dataService.getDataDescription(fileKey); } catch (Exception e) { throw new ProjectServiceClientException( "Erro na criação de um arquivo na pasta", e); } }

Page 12: Tecgraf PUC-Rio maio de 2011 Aplicação Java cliente do DataService Openbus

Lendo um arquivo usando o FTC public byte[] readRemoteFile(DataDescription desc) throws ProjectServiceClientException { try { UnstructuredData view = (UnstructuredData) dataService.getDataView(desc.fKey, UnstructuredDataHelper.id()); DataKey dataKey = new DataKey(view.fKey); RemoteFileChannel rfc = new RemoteFileChannelImpl(dataKey.getDataId().getBytes( Utils.CHARSET_ENCODING), view.fWritable, view.fHost, view.fPort, view.fAccessKey); rfc.open(true); int fileSize = (int) rfc.getSize(); byte[] buffer = new byte[fileSize]; if (fileSize != 0) { rfc.read(buffer); } rfc.close(); return buffer; } catch (Exception e) { throw new ProjectServiceClientException( "Erro na leitura de um dado da pasta", e); } }