private void loadPatchersAndJavaScriptObjects() throws Exception { jsoSubClasses = new HashSet<String>(); patchers = new HashMap<String, Patcher>(); List<String> classList = findScannedClasses(); CtClass jsoCtClass = GwtClassPool.get().get(JSO_CLASSNAME); for (String className : classList) { CtClass ctClass = GwtClassPool.get().get(className); if (ctClass.subclassOf(jsoCtClass) && !ctClass.equals(jsoCtClass)) { jsoSubClasses.add(className); } else if (ctClass.hasAnnotation(PatchClass.class)) { treatPatchClass(ctClass); } } }
private void enhanceClass(Enhancer enhancer, File file) { byte[] enhancedBytecode = null; InputStream is = null; CtClass clas = null; try { is = new FileInputStream(file.toString()); clas = getClassPool().makeClass(is); if (!clas.hasAnnotation(Entity.class)) { getLog().debug("Class $file not an annotated Entity class. skipping..."); } else { enhancedBytecode = enhancer.enhance(clas.getName(), clas.toBytecode()); } } catch (Exception e) { getLog().error("Unable to enhance class [${file.toString()}]", e); return; } finally { try { if (null != is) is.close(); } catch (IOException ioe) { } } if (null != enhancedBytecode) { if (file.delete()) { try { if (!file.createNewFile()) { getLog().error("Unable to recreate class file [" + clas.getName() + "]"); } } catch (IOException ioe) { } } else { getLog().error("Unable to delete class file [" + clas.getName() + "]"); } FileOutputStream outputStream = null; try { outputStream = new FileOutputStream(file, false); outputStream.write(enhancedBytecode); outputStream.flush(); } catch (IOException ioe) { } finally { try { if (outputStream != null) outputStream.close(); clas.detach(); // release memory } catch (IOException ignore) { } } } }
@Override public boolean isCompositeClass(CtClass classDescriptor) { return classDescriptor.hasAnnotation(Embeddable.class); }
@Override public boolean isEntityClass(CtClass classDescriptor) { return classDescriptor.hasAnnotation(Entity.class); }