]>
git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.core/src/org/argeo/fm/jcr/JcrModel.java
1 package org
.argeo
.fm
.jcr
;
3 import java
.util
.ArrayList
;
7 import javax
.jcr
.NodeIterator
;
8 import javax
.jcr
.Property
;
9 import javax
.jcr
.PropertyIterator
;
10 import javax
.jcr
.RepositoryException
;
11 import javax
.jcr
.Value
;
13 import freemarker
.template
.SimpleScalar
;
14 import freemarker
.template
.TemplateCollectionModel
;
15 import freemarker
.template
.TemplateHashModel
;
16 import freemarker
.template
.TemplateHashModelEx2
;
17 import freemarker
.template
.TemplateModel
;
18 import freemarker
.template
.TemplateModelException
;
19 import freemarker
.template
.TemplateModelIterator
;
20 import freemarker
.template
.TemplateNodeModel
;
21 import freemarker
.template
.TemplateSequenceModel
;
23 public class JcrModel
implements TemplateNodeModel
, TemplateHashModel
{
24 private final Node node
;
26 public JcrModel(Node node
) {
31 public TemplateSequenceModel
getChildNodes() throws TemplateModelException
{
33 return new NodeIteratorModel(node
.getNodes());
34 } catch (RepositoryException e
) {
35 throw new TemplateModelException("Cannot list children of " + node
, e
);
40 public String
getNodeName() throws TemplateModelException
{
42 return node
.getName();
43 } catch (RepositoryException e
) {
44 throw new TemplateModelException("Cannot get name of " + node
, e
);
49 public String
getNodeNamespace() throws TemplateModelException
{
50 // TODO find out namespace
55 public String
getNodeType() throws TemplateModelException
{
57 return node
.getPrimaryNodeType().getName();
58 } catch (RepositoryException e
) {
59 throw new TemplateModelException("Cannot get node type of " + node
, e
);
64 public TemplateNodeModel
getParentNode() throws TemplateModelException
{
66 Node parent
= node
.getParent();
69 return new JcrModel(parent
);
70 } catch (RepositoryException e
) {
71 throw new TemplateModelException("Cannot get parent of " + node
, e
);
78 public TemplateModel
get(String key
) throws TemplateModelException
{
80 if ("jcr:path".equals(key
))
81 return new SimpleScalar(node
.getPath());
82 if ("jcr:name".equals(key
))
83 return new SimpleScalar(node
.getName());
84 if ("jcr:properties".equals(key
))
85 return new PropertiesModel();
86 if ("jcr:parent".equals(key
))
87 return !"/".equals(node
.getPath()) ?
new JcrModel(node
.getParent()) : null;
89 Property property
= null;
90 if (!node
.hasProperty(key
)) {
91 List
<Property
> props
= new ArrayList
<>();
92 PropertyIterator pit
= node
.getProperties("*:" + key
);
94 props
.add(pit
.nextProperty());
96 throw new TemplateModelException(
97 "Too many properties match " + key
+ " (" + props
+ "), use prefix with \\: escape");
99 property
= props
.get(0);
101 property
= node
.getProperty(key
);
102 if (property
!= null)
103 return propertyValues(property
);
106 if (!node
.hasNode(key
)) {
107 List
<Node
> children
= new ArrayList
<>();
108 NodeIterator nit
= node
.getNodes("*:" + key
);
109 while (nit
.hasNext())
110 children
.add(nit
.nextNode());
111 if (children
.size() > 1)
112 throw new TemplateModelException(
113 "Too many properties match " + key
+ " (" + children
+ "), use prefix with \\: escape");
114 if (!children
.isEmpty())
115 child
= children
.get(0);
117 child
= node
.getNode(key
);
119 return new JcrModel(child
);
122 } catch (RepositoryException e
) {
123 throw new TemplateModelException("Cannot get property " + key
+ " of " + node
, e
);
128 public boolean isEmpty() throws TemplateModelException
{
132 public Node
getNode() {
136 protected TemplateModel
propertyValues(Property property
) throws RepositoryException
{
137 if (!property
.isMultiple())
138 return new SimpleScalar(property
.getString());
139 Value
[] values
= property
.getValues();
140 StringBuilder sb
= new StringBuilder();
141 for (Value value
: values
) {
142 sb
.append(value
.getString()).append('\n');
144 return new SimpleScalar(sb
.toString());
147 class PropertiesModel
implements TemplateHashModelEx2
{
149 public TemplateModel
get(String key
) throws TemplateModelException
{
150 return JcrModel
.this.get(key
);
154 public boolean isEmpty() throws TemplateModelException
{
159 public TemplateCollectionModel
keys() throws TemplateModelException
{
161 PropertyIterator pit
= node
.getProperties();
162 return new TemplateCollectionModel() {
165 public TemplateModelIterator
iterator() throws TemplateModelException
{
166 return new TemplateModelIterator() {
169 public TemplateModel
next() throws TemplateModelException
{
171 return new SimpleScalar(pit
.nextProperty().getName());
172 } catch (RepositoryException e
) {
173 throw new TemplateModelException("Cannot list properties of " + node
, e
);
178 public boolean hasNext() throws TemplateModelException
{
179 return pit
.hasNext();
184 } catch (RepositoryException e
) {
185 throw new TemplateModelException("Cannot list properties of " + node
, e
);
190 public int size() throws TemplateModelException
{
192 PropertyIterator pit
= node
.getProperties();
193 return (int) pit
.getSize();
194 } catch (RepositoryException e
) {
195 throw new TemplateModelException("Cannot list properties of " + node
, e
);
200 public TemplateCollectionModel
values() throws TemplateModelException
{
202 PropertyIterator pit
= node
.getProperties();
203 return new TemplateCollectionModel() {
206 public TemplateModelIterator
iterator() throws TemplateModelException
{
207 return new TemplateModelIterator() {
210 public TemplateModel
next() throws TemplateModelException
{
212 return propertyValues(pit
.nextProperty());
213 } catch (RepositoryException e
) {
214 throw new TemplateModelException("Cannot list properties of " + node
, e
);
219 public boolean hasNext() throws TemplateModelException
{
220 return pit
.hasNext();
225 } catch (RepositoryException e
) {
226 throw new TemplateModelException("Cannot list properties of " + node
, e
);
231 public KeyValuePairIterator
keyValuePairIterator() throws TemplateModelException
{
233 PropertyIterator pit
= node
.getProperties();
234 return new KeyValuePairIterator() {
237 public boolean hasNext() throws TemplateModelException
{
238 return pit
.hasNext();
242 public KeyValuePair
next() throws TemplateModelException
{
243 Property property
= pit
.nextProperty();
244 return new KeyValuePair() {
247 public TemplateModel
getValue() throws TemplateModelException
{
249 return propertyValues(property
);
250 } catch (RepositoryException e
) {
251 throw new TemplateModelException("Cannot list properties of " + node
, e
);
256 public TemplateModel
getKey() throws TemplateModelException
{
258 return new SimpleScalar(property
.getName());
259 } catch (RepositoryException e
) {
260 throw new TemplateModelException("Cannot list properties of " + node
, e
);
266 } catch (RepositoryException e
) {
267 throw new TemplateModelException("Cannot list properties of " + node
, e
);