package org.etk.orm.plugins.jcr.type;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.nodetype.NodeType;
import org.etk.orm.plugins.jcr.NodeTypeInfo;
/**
* <p>Manage type related information.</p>
*
* <p>This acts actually like the cache of underlying JCR type system.</p>
*
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
* @version $Revision$
*/
public class TypeManager {
/** . */
private final Object nodeTypeInfosLock = new Object();
/** . */
private volatile Map<String, NodeTypeInfo> nodeTypeInfos = new HashMap<String, NodeTypeInfo>();
public boolean isReferenceable(Node node) throws RepositoryException {
//
for (NodeType nt : node.getMixinNodeTypes()) {
if (nt.getName().equals("mix:referenceable")) {
return true;
}
}
//
PrimaryTypeInfo ntInfo = (PrimaryTypeInfo)getTypeInfo(node.getPrimaryNodeType());
//
return ntInfo.getMixinNames().contains("mix:referenceable");
}
public PrimaryTypeInfo getPrimaryTypeInfo(NodeType primaryType) throws RepositoryException {
return (PrimaryTypeInfo)getTypeInfo(primaryType);
}
public MixinTypeInfo getMixinTypeInfo(NodeType mixinType) throws RepositoryException {
return (MixinTypeInfo)getTypeInfo(mixinType);
}
private NodeTypeInfo getTypeInfo(NodeType nodeType) {
String nodeTypeName = nodeType.getName();
NodeTypeInfo nodeTypeInfo = nodeTypeInfos.get(nodeTypeName);
if (nodeTypeInfo == null) {
// Compute
if (nodeType.isMixin()) {
nodeTypeInfo = new MixinTypeInfo(nodeType);
} else {
Set<NodeTypeInfo> superTypes = new HashSet<NodeTypeInfo>();
for (NodeType superType : nodeType.getSupertypes()) {
NodeTypeInfo superTIs = getTypeInfo(superType);
superTypes.add(superTIs);
}
nodeTypeInfo = new PrimaryTypeInfo(nodeType, Collections.unmodifiableSet(superTypes));
}
// Add
synchronized (nodeTypeInfosLock) {
Map<String, NodeTypeInfo> copy = new HashMap<String, NodeTypeInfo>(nodeTypeInfos);
copy.put(nodeTypeName, nodeTypeInfo);
nodeTypeInfos = copy;
}
}
return nodeTypeInfo;
}
}