Archive for January 2nd, 2008

O Eclipse em termos de mercado ainda é a  IDE Java mais usada

Esse foi um dos argumentos para o JBoss Studio ser baseado nele. Não cabe a mim maiores argumentações, até porque ainda uso NetBeans, e para quem pretende extender uma IDE, (in)felizmente o NetBeans ainda é extremamente mais simples.

Perdendo algum tempo tentando fazer as coisas de forma "correta", usando as Interfaces: ICompilationUnit, IType, IJavaModel, IJavaElement e todos os "I's" que você puder imaginar, resolvi usar a famosa POW (Programação Orientada a Workarouds). Workaround é uma forma bonita que foi cirada para camuflar o que conhecemos como : Gambiarra!

No JBoss Studio, para quem desenvolve com o JBoss Seam, quando você gera um Entity, o SeamGen gera uma página JSP com tags JSF para Listagem e Edição, a itenção desta extensão que estou trabalhando nas horas vagas (pouquissimas recentemente), visa atualizar via o DiffEditor do eclipse os campos do formulário e da listagem com base em novos atributos da sua Entity Class. Sendo assim, você irá clicar com o botão direita no Package Explorer e ai você terá a opção "Update JSPs based on this Entity...".

Basicamente este plugin é um PopupAction que trata as invocação do popup sobre um .java da seguinte forma:

Método run:

JAVA:
  1. public void run(IAction action) {
  2.  
  3. ISelection sel = targetPart.getSite().getSelectionProvider()
  4. .getSelection();
  5.  
  6. if (sel instanceof IStructuredSelection) {
  7.  
  8. IProject project = getProject((IStructuredSelection) sel);
  9. if (project != null) {
  10. IJavaProject java = JavaCore.create(project);
  11.  
  12. try {
  13. System.out.println("Project Path: "
  14. + project.getLocationURI().toURL().toString());
  15.  
  16. msgBox(this.getClassFileName(project.getLocationURI()
  17. .toURL().toString(), project.getName(),
  18. fullJavaSourcePath, java.getOutputLocation()
  19. .toOSString()));
  20.  
  21. } catch (MalformedURLException e) {
  22. // TODO Auto-generated catch block
  23. e.printStackTrace();
  24. } catch (JavaModelException e) {
  25. // TODO Auto-generated catch block
  26. e.printStackTrace();
  27. }
  28.  
  29. }
  30. }

Método getProject():

JAVA:
  1. private IProject getProject(final IStructuredSelection selection) {
  2. IProject project = null;
  3. Object object = selection.getFirstElement();
  4.  
  5. if ((object != null) && (object instanceof IAdaptable)) {
  6. IResource resource = (IResource) ((IAdaptable) object)
  7. .getAdapter(IResource.class);
  8.  
  9. if (resource != null) {
  10.  
  11. fullJavaSourcePath = resource.getFullPath().toOSString();
  12. project = resource.getProject();
  13. javaSourceSelected = resource.getName();
  14.  
  15. }
  16. }
  17.  
  18. return project;
  19. }

E eu confesso que tentei usar vários recursos, entre eles: IType para capturar o IClassFile , para saber qual o .class respectivo daquele respectivo .java...E desisti de tanto NPEs (NullPointerExceptions) que levei na cara, e ai veio o seguinte "gambiarratico", todavia funcional método tabajara:

JAVA:
  1. protected String getClassFileName(String projectHome, String projectName,
  2. String javaSource, String output) {
  3.  
  4. String fullOutputFolder = projectHome.substring(0, projectHome
  5. .lastIndexOf('/'))
  6. + output;
  7.  
  8. String newSource = javaSource.substring(projectName.length() + 2,
  9. javaSource.length());
  10.  
  11. return fullOutputFolder
  12. + newSource.substring(newSource.indexOf('/'),
  13. newSource.length()).replaceAll(".java", ".class");
  14. }

Eu tenho certeza que isso é quase um assassinato ao modelo RCP, JDT do Eclipse, porém, para o que eu precisava, que é a droga do .class, isso funcionou bem mais simples e melhor que as tão belas e "fundamentadas" classes do Eclipse. É por essas e outras, que ainda tenho falta do NetBeans.

Abraços e aproveitando: Feliz 2008 :D , Saúde! O resto é todo lucro.

Edgar