package play.modules.cream;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang.ArrayUtils;
import org.jcrom.Jcrom;
import org.jcrom.annotations.JcrNode;
import org.jcrom.util.ReflectionUtils;
public class JcrMetadata {
public class MD {
public String[] mixinTypes;
public boolean isVersionable;
public String nodeType;
public MD(Class<?> clazz) {
this.mixinTypes = findMixins(clazz);
this.isVersionable = checkIfVersionable(clazz);
this.nodeType = finNodeType(clazz);
}
private boolean checkIfVersionable(Class<?> clazz) {
for (String mixinType : mixinTypes) {
if (mixinType.equals("mix:versionable")) {
return true;
}
}
return false;
}
private String[] findMixins(Class<?> clazz) {
String[] mixins;
JcrNode jcrNode = ReflectionUtils.getJcrNodeAnnotation(clazz);
if (jcrNode != null && jcrNode.mixinTypes() != null) {
mixins = jcrNode.mixinTypes();
} else {
mixins = new ArrayUtils().EMPTY_STRING_ARRAY;
}
return mixins;
}
private String finNodeType(Class<?> clazz) {
String nodeType;
JcrNode jcrNode = ReflectionUtils.getJcrNodeAnnotation(clazz);
if (jcrNode != null) {
nodeType = jcrNode.nodeType();
} else {
nodeType = "nt:unstructured";
}
return nodeType;
}
}
public static JcrMetadata getInstance() {
if (INSTANCE == null)
createInstance();
return INSTANCE;
}
private synchronized static void createInstance() {
if (INSTANCE == null) {
INSTANCE = new JcrMetadata();
}
}
public Map<Class<?>, MD> metadata;
private static JcrMetadata INSTANCE = null;
private JcrMetadata() {
metadata = new HashMap<Class<?>, JcrMetadata.MD>();
}
public Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
public void intialize(Jcrom jcrom) {
for (Class<?> clazz : jcrom.getMappedClasses()) {
metadata.put(clazz, new MD(clazz));
}
}
public MD lookup(Class<?> clazz) {
return metadata.get(clazz);
}
}