private String getMetadataFileName(ICompilationUnit iCompilationUnit) { String result = null; try { result = iCompilationUnit.getCorrespondingResource().getLocation().removeFileExtension().toString() + METADATA_EXTENSION; } catch (JavaModelException e) { IStatus status = new Status( IStatus.ERROR, Activator.PLUGIN_ID, "Error reading compilation unit at getMetadataFileName.", e); Activator.getDefault().getLog().log(status); } catch (Exception e) { IStatus status = new Status( IStatus.ERROR, Activator.PLUGIN_ID, "Error reading compilation unit at getMetadataFileName.", e); Activator.getDefault().getLog().log(status); } return result; }
/* * Ensures that getCorrespondingResource() returns a non-null value for a primary working copy. * (regression test for bug 44065 NPE during hot code replace) */ public void testGetCorrespondingResource() throws CoreException { ICompilationUnit cu = null; try { cu = getCompilationUnit("P/X.java"); cu.becomeWorkingCopy(null); assertResourceNamesEqual( "Unexpected resource", "X.java", new Object[] {cu.getCorrespondingResource()}); } finally { if (cu != null) { cu.discardWorkingCopy(); } } }
@Override public Object execute(ExecutionEvent event) throws ExecutionException { /* * Lê os arquivos selecionados no Package Explorer * Fontes: * http://www.vogella.de/articles/EclipsePlugIn/article.html#contribute */ IStructuredSelection selection = (IStructuredSelection) HandlerUtil.getActiveMenuSelection(event); try { /* * Os arquivos selecionados podem ser de mais de um projeto, desta * forma, armazena os projetos num mapa para que possam ser * atualizados (Refresh) após a criação dos arquivos de metadados */ Set<IProject> projects = new HashSet<IProject>(); for (Object element : selection.toList()) { if (element instanceof ICompilationUnit) { ICompilationUnit iCompilationUnit = (ICompilationUnit) element; String metadataFileName = getMetadataFileName(iCompilationUnit); if (metadataFileName != null) { /* * Obtém um CompilationUnit para percorrer as propriedades * com um Visitor * Fontes: * http://www.guj.com.br/java/245139-duvida-com-classloader-ao-desenvolver-um-plugin-para-o-eclipse * http://stackoverflow.com/questions/3938528/getting-field-type-in-a-method-in-eclipse */ CompilationUnit compilationUnit = getAst(iCompilationUnit); EntityParser parser = new EntityParser(iCompilationUnit, compilationUnit); parser.run(); EntityType entityType = parser.getEntityType(); // Grava os dados da entidade em um arquivo xml write(metadataFileName, entityType); // adicina o projeto no conjunto, para ser atualizado após a criação dos arquivos projects.add(iCompilationUnit.getCorrespondingResource().getProject()); } else { MessageDialog.openInformation( HandlerUtil.getActiveShell(event), "Erro", "Não foi possível gravar o arquivo " + METADATA_EXTENSION + ". Verifique se você possui permissão de escrita no projeto."); } } else { MessageDialog.openInformation( HandlerUtil.getActiveShell(event), "Atenção", "Selecione apenas arquivos Java"); return null; } } /* * Atualiza os projetos vinculados aos arquivos * Fontes: * http://www.openarchitectureware.org/forum/viewtopic.php?showtopic=4958 */ for (IProject project : projects) { project.refreshLocal(IResource.DEPTH_INFINITE, null); } MessageDialog.openInformation( HandlerUtil.getActiveShell(event), "Sucesso", "Arquivos de metadados criados com sucesso."); } catch (Exception e) { /* * Logs, Fonte: * http://www.ibm.com/developerworks/library/os-eclog/ */ IStatus status = new Status( IStatus.ERROR, Activator.PLUGIN_ID, "Error executing plugin orion-metadata.", e); Activator.getDefault().getLog().log(status); throw new ExecutionException("Error executing plugin orion-metadata.", e); } return null; }