+
+ 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;
+ }