]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/acr/AbstractSimpleContentProvider.java
Make DOM ACR more robust when used as repository root.
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / acr / AbstractSimpleContentProvider.java
1 package org.argeo.cms.acr;
2
3 import java.util.Collections;
4 import java.util.Iterator;
5 import java.util.List;
6 import java.util.Map;
7
8 import javax.xml.namespace.QName;
9
10 import org.argeo.api.acr.Content;
11 import org.argeo.api.acr.ContentName;
12 import org.argeo.api.acr.spi.ContentProvider;
13 import org.argeo.api.acr.spi.ProvidedContent;
14 import org.argeo.api.acr.spi.ProvidedSession;
15 import org.argeo.api.cms.CmsConstants;
16
17 /**
18 * Base for simple content providers based on a service supporting only one
19 * namespace. Typically used in higher level applications for domain-specific
20 * modelling.
21 */
22 public abstract class AbstractSimpleContentProvider<SERVICE> implements ContentProvider {
23 private final String namespaceUri;
24 private final String defaultPrefix;
25 private SERVICE service;
26 private String mountPath;
27 private String mountName;
28
29 protected AbstractSimpleContentProvider(String namespaceUri, String defaultPrefix) {
30 this(namespaceUri, defaultPrefix, null, null);
31 }
32
33 protected AbstractSimpleContentProvider(String namespaceUri, String defaultPrefix, SERVICE service,
34 String mountPath) {
35 this.namespaceUri = namespaceUri;
36 this.defaultPrefix = defaultPrefix;
37 this.service = service;
38 setMountPath(mountPath);
39 }
40
41 /** The first level of content provided by the service. */
42 protected abstract Iterator<Content> firstLevel(ProvidedSession session);
43
44 /**
45 * Retrieve the content at this relative path. Root content is already dealt
46 * with.
47 */
48 protected abstract ProvidedContent get(ProvidedSession session, List<String> segments);
49
50 @Override
51 public final ProvidedContent get(ProvidedSession session, String relativePath) {
52 List<String> segments = ContentUtils.toPathSegments(relativePath);
53 if (segments.size() == 0)
54 return new ServiceContent(session);
55 return get(session, segments);
56 }
57
58 public void start(Map<String, String> properties) {
59 mountPath = properties.get(CmsConstants.ACR_MOUNT_PATH);
60 if (mountPath == null)
61 throw new IllegalStateException(CmsConstants.ACR_MOUNT_PATH + " must be specified.");
62 setMountPath(mountPath);
63 }
64
65 private void setMountPath(String mountPath) {
66 if (mountPath == null)
67 return;
68 this.mountPath = mountPath;
69 List<String> mountSegments = ContentUtils.toPathSegments(mountPath);
70 this.mountName = mountSegments.get(mountSegments.size() - 1);
71
72 }
73
74 @Override
75 public String getNamespaceURI(String prefix) {
76 if (defaultPrefix.equals(prefix))
77 return namespaceUri;
78 throw new IllegalArgumentException("Only prefix " + defaultPrefix + " is supported");
79 }
80
81 @Override
82 public Iterator<String> getPrefixes(String namespaceURI) {
83 if (namespaceUri.equals(namespaceURI))
84 return Collections.singletonList(defaultPrefix).iterator();
85 throw new IllegalArgumentException("Only namespace URI " + namespaceUri + " is supported");
86 }
87
88 @Override
89 public String getMountPath() {
90 return mountPath;
91 }
92
93 protected String getMountName() {
94 return mountName;
95 }
96
97 protected SERVICE getService() {
98 return service;
99 }
100
101 public void setService(SERVICE service) {
102 this.service = service;
103 }
104
105 protected class ServiceContent extends AbstractContent {
106
107 public ServiceContent(ProvidedSession session) {
108 super(session);
109 }
110
111 @Override
112 public ContentProvider getProvider() {
113 return AbstractSimpleContentProvider.this;
114 }
115
116 @Override
117 public QName getName() {
118 return new ContentName(getMountName());
119 }
120
121 @Override
122 public Content getParent() {
123 return null;
124 }
125
126 @Override
127 public Iterator<Content> iterator() {
128 return firstLevel(getSession());
129 }
130
131 }
132
133 }