Scanning jar and classes for annotations
demetrio812 Feb 16, 2009 5:51 PMHi,
I've made some annotations I use for configuration, to find the annotation I used the project Scannotation, the only problem I had is to find the right path (since I cannot use the classpath) so at the end to find the paths I search the seam.properties
file into the resources and get all the path with that file so I use that path to scan classes.
Is it a good way to implement it? I should also use a personalized file but I don't want too introduce other requirement and the position of seam.properties
is fine for me.
This is the code I used:
First I have to find the array with the URL where to search:
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.io.IOException;
public class SeamComponentsUrlFinder {
public static URL[] findInSeamPath() {
ArrayList<URL> list = new ArrayList<URL>();
Enumeration<URL> resources;
try {
resources = Thread.currentThread().getContextClassLoader()
.getResources("seam.properties");
} catch (IOException ioe) {
throw new RuntimeException("error scanning seam.properties files",
ioe);
}
try {
while (resources.hasMoreElements()) {
URL url = resources.nextElement();
list.add(new URL(url.toExternalForm().replaceAll(
"seam.properties", "")));
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
return list.toArray(new URL[list.size()]);
}
}
Then I can search for classes with my own annotations, here an example using scannotation:
URL urls[];
// Get the URL where to scan
urls = SeamComponentsUrlFinder.findInSeamPath();
System.out.println("Cerco tutto...");
AnnotationDB db = new AnnotationDB();
try {
db.scanArchives(urls);
// Just scan Class Annotations
db.setScanFieldAnnotations(false);
db.setScanMethodAnnotations(false);
db.setScanParameterAnnotations(false);
Map<String, Set<String>> annotationIndex = db.getAnnotationIndex();
// Classes with org.jboss.seam.annotations.Name annotation
Set<String> entities = annotationIndex.get("org.jboss.seam.annotations.Name");
// Classes with it.novaware.sn.core.annotations.SNetApp annotation
Set<String> entities2 = annotationIndex.get("it.novaware.sn.core.annotations.SNetApp");
} catch (IOException e) {
e.printStackTrace();
}
Let me know what you think...
Thanks!
Demetrio