// ldap
person, user;
+ public final static String ENTITY_NAMESPACE_URI = "http://www.argeo.org/ns/entity";
+ public final static String ENTITY_DEFAULT_PREFIX = "entity";
+
@Override
public String getDefaultPrefix() {
- return "entity";
+ return ENTITY_DEFAULT_PREFIX;
}
-// @Override
-// public String getPrefix() {
-// return getDefaultPrefix();
-// }
-//
-// public static String prefix() {
-// return "entity";
-// }
-
public String basePath() {
return '/' + name();
}
@Override
public String getNamespace() {
- return "http://www.argeo.org/ns/entity";
+ return ENTITY_NAMESPACE_URI;
}
-
-// public static String namespace() {
-// return "http://www.argeo.org/ns/entity";
-// }
-
}
package org.argeo.app.api;
import java.util.List;
+import java.util.Set;
/** Provides optimised access and utilities around terms typologies. */
public interface TermsManager {
Typology getTypology(String typology);
-
+
+ Set<Typology> getTypologies();
+
Term getTerm(String id);
List<Term> listAllTerms(String typology);
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" name="org.argeo.app.termsContentProvider">
+ <implementation class="org.argeo.app.acr.terms.TermsContentProvider"/>
+ <reference bind="setService" cardinality="1..1" interface="org.argeo.app.api.TermsManager" name="TermsManager" policy="static"/>
+ <service>
+ <provide interface="org.argeo.api.acr.spi.ContentProvider"/>
+ </service>
+ <property name="acr.mount.path" type="String" value="/terms"/>
+</scr:component>
Service-Component:\
OSGI-INF/suiteMaintenance.xml,\
+OSGI-INF/termsContentProvider.xml,\
Import-Package:\
tech.units.indriya.unit,\
.,\
OSGI-INF/,\
OSGI-INF/appUserState.xml,\
- OSGI-INF/suiteMaintenance.xml
+ OSGI-INF/suiteMaintenance.xml,\
+ OSGI-INF/termsContentProvider.xml
additional.bundles = org.argeo.init
source.. = src/
output.. = bin/
--- /dev/null
+package org.argeo.app.acr.terms;
+
+import java.util.Iterator;
+
+import javax.xml.namespace.QName;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.NamespaceUtils;
+import org.argeo.api.acr.spi.ContentProvider;
+import org.argeo.api.acr.spi.ProvidedSession;
+import org.argeo.app.api.Term;
+import org.argeo.cms.acr.AbstractContent;
+
+public class TermContent extends AbstractContent {
+ private TermsContentProvider provider;
+ private Term term;
+
+ public TermContent(ProvidedSession session, TermsContentProvider provider, Term term) {
+ super(session);
+ this.provider = provider;
+ this.term = term;
+ }
+
+ @Override
+ public Iterator<Content> iterator() {
+ return term.getSubTerms().stream().map((t) -> (Content) new TermContent(getSession(), provider, t)).iterator();
+ }
+
+ @Override
+ public ContentProvider getProvider() {
+ return provider;
+ }
+
+ @Override
+ public QName getName() {
+ return NamespaceUtils.unqualified(term.getName());
+ }
+
+ @Override
+ public Content getParent() {
+ Term parentTerm = term.getParentTerm();
+ return parentTerm == null ? new TypologyContent(getSession(), provider, term.getTypology())
+ : new TermContent(getSession(), provider, parentTerm);
+ }
+
+}
--- /dev/null
+package org.argeo.app.acr.terms;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.ContentNotFoundException;
+import org.argeo.api.acr.spi.ProvidedContent;
+import org.argeo.api.acr.spi.ProvidedSession;
+import org.argeo.app.api.EntityType;
+import org.argeo.app.api.Term;
+import org.argeo.app.api.TermsManager;
+import org.argeo.app.api.Typology;
+import org.argeo.cms.acr.AbstractSimpleContentProvider;
+import org.argeo.cms.acr.ContentUtils;
+
+public class TermsContentProvider extends AbstractSimpleContentProvider<TermsManager> {
+
+ public TermsContentProvider() {
+ super(EntityType.ENTITY_NAMESPACE_URI, EntityType.ENTITY_DEFAULT_PREFIX);
+ }
+
+ @Override
+ protected Iterator<Content> firstLevel(ProvidedSession session) {
+ return getService().getTypologies().stream().map((t) -> (Content) new TypologyContent(session, this, t))
+ .iterator();
+ }
+
+ @Override
+ public ProvidedContent get(ProvidedSession session, List<String> segments) {
+ String typologyName = segments.get(0);
+ Typology typology = getService().getTypology(typologyName);
+ if (segments.size() == 1)
+ return new TypologyContent(session, this, typology);
+ Term currTerm = null;
+ terms: for (Term term : typology.getSubTerms()) {
+ if (term.getName().equals(segments.get(1))) {
+ currTerm = term;
+ break terms;
+ }
+ }
+ if (currTerm == null)
+ throw new ContentNotFoundException(session,
+ getMountPath() + "/" + ContentUtils.toPath(segments) + " cannot be found");
+ if (segments.size() == 1)
+ return new TermContent(session, this, currTerm);
+
+ for (int i = 2; i < segments.size(); i++) {
+ String termName = segments.get(i);
+ Term nextTerm = null;
+ terms: for (Term term : currTerm.getSubTerms()) {
+ if (term.getName().equals(termName)) {
+ nextTerm = term;
+ break terms;
+ }
+ }
+ if (nextTerm == null)
+ throw new ContentNotFoundException(session,
+ getMountPath() + "/" + ContentUtils.toPath(segments) + " cannot be found");
+ currTerm = nextTerm;
+ }
+ return new TermContent(session, this, currTerm);
+ }
+
+ ServiceContent getRootContent(ProvidedSession session) {
+ return new ServiceContent(session);
+ }
+
+}
--- /dev/null
+package org.argeo.app.acr.terms;
+
+import java.util.Iterator;
+
+import javax.xml.namespace.QName;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.NamespaceUtils;
+import org.argeo.api.acr.spi.ContentProvider;
+import org.argeo.api.acr.spi.ProvidedSession;
+import org.argeo.app.api.Typology;
+import org.argeo.cms.acr.AbstractContent;
+
+public class TypologyContent extends AbstractContent {
+ private TermsContentProvider provider;
+ private Typology typology;
+
+ public TypologyContent(ProvidedSession session, TermsContentProvider provider, Typology typology) {
+ super(session);
+ this.provider = provider;
+ this.typology = typology;
+ }
+
+ @Override
+ public ContentProvider getProvider() {
+ return provider;
+ }
+
+ @Override
+ public QName getName() {
+ return NamespaceUtils.unqualified(typology.getId());
+ }
+
+ @Override
+ public Content getParent() {
+ return provider.getRootContent(getSession());
+ }
+
+ @Override
+ public Iterator<Content> iterator() {
+ return typology.getSubTerms().stream().map((t) -> (Content) new TermContent(getSession(), provider, t))
+ .iterator();
+ }
+
+}
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
import javax.jcr.Node;
+import javax.jcr.NodeIterator;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import org.argeo.app.api.EntityType;
import org.argeo.app.api.Term;
import org.argeo.app.api.TermsManager;
+import org.argeo.app.api.Typology;
import org.argeo.cms.jcr.CmsJcrUtils;
import org.argeo.jcr.Jcr;
import org.argeo.jcr.JcrException;
return t;
}
+ @Override
+ public Set<Typology> getTypologies() {
+ Set<Typology> res = new TreeSet<>((o1, o2) -> o1.getId().compareTo(o2.getId()));
+ NodeIterator termsNodes = Jcr.executeQuery(adminSession, "SELECT * FROM [{0}]", EntityType.terms.get());
+ for (Node termsNode : Jcr.iterate(termsNodes)) {
+ res.add(loadTypology(termsNode));
+ }
+ return res;
+ }
+
SuiteTypology loadTypology(Node termsNode) {
try {
SuiteTypology typology = new SuiteTypology(termsNode);
</service>
<property name="service.ranking" type="Integer" value="-1000"/>
<properties entry="config/termsEntryArea.properties"/>
+ <reference bind="setTermsManager" cardinality="1..1" interface="org.argeo.app.api.TermsManager" name="TermsManager" policy="static"/>
</scr:component>
package org.argeo.app.swt.terms;
import org.argeo.api.acr.Content;
+import org.argeo.api.acr.NamespaceUtils;
+import org.argeo.api.acr.spi.ProvidedContent;
+import org.argeo.api.cms.ux.CmsView;
+import org.argeo.app.api.EntityType;
+import org.argeo.app.api.TermsManager;
+import org.argeo.app.ux.SuiteUxEvent;
+import org.argeo.cms.swt.CmsSwtUtils;
import org.argeo.cms.swt.acr.SwtUiProvider;
-import org.eclipse.swt.SWT;
+import org.argeo.cms.swt.widgets.SwtTreeView;
+import org.argeo.cms.ux.acr.ContentHierarchicalPart;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
/** Entry area for managing the typologies. */
public class TermsEntryArea implements SwtUiProvider {
+ private TermsManager termsManager;
@Override
public Control createUiPart(Composite parent, Content content) {
+// parent.setLayout(new GridLayout());
+// Label lbl = new Label(parent, SWT.NONE);
+// lbl.setText("Typologies");
+//
+// Set<Typology> typologies = termsManager.getTypologies();
+// for (Typology typology : typologies) {
+// new Label(parent, 0).setText(typology.getId());
+// }
+//
+//
+// return lbl;
+ CmsView cmsView = CmsSwtUtils.getCmsView(parent);
+
parent.setLayout(new GridLayout());
- Label lbl = new Label(parent, SWT.NONE);
- lbl.setText("Typologies");
- return lbl;
+ Content rootContent = ((ProvidedContent) content).getSession().getRepository().get().get("/terms");
+
+ ContentHierarchicalPart contentPart = new ContentHierarchicalPart() {
+
+ @Override
+ protected boolean isLeaf(Content content) {
+ if (content.hasContentClass(EntityType.document.qName()))
+ return true;
+ return super.isLeaf(content);
+ }
+
+ };
+ contentPart.addColumn((c) -> NamespaceUtils.toPrefixedName(c.getName()));
+ contentPart.setInput(rootContent);
+
+ SwtTreeView<Content> view = new SwtTreeView<>(parent, 0, contentPart);
+ view.setLayoutData(CmsSwtUtils.fillAll());
+
+ contentPart.setInput(rootContent);
+// contentPart.onSelected((o) -> {
+// Content c = (Content) o;
+//// log.debug(c.getPath());
+// cmsView.sendEvent(SuiteUxEvent.refreshPart.topic(), SuiteUxEvent.eventProperties(c));
+// });
+ return view;
+
+ }
+
+ public void setTermsManager(TermsManager termsManager) {
+ this.termsManager = termsManager;
}
}