package play.modules.cream;
import javassist.CtClass;
import javassist.CtMethod;
import play.Logger;
import play.classloading.ApplicationClasses.ApplicationClass;
import play.classloading.enhancers.Enhancer;
public class JcrEnhancer extends Enhancer {
@Override
public void enhanceThisClass(ApplicationClass applicationClass) throws Exception {
CtClass ctClass = makeClass(applicationClass);
if (ctClass.subtypeOf(classPool.get(Model.class.getName()))) {
String entityName = ctClass.getName();
Logger.trace("Enhancing jcr entity %s", entityName);
// All
CtMethod all = CtMethod
.make(String
.format("public static play.modules.cream.ocm.JcrQueryResult all(String rootPath) { return play.modules.cream.ocm.JcrMapper.findAll(\"%s\", rootPath); }",
entityName), ctClass);
ctClass.addMethod(all);
CtMethod allDefault = CtMethod
.make(String
.format("public static play.modules.cream.ocm.JcrQueryResult all() { return play.modules.cream.ocm.JcrMapper.findAll(\"%s\"); }",
entityName), ctClass);
ctClass.addMethod(allDefault);
// Find All
CtMethod findAll = CtMethod
.make(String
.format("public static java.util.List findAll(String rootPath) { return play.modules.cream.ocm.JcrMapper.findAll(\"%s\", rootPath).fetch();}",
entityName), ctClass);
ctClass.addMethod(findAll);
CtMethod findAllDefault = CtMethod
.make(String
.format("public static java.util.List findAll() { return play.modules.cream.ocm.JcrMapper.findAll(\"%s\").fetch();}",
entityName), ctClass);
ctClass.addMethod(findAllDefault);
// Find
CtMethod find = CtMethod
.make(String
.format("public static play.modules.cream.ocm.JcrQueryResult find(String query, Object[] params) { return play.modules.cream.ocm.JcrMapper.find(\"%s\", query, params);}",
entityName), ctClass);
ctClass.addMethod(find);
// Find By
CtMethod findBy = CtMethod
.make(String
.format("public static play.modules.cream.ocm.JcrQueryResult findByPath(String path, String where, Object[] params) { return play.modules.cream.ocm.JcrMapper.findByPath(\"%s\", path, where, params);}",
entityName), ctClass);
ctClass.addMethod(findBy);
CtMethod findByDefault = CtMethod
.make(String
.format("public static play.modules.cream.ocm.JcrQueryResult findBy(String where, Object[] params) { return play.modules.cream.ocm.JcrMapper.findBy(\"%s\", where, params);}",
entityName), ctClass);
ctClass.addMethod(findByDefault);
// ById
CtMethod byId = CtMethod
.make(String
.format("public static play.modules.cream.Model findById(Object id) { return play.modules.cream.ocm.JcrMapper.loadByUUID(\"%s\", (String) id);}",
entityName), ctClass);
ctClass.addMethod(byId);
// Get
CtMethod get = CtMethod
.make(String
.format("public static play.modules.cream.Model get(String path) { return play.modules.cream.ocm.JcrMapper.get(\"%s\", path);}",
entityName), ctClass);
ctClass.addMethod(get);
CtMethod getDefault = CtMethod
.make(String
.format("public static play.modules.cream.Model get() { return play.modules.cream.ocm.JcrMapper.get(\"%s\");}",
entityName), ctClass);
ctClass.addMethod(getDefault);
// TODO version
// TODO buildJcrQuery
// Done.
applicationClass.enhancedByteCode = ctClass.toBytecode();
ctClass.defrost();
}
}
}