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:
-
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 {
-
+ project.getLocationURI().toURL().toString());
-
-
msgBox(this.getClassFileName(project.getLocationURI()
-
.toURL().toString(), project.getName(),
-
fullJavaSourcePath, java.getOutputLocation()
-
.toOSString()));
-
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
} catch (JavaModelException e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
}
-
-
}
-
}
Método getProject():
-
private IProject getProject(final IStructuredSelection selection) {
-
IProject project = null;
-
-
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;
-
}
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:
-
-
.lastIndexOf('/'))
-
+ output;
-
-
javaSource.length());
-
-
return fullOutputFolder
-
+ newSource.substring(newSource.indexOf('/'),
-
newSource.length()).replaceAll(".java", ".class");
-
}
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
, Saúde! O resto é todo lucro.
Edgar

Entries (RSS)
January 3rd, 2008 at 12:06 am
O uso do JET não se propõe como alternativa viável?
January 3rd, 2008 at 3:50 am
A API do JDT é meio difícil p/ quem não conhece os conceitos. Não, eu também não faço idéia de como pegar IClassFile a partir de um IFile
Mas a sua gambi tem um pequeno bug: ele não vai funcionar se o usuário setar o output folder diretamente no source folder. Uma solução seria +- isso (sem tratamento de exceções p/ facilitar a leitura):
IResource res = (IResource) ((IAdaptable) sel).getAdapter(IResource.class);
IProject project = (IProject) res.getProject();
IJavaProject jp = JavaCore.create(project);
ICompilationUnit cu = JavaCore.createCompilationUnitFrom((IFile) sel);
IJavaElement packFrag = cu.getParent();
IPackageFragmentRoot root = (IPackageFragmentRoot) packFrag.getParent();
IClasspathEntry ce = root.getRawClasspathEntry();
IPath outputLocation = ce.getOutputLocation();
if (outputLocation == null) {
outputLocation = jp.getOutputLocation();
}
System.out.println(outputLocation.toString());
BTW, p/ que vc quer o IClassFile? Um IType não te dá tudo o que vc precisa?
January 3rd, 2008 at 2:07 pm
William,
Muito obrigado pela contribuição.
Eu voun umar um Seam Project Nature, que “teoricamente” sempre terá um output folder.
Eu tentei pegar o IType , mas eu sempre pegava um NPE, na referencia dele quando tentava pegar o IClassFile.
Eu só preciso da .class para com base nela via reflection ter acesso as informacoes da EntityClass.
Eu to fazendo isto meio que por hobby, eu dei uma olhada na solução do Aldrin (tks Eng.br), que seria usar o JET, também parerce ser bem interessante.
Obrigado pelas dicas
Cordialmente
Edgar