Eclipse Plugins Dev: Saudade do NetBeans

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]

public void run(IAction action) {

ISelection sel = targetPart.getSite().getSelectionProvider()
.getSelection();

if (sel instanceof IStructuredSelection) {

IProject project = getProject((IStructuredSelection) sel);
if (project != null) {
IJavaProject java = JavaCore.create(project);

try {
System.out.println(”Project Path: ”
+ project.getLocationURI().toURL().toString());

msgBox(this.getClassFileName(project.getLocationURI()
.toURL().toString(), project.getName(),
fullJavaSourcePath, java.getOutputLocation()
.toOSString()));

} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JavaModelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}

[/java]

Método getProject():

[java]

private IProject getProject(final IStructuredSelection selection) {
IProject project = null;
Object object = selection.getFirstElement();

if ((object != null) && (object instanceof IAdaptable)) {
IResource resource = (IResource) ((IAdaptable) object)
.getAdapter(IResource.class);

if (resource != null) {

fullJavaSourcePath = resource.getFullPath().toOSString();
project = resource.getProject();
javaSourceSelected = resource.getName();

}
}

return project;
}

[/java]

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]

protected String getClassFileName(String projectHome, String projectName,
String javaSource, String output) {

String fullOutputFolder = projectHome.substring(0, projectHome
.lastIndexOf(’/'))
+ output;

String newSource = javaSource.substring(projectName.length() + 2,
javaSource.length());

return fullOutputFolder
+ newSource.substring(newSource.indexOf(’/'),
newSource.length()).replaceAll(”.java”, “.class”);
}

[/java]

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