package org.argeo.fm.jcr; import javax.jcr.Node; import javax.jcr.Property; import javax.jcr.RepositoryException; import freemarker.template.SimpleScalar; import freemarker.template.TemplateHashModel; import freemarker.template.TemplateModel; import freemarker.template.TemplateModelException; import freemarker.template.TemplateNodeModel; import freemarker.template.TemplateSequenceModel; public class JcrModel implements TemplateNodeModel, TemplateHashModel { private final Node node; public JcrModel(Node node) { this.node = node; } @Override public TemplateSequenceModel getChildNodes() throws TemplateModelException { try { return new NodeIteratorModel(node.getNodes()); } catch (RepositoryException e) { throw new TemplateModelException("Cannot list children of " + node, e); } } @Override public String getNodeName() throws TemplateModelException { try { return node.getName(); } catch (RepositoryException e) { throw new TemplateModelException("Cannot get name of " + node, e); } } @Override public String getNodeNamespace() throws TemplateModelException { // TODO find out namespace return null; } @Override public String getNodeType() throws TemplateModelException { try { return node.getPrimaryNodeType().getName(); } catch (RepositoryException e) { throw new TemplateModelException("Cannot get node type of " + node, e); } } @Override public TemplateNodeModel getParentNode() throws TemplateModelException { try { Node parent = node.getParent(); if (parent == null) return null; return new JcrModel(parent); } catch (RepositoryException e) { throw new TemplateModelException("Cannot get parent of " + node, e); } } @Override public TemplateModel get(String key) throws TemplateModelException { try { Property property = node.getProperty(key); if (property == null) return null; return new SimpleScalar(property.getString()); } catch (RepositoryException e) { throw new TemplateModelException("Cannot get property " + key + " of " + node, e); } } @Override public boolean isEmpty() throws TemplateModelException { // JCR default properties always accessible return false; } // HASH }