-
- public Set<Class<?>> scanForAnnotations(File dir, ClassLoader classLoader, Map<String,String> md5s) throws MojoExecutionException, MojoFailureException {
- Set<Class<?>> classes = new TreeSet<Class<?>>(
- new Comparator<Class<?>>() {
- @Override
- public int compare(Class<?> a, Class<?> b) {
- return a.getName().compareTo(b.getName());
- }
- }
- );
-
- try {
- AnnotationDB db = new AnnotationDB();
- getLog().info("Scanning directory " + outputDirectory + " for annotated classes...");
- URL dirUrl = dir.toURI().toURL();
- db.scanArchives(dirUrl);
- if (scanTestClasses) {
- dir = new File(testOutputDirectory);
- if (!dir.exists())
- throw new MojoExecutionException("Cannot scan for annotated test-classes in " + testOutputDirectory + ": directory does not exist!");
- getLog().info("Scanning directory " + testOutputDirectory + " for annotated classes...");
- dirUrl = dir.toURI().toURL();
- db.scanArchives(dirUrl);
- }
-
- Set<String> classNames = new HashSet<String>();
- if (db.getAnnotationIndex().containsKey(Entity.class.getName()))
- classNames.addAll(db.getAnnotationIndex().get(Entity.class.getName()));
- if (db.getAnnotationIndex().containsKey(MappedSuperclass.class.getName()))
- classNames.addAll(db.getAnnotationIndex().get(MappedSuperclass.class.getName()));
- if (db.getAnnotationIndex().containsKey(Embeddable.class.getName()))
- classNames.addAll(db.getAnnotationIndex().get(Embeddable.class.getName()));
-
- MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
- for (String name : classNames) {
- Class<?> annotatedClass = classLoader.loadClass(name);
- classes.add(annotatedClass);
- InputStream is =
- annotatedClass
- .getResourceAsStream(annotatedClass.getSimpleName() + ".class");
- byte[] buffer = new byte[1024*4]; // copy data in 4MB-chunks
- int i;
- while((i = is.read(buffer)) > -1)
- digest.update(buffer, 0, i);
- is.close();
- byte[] bytes = digest.digest();
- BigInteger bi = new BigInteger(1, bytes);
- String newMd5 = String.format("%0" + (bytes.length << 1) + "x", bi);
- String oldMd5 = !md5s.containsKey(name) ? "" : md5s.get(name);
- if (!newMd5.equals(oldMd5))
- {
- getLog().debug("Found new or modified annotated class: " + name);
- modified = true;
- md5s.put(name, newMd5);
- }
- else
- {
- getLog().debug(oldMd5 + " -> class unchanged: " + name);
- }
- }
- } catch (Exception e) {
- getLog().error("Error while scanning!", e);
- throw new MojoFailureException(e.getMessage());
- }
-
- if (classes.isEmpty())
- throw new MojoFailureException("No annotated classes found in directory " + outputDirectory);
-
- getLog().debug("Detected classes with mapping-annotations:");
- for (Class<?> annotatedClass : classes)
- getLog().debug(" " + annotatedClass.getName());
- return classes;
- }