From d6c9d33b61e475914d3f8d7534374ed30eca8150 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Tue, 13 Jun 2023 10:28:44 +0200 Subject: [PATCH] Extract JCR in a separate bundle --- Makefile | 2 + .../OSGI-INF/l10n/bundle.properties | 2 - .../OSGI-INF/suiteMaintenance.xml | 5 + org.argeo.app.core/bnd.bnd | 7 +- org.argeo.app.core/build.properties | 3 +- ...anceService.java => SuiteMaintenance.java} | 51 +++----- .../src/org/argeo/app/core/SuiteUtils.java | 89 -------------- .../app/xforms/FormSubmissionListener.java | 5 +- org.argeo.app.jcr/.classpath | 7 ++ org.argeo.app.jcr/.project | 28 +++++ .../OSGI-INF/appUserState.xml | 4 +- .../OSGI-INF/maintenanceService.xml | 2 +- .../OSGI-INF/termsManager.xml | 2 +- org.argeo.app.jcr/bnd.bnd | 11 ++ org.argeo.app.jcr/build.properties | 4 + .../app/jcr}/CustomMaintenanceService.java | 2 +- .../argeo/app/jcr}/JcrEntityDefinition.java | 2 +- .../src/org/argeo/app/jcr/SuiteJcrUtils.java | 114 ++++++++++++++++++ .../src/org/argeo/app/jcr}/XPathUtils.java | 2 +- .../argeo/app/jcr}/docbook/Dbk4Converter.java | 2 +- .../argeo/app/jcr/docbook/DbkJcrUtils.java | 14 +-- .../argeo/app/jcr}/docbook/db4-upgrade.xsl | 0 .../org/argeo/app/jcr/odk/OdkJcrUtils.java | 11 +- .../org/argeo/app/jcr/terms}/SuiteTerm.java | 2 +- .../app/jcr/terms}/SuiteTermsManager.java | 2 +- .../argeo/app/jcr/terms}/SuiteTypology.java | 2 +- .../internal/app/jcr}/AppUserStateImpl.java | 7 +- .../app/jcr/SuiteMaintenanceService.java | 39 ++++++ .../app/servlet/odk/OdkSubmissionServlet.java | 13 +- .../argeo/app/servlet/publish/DbkServlet.java | 4 +- org.argeo.product.knowledge/.classpath | 7 ++ org.argeo.product.knowledge/.project | 33 +++++ .../OSGI-INF/l10n/bundle.properties | 1 + .../OSGI-INF/swtArgeoApp.xml | 14 +++ .../OSGI-INF/termsEntryArea.xml | 2 +- .../OSGI-INF/termsLayer.xml | 0 org.argeo.product.knowledge/bnd.bnd | 9 ++ org.argeo.product.knowledge/build.properties | 5 + .../config/swtArgeoApp.properties | 5 + .../config/termsEntryArea.properties | 0 .../config/termsLayer.properties | 0 sdk/argeo-suite-server.properties | 4 +- .../argeo/app/swt/terms}/TermsEntryArea.java | 14 +-- .../OSGI-INF/l10n/bundle.properties | 2 + swt/org.argeo.app.ui/bnd.bnd | 2 - .../src/org/argeo/app/ui/RecentItems.java | 2 +- .../app/ui/docbook/AbstractDbkViewer.java | 10 +- .../argeo/app/ui/docbook/DbkContextMenu.java | 6 +- .../argeo/app/ui/docbook/DbkImageManager.java | 4 +- .../app/ui/docbook/DbkTextInterpreter.java | 2 +- .../org/argeo/app/ui/docbook/DbkVideo.java | 6 +- .../app/ui/docbook/DocumentTextEditor.java | 4 +- 52 files changed, 374 insertions(+), 196 deletions(-) create mode 100644 org.argeo.app.core/OSGI-INF/suiteMaintenance.xml rename org.argeo.app.core/src/org/argeo/app/core/{SuiteMaintenanceService.java => SuiteMaintenance.java} (51%) create mode 100644 org.argeo.app.jcr/.classpath create mode 100644 org.argeo.app.jcr/.project rename {org.argeo.app.core => org.argeo.app.jcr}/OSGI-INF/appUserState.xml (74%) rename {org.argeo.app.core => org.argeo.app.jcr}/OSGI-INF/maintenanceService.xml (90%) rename {org.argeo.app.core => org.argeo.app.jcr}/OSGI-INF/termsManager.xml (85%) create mode 100644 org.argeo.app.jcr/bnd.bnd create mode 100644 org.argeo.app.jcr/build.properties rename {org.argeo.app.core/src/org/argeo/app/core => org.argeo.app.jcr/src/org/argeo/app/jcr}/CustomMaintenanceService.java (98%) rename {org.argeo.app.core/src/org/argeo/app/core => org.argeo.app.jcr/src/org/argeo/app/jcr}/JcrEntityDefinition.java (98%) create mode 100644 org.argeo.app.jcr/src/org/argeo/app/jcr/SuiteJcrUtils.java rename {org.argeo.app.core/src/org/argeo/app/core => org.argeo.app.jcr/src/org/argeo/app/jcr}/XPathUtils.java (99%) rename {org.argeo.app.core/src/org/argeo/app => org.argeo.app.jcr/src/org/argeo/app/jcr}/docbook/Dbk4Converter.java (99%) rename org.argeo.app.core/src/org/argeo/app/docbook/DbkUtils.java => org.argeo.app.jcr/src/org/argeo/app/jcr/docbook/DbkJcrUtils.java (96%) rename {org.argeo.app.core/src/org/argeo/app => org.argeo.app.jcr/src/org/argeo/app/jcr}/docbook/db4-upgrade.xsl (100%) rename org.argeo.app.core/src/org/argeo/app/odk/OdkUtils.java => org.argeo.app.jcr/src/org/argeo/app/jcr/odk/OdkJcrUtils.java (96%) rename {org.argeo.app.core/src/org/argeo/app/core => org.argeo.app.jcr/src/org/argeo/app/jcr/terms}/SuiteTerm.java (97%) rename {org.argeo.app.core/src/org/argeo/app/core => org.argeo.app.jcr/src/org/argeo/app/jcr/terms}/SuiteTermsManager.java (98%) rename {org.argeo.app.core/src/org/argeo/app/core => org.argeo.app.jcr/src/org/argeo/app/jcr/terms}/SuiteTypology.java (98%) rename {org.argeo.app.core/src/org/argeo/internal/app/core => org.argeo.app.jcr/src/org/argeo/internal/app/jcr}/AppUserStateImpl.java (82%) create mode 100644 org.argeo.app.jcr/src/org/argeo/internal/app/jcr/SuiteMaintenanceService.java create mode 100644 org.argeo.product.knowledge/.classpath create mode 100644 org.argeo.product.knowledge/.project create mode 100644 org.argeo.product.knowledge/OSGI-INF/l10n/bundle.properties create mode 100644 org.argeo.product.knowledge/OSGI-INF/swtArgeoApp.xml rename {swt/org.argeo.app.ui => org.argeo.product.knowledge}/OSGI-INF/termsEntryArea.xml (84%) rename {swt/org.argeo.app.ui => org.argeo.product.knowledge}/OSGI-INF/termsLayer.xml (100%) create mode 100644 org.argeo.product.knowledge/bnd.bnd create mode 100644 org.argeo.product.knowledge/build.properties create mode 100644 org.argeo.product.knowledge/config/swtArgeoApp.properties rename {swt/org.argeo.app.ui => org.argeo.product.knowledge}/config/termsEntryArea.properties (100%) rename {swt/org.argeo.app.ui => org.argeo.product.knowledge}/config/termsLayer.properties (100%) rename swt/{org.argeo.app.ui/src/org/argeo/app/ui => org.argeo.app.swt/src/org/argeo/app/swt/terms}/TermsEntryArea.java (51%) diff --git a/Makefile b/Makefile index b082fcf..4f2a414 100644 --- a/Makefile +++ b/Makefile @@ -12,6 +12,7 @@ A2_CATEGORY = org.argeo.suite BUNDLES = \ org.argeo.app.api \ org.argeo.app.core \ +org.argeo.app.jcr \ org.argeo.app.servlet.odk \ org.argeo.app.servlet.publish \ org.argeo.app.theme.default \ @@ -19,6 +20,7 @@ org.argeo.app.profile.acr.fs \ org.argeo.app.profile.acr.jcr \ swt/org.argeo.app.swt \ swt/org.argeo.app.ui \ +org.argeo.product.knowledge \ DEP_CATEGORIES = \ org.argeo.tp \ diff --git a/org.argeo.app.core/OSGI-INF/l10n/bundle.properties b/org.argeo.app.core/OSGI-INF/l10n/bundle.properties index d4bf08a..2cb3bb2 100644 --- a/org.argeo.app.core/OSGI-INF/l10n/bundle.properties +++ b/org.argeo.app.core/OSGI-INF/l10n/bundle.properties @@ -4,8 +4,6 @@ documents=documents locations=locations recentItems=recent items -appTitle=Argeo Suite - # # PEOPLE # org.argeo.people.ui.PeopleMsg diff --git a/org.argeo.app.core/OSGI-INF/suiteMaintenance.xml b/org.argeo.app.core/OSGI-INF/suiteMaintenance.xml new file mode 100644 index 0000000..d06afa6 --- /dev/null +++ b/org.argeo.app.core/OSGI-INF/suiteMaintenance.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/org.argeo.app.core/bnd.bnd b/org.argeo.app.core/bnd.bnd index dce5772..7a92b9b 100644 --- a/org.argeo.app.core/bnd.bnd +++ b/org.argeo.app.core/bnd.bnd @@ -1,17 +1,12 @@ Bundle-ActivationPolicy: lazy Service-Component:\ -OSGI-INF/termsManager.xml,\ -OSGI-INF/maintenanceService.xml,\ -OSGI-INF/appUserState.xml,\ +OSGI-INF/suiteMaintenance.xml,\ Import-Package:\ tech.units.indriya.unit,\ org.osgi.service.useradmin,\ -javax.jcr.nodetype,\ -javax.jcr.security,\ com.fasterxml.jackson.core,\ -org.apache.jackrabbit.*;version="[1,4)",\ org.argeo.cms.acr,\ * diff --git a/org.argeo.app.core/build.properties b/org.argeo.app.core/build.properties index dc82853..4974d56 100644 --- a/org.argeo.app.core/build.properties +++ b/org.argeo.app.core/build.properties @@ -1,7 +1,8 @@ bin.includes = META-INF/,\ .,\ OSGI-INF/,\ - OSGI-INF/appUserState.xml + OSGI-INF/appUserState.xml,\ + OSGI-INF/suiteMaintenance.xml additional.bundles = org.argeo.init source.. = src/ output.. = bin/ diff --git a/org.argeo.app.core/src/org/argeo/app/core/SuiteMaintenanceService.java b/org.argeo.app.core/src/org/argeo/app/core/SuiteMaintenance.java similarity index 51% rename from org.argeo.app.core/src/org/argeo/app/core/SuiteMaintenanceService.java rename to org.argeo.app.core/src/org/argeo/app/core/SuiteMaintenance.java index 9c74dde..2104145 100644 --- a/org.argeo.app.core/src/org/argeo/app/core/SuiteMaintenanceService.java +++ b/org.argeo.app.core/src/org/argeo/app/core/SuiteMaintenance.java @@ -1,36 +1,29 @@ package org.argeo.app.core; -import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; -import javax.jcr.Node; -import javax.jcr.RepositoryException; -import javax.jcr.Session; -import javax.jcr.nodetype.NodeType; -import javax.jcr.security.Privilege; import javax.measure.Quantity; import javax.measure.quantity.Area; import org.argeo.api.acr.spi.ContentNamespace; -import org.argeo.api.cms.CmsConstants; -import org.argeo.app.api.EntityType; -import org.argeo.jcr.JcrUtils; -import org.argeo.maintenance.AbstractMaintenanceService; +import org.argeo.api.acr.spi.ProvidedRepository; import org.geotools.gml3.v3_2.GML; import si.uom.SI; import tech.units.indriya.quantity.Quantities; -/** Initialises an Argeo Suite backend. */ -public class SuiteMaintenanceService extends AbstractMaintenanceService { - @Override - public void init() { +/** + * Background service starting and stopping with the whole system, and making + * sure it is in a proper state. + */ +public class SuiteMaintenance { + private ProvidedRepository contentRepository; + + public void start() { // make sure that the unit system is initialised Quantity dummy = Quantities.getQuantity(0, SI.SQUARE_METRE); - super.init(); - getContentRepository().registerTypes(SuiteContentNamespace.values()); // for (SuiteContentTypes types : SuiteContentTypes.values()) { // getContentRepository().registerTypes(types.getDefaultPrefix(), types.getNamespace(), @@ -59,27 +52,19 @@ public class SuiteMaintenanceService extends AbstractMaintenanceService { return "gml"; } }); + + } + + public void stop() { + } - @Override - public boolean prepareJcrTree(Session adminSession) throws RepositoryException, IOException { - boolean modified = false; - Node rootNode = adminSession.getRootNode(); - if (!rootNode.hasNode(EntityType.user.name())) { - rootNode.addNode(EntityType.user.name(), NodeType.NT_UNSTRUCTURED); - modified = true; - } - if (modified) - adminSession.save(); - return modified; + protected ProvidedRepository getContentRepository() { + return contentRepository; } - @Override - public void configurePrivileges(Session adminSession) throws RepositoryException { - JcrUtils.addPrivilege(adminSession, EntityType.user.basePath(), CmsConstants.ROLE_USER_ADMIN, - Privilege.JCR_ALL); - // JcrUtils.addPrivilege(adminSession, "/", SuiteRole.coworker.dn(), - // Privilege.JCR_READ); + public void setContentRepository(ProvidedRepository contentRepository) { + this.contentRepository = contentRepository; } } diff --git a/org.argeo.app.core/src/org/argeo/app/core/SuiteUtils.java b/org.argeo.app.core/src/org/argeo/app/core/SuiteUtils.java index f225064..7b614a7 100644 --- a/org.argeo.app.core/src/org/argeo/app/core/SuiteUtils.java +++ b/org.argeo.app.core/src/org/argeo/app/core/SuiteUtils.java @@ -3,24 +3,13 @@ package org.argeo.app.core; import java.util.HashSet; import java.util.Set; -import javax.jcr.Node; -import javax.jcr.NodeIterator; -import javax.jcr.RepositoryException; -import javax.jcr.Session; -import javax.jcr.nodetype.NodeType; -import javax.jcr.security.Privilege; -import javax.security.auth.x500.X500Principal; import javax.xml.namespace.QName; import org.argeo.api.acr.Content; import org.argeo.api.acr.ldap.LdapAttr; import org.argeo.api.acr.ldap.LdapObj; -import org.argeo.api.cms.CmsConstants; -import org.argeo.api.cms.CmsSession; import org.argeo.app.api.EntityType; import org.argeo.cms.RoleNameUtils; -import org.argeo.jcr.JcrException; -import org.argeo.jcr.JcrUtils; /** Utilities around the Argeo Suite APIs. */ public class SuiteUtils { @@ -33,84 +22,6 @@ public class SuiteUtils { return EntityType.user.basePath() + '/' + uid; } - public static Node getOrCreateUserNode(Session adminSession, String userDn) { - try { - Node usersBase = adminSession.getNode(EntityType.user.basePath()); - String uid = RoleNameUtils.getLastRdnValue(userDn); - Node userNode; - if (!usersBase.hasNode(uid)) { - userNode = usersBase.addNode(uid, NodeType.NT_UNSTRUCTURED); - userNode.addMixin(EntityType.user.get()); - userNode.addMixin(NodeType.MIX_CREATED); - userNode.setProperty(LdapAttr.distinguishedName.get(), userDn.toString()); - userNode.setProperty(LdapAttr.uid.get(), uid); - } else { - userNode = usersBase.getNode(uid); - } - - if (!userNode.hasNode(USER_SESSIONS_NODE_NAME)) { - // Migrate existing user node - Node sessionsNode = userNode.addNode(USER_SESSIONS_NODE_NAME, NodeType.NT_UNSTRUCTURED); - oldSessions: for (NodeIterator nit = userNode.getNodes(); nit.hasNext();) { - Node child = nit.nextNode(); - if (USER_SESSIONS_NODE_NAME.equals(child.getName()) || child.getName().startsWith("rep:") - || child.getName().startsWith("jcr:")) - continue oldSessions; - Node target = sessionsNode.addNode(child.getName()); - JcrUtils.copy(child, target); - } - - Node userStateNode = userNode.addNode(USER_STATE_NODE_NAME, NodeType.NT_UNSTRUCTURED); - Node userDevicesNode = userNode.addNode(USER_DEVICES_NODE_NAME, NodeType.NT_UNSTRUCTURED); - - adminSession.save(); -// JackrabbitSecurityUtils.denyPrivilege(adminSession, userNode.getPath(), SuiteRole.coworker.dn(), -// Privilege.JCR_READ); - JcrUtils.addPrivilege(adminSession, userNode.getPath(), new X500Principal(userDn.toString()).getName(), - Privilege.JCR_READ); - JcrUtils.addPrivilege(adminSession, userNode.getPath(), CmsConstants.ROLE_USER_ADMIN, - Privilege.JCR_ALL); - - JcrUtils.addPrivilege(adminSession, userStateNode.getPath(), userDn, Privilege.JCR_ALL); - JcrUtils.addPrivilege(adminSession, userDevicesNode.getPath(), userDn, Privilege.JCR_ALL); - } - return userNode; - } catch (RepositoryException e) { - throw new JcrException("Cannot create user node for " + userDn, e); - } - } - - public static Node getCmsSessionNode(Session session, CmsSession cmsSession) { - try { - return session.getNode(getUserNodePath(cmsSession.getUserDn()) + '/' + USER_SESSIONS_NODE_NAME + '/' - + cmsSession.getUuid().toString()); - } catch (RepositoryException e) { - throw new JcrException("Cannot get session dir for " + cmsSession, e); - } - } - - public static Node getOrCreateCmsSessionNode(Session adminSession, CmsSession cmsSession) { - try { - String userDn = cmsSession.getUserDn(); - Node userNode = getOrCreateUserNode(adminSession, userDn); - Node sessionsNode = userNode.getNode(USER_SESSIONS_NODE_NAME); - String cmsSessionUuid = cmsSession.getUuid().toString(); - Node cmsSessionNode; - if (!sessionsNode.hasNode(cmsSessionUuid)) { - cmsSessionNode = sessionsNode.addNode(cmsSessionUuid, NodeType.NT_UNSTRUCTURED); - cmsSessionNode.addMixin(NodeType.MIX_CREATED); - adminSession.save(); - JcrUtils.addPrivilege(adminSession, cmsSessionNode.getPath(), cmsSession.getUserRole(), - Privilege.JCR_ALL); - } else { - cmsSessionNode = sessionsNode.getNode(cmsSessionUuid); - } - return cmsSessionNode; - } catch (RepositoryException e) { - throw new JcrException("Cannot create session dir for " + cmsSession, e); - } - } - public static Set extractRoles(String[] semiColArr) { Set res = new HashSet<>(); // TODO factorize and make it more robust diff --git a/org.argeo.app.core/src/org/argeo/app/xforms/FormSubmissionListener.java b/org.argeo.app.core/src/org/argeo/app/xforms/FormSubmissionListener.java index 0dff64c..6fee2f9 100644 --- a/org.argeo.app.core/src/org/argeo/app/xforms/FormSubmissionListener.java +++ b/org.argeo.app.core/src/org/argeo/app/xforms/FormSubmissionListener.java @@ -1,7 +1,6 @@ package org.argeo.app.xforms; -import javax.jcr.Node; -import javax.jcr.RepositoryException; +import org.argeo.api.acr.Content; /** Called when a user has received a new form submission. */ public interface FormSubmissionListener { @@ -9,5 +8,5 @@ public interface FormSubmissionListener { * Called after a form submission has been stored in the user area. The * submission will be deleted if any exception is thrown. */ - void formSubmissionReceived(Node node) throws RepositoryException; + void formSubmissionReceived(Content content); } diff --git a/org.argeo.app.jcr/.classpath b/org.argeo.app.jcr/.classpath new file mode 100644 index 0000000..81fe078 --- /dev/null +++ b/org.argeo.app.jcr/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/org.argeo.app.jcr/.project b/org.argeo.app.jcr/.project new file mode 100644 index 0000000..f688a62 --- /dev/null +++ b/org.argeo.app.jcr/.project @@ -0,0 +1,28 @@ + + + org.argeo.app.jcr + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/org.argeo.app.core/OSGI-INF/appUserState.xml b/org.argeo.app.jcr/OSGI-INF/appUserState.xml similarity index 74% rename from org.argeo.app.core/OSGI-INF/appUserState.xml rename to org.argeo.app.jcr/OSGI-INF/appUserState.xml index 82c3ec0..5dc205e 100644 --- a/org.argeo.app.core/OSGI-INF/appUserState.xml +++ b/org.argeo.app.jcr/OSGI-INF/appUserState.xml @@ -1,6 +1,6 @@ - - + + diff --git a/org.argeo.app.core/OSGI-INF/maintenanceService.xml b/org.argeo.app.jcr/OSGI-INF/maintenanceService.xml similarity index 90% rename from org.argeo.app.core/OSGI-INF/maintenanceService.xml rename to org.argeo.app.jcr/OSGI-INF/maintenanceService.xml index 965d82b..7167ff6 100644 --- a/org.argeo.app.core/OSGI-INF/maintenanceService.xml +++ b/org.argeo.app.jcr/OSGI-INF/maintenanceService.xml @@ -1,6 +1,6 @@ - + diff --git a/org.argeo.app.core/OSGI-INF/termsManager.xml b/org.argeo.app.jcr/OSGI-INF/termsManager.xml similarity index 85% rename from org.argeo.app.core/OSGI-INF/termsManager.xml rename to org.argeo.app.jcr/OSGI-INF/termsManager.xml index 797c5a3..e6a2abd 100644 --- a/org.argeo.app.core/OSGI-INF/termsManager.xml +++ b/org.argeo.app.jcr/OSGI-INF/termsManager.xml @@ -1,6 +1,6 @@ - + diff --git a/org.argeo.app.jcr/bnd.bnd b/org.argeo.app.jcr/bnd.bnd new file mode 100644 index 0000000..b190cf4 --- /dev/null +++ b/org.argeo.app.jcr/bnd.bnd @@ -0,0 +1,11 @@ +Service-Component:\ +OSGI-INF/termsManager.xml,\ +OSGI-INF/maintenanceService.xml,\ +OSGI-INF/appUserState.xml,\ + +Import-Package:\ +javax.jcr.nodetype,\ +javax.jcr.security,\ +org.apache.jackrabbit.*;version="[1,4)",\ +org.argeo.cms.acr,\ +* \ No newline at end of file diff --git a/org.argeo.app.jcr/build.properties b/org.argeo.app.jcr/build.properties new file mode 100644 index 0000000..34d2e4d --- /dev/null +++ b/org.argeo.app.jcr/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/org.argeo.app.core/src/org/argeo/app/core/CustomMaintenanceService.java b/org.argeo.app.jcr/src/org/argeo/app/jcr/CustomMaintenanceService.java similarity index 98% rename from org.argeo.app.core/src/org/argeo/app/core/CustomMaintenanceService.java rename to org.argeo.app.jcr/src/org/argeo/app/jcr/CustomMaintenanceService.java index a4b1fff..9bb72de 100644 --- a/org.argeo.app.core/src/org/argeo/app/core/CustomMaintenanceService.java +++ b/org.argeo.app.jcr/src/org/argeo/app/jcr/CustomMaintenanceService.java @@ -1,4 +1,4 @@ -package org.argeo.app.core; +package org.argeo.app.jcr; import java.io.IOException; import java.io.InputStream; diff --git a/org.argeo.app.core/src/org/argeo/app/core/JcrEntityDefinition.java b/org.argeo.app.jcr/src/org/argeo/app/jcr/JcrEntityDefinition.java similarity index 98% rename from org.argeo.app.core/src/org/argeo/app/core/JcrEntityDefinition.java rename to org.argeo.app.jcr/src/org/argeo/app/jcr/JcrEntityDefinition.java index 10c27a8..e76315c 100644 --- a/org.argeo.app.core/src/org/argeo/app/core/JcrEntityDefinition.java +++ b/org.argeo.app.jcr/src/org/argeo/app/jcr/JcrEntityDefinition.java @@ -1,4 +1,4 @@ -package org.argeo.app.core; +package org.argeo.app.jcr; import java.util.Map; diff --git a/org.argeo.app.jcr/src/org/argeo/app/jcr/SuiteJcrUtils.java b/org.argeo.app.jcr/src/org/argeo/app/jcr/SuiteJcrUtils.java new file mode 100644 index 0000000..49b7ede --- /dev/null +++ b/org.argeo.app.jcr/src/org/argeo/app/jcr/SuiteJcrUtils.java @@ -0,0 +1,114 @@ +package org.argeo.app.jcr; + +import static org.argeo.app.core.SuiteUtils.USER_DEVICES_NODE_NAME; +import static org.argeo.app.core.SuiteUtils.USER_SESSIONS_NODE_NAME; +import static org.argeo.app.core.SuiteUtils.USER_STATE_NODE_NAME; + +import javax.jcr.Node; +import javax.jcr.NodeIterator; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.nodetype.NodeType; +import javax.jcr.security.Privilege; +import javax.security.auth.x500.X500Principal; + +import org.argeo.api.acr.ldap.LdapAttr; +import org.argeo.api.cms.CmsConstants; +import org.argeo.api.cms.CmsSession; +import org.argeo.app.api.AppUserState; +import org.argeo.app.api.EntityType; +import org.argeo.app.core.SuiteUtils; +import org.argeo.cms.RoleNameUtils; +import org.argeo.jcr.JcrException; +import org.argeo.jcr.JcrUtils; + +/** JCR utilities. */ +public class SuiteJcrUtils { + /** @deprecated Use {@link AppUserState} instead. */ + @Deprecated + public static Node getOrCreateUserNode(Session adminSession, String userDn) { + try { + Node usersBase = adminSession.getNode(EntityType.user.basePath()); + String uid = RoleNameUtils.getLastRdnValue(userDn); + Node userNode; + if (!usersBase.hasNode(uid)) { + userNode = usersBase.addNode(uid, NodeType.NT_UNSTRUCTURED); + userNode.addMixin(EntityType.user.get()); + userNode.addMixin(NodeType.MIX_CREATED); + userNode.setProperty(LdapAttr.distinguishedName.get(), userDn.toString()); + userNode.setProperty(LdapAttr.uid.get(), uid); + } else { + userNode = usersBase.getNode(uid); + } + + if (!userNode.hasNode(USER_SESSIONS_NODE_NAME)) { + // Migrate existing user node + Node sessionsNode = userNode.addNode(USER_SESSIONS_NODE_NAME, NodeType.NT_UNSTRUCTURED); + oldSessions: for (NodeIterator nit = userNode.getNodes(); nit.hasNext();) { + Node child = nit.nextNode(); + if (USER_SESSIONS_NODE_NAME.equals(child.getName()) || child.getName().startsWith("rep:") + || child.getName().startsWith("jcr:")) + continue oldSessions; + Node target = sessionsNode.addNode(child.getName()); + JcrUtils.copy(child, target); + } + + Node userStateNode = userNode.addNode(USER_STATE_NODE_NAME, NodeType.NT_UNSTRUCTURED); + Node userDevicesNode = userNode.addNode(USER_DEVICES_NODE_NAME, NodeType.NT_UNSTRUCTURED); + + adminSession.save(); +// JackrabbitSecurityUtils.denyPrivilege(adminSession, userNode.getPath(), SuiteRole.coworker.dn(), +// Privilege.JCR_READ); + JcrUtils.addPrivilege(adminSession, userNode.getPath(), new X500Principal(userDn.toString()).getName(), + Privilege.JCR_READ); + JcrUtils.addPrivilege(adminSession, userNode.getPath(), CmsConstants.ROLE_USER_ADMIN, + Privilege.JCR_ALL); + + JcrUtils.addPrivilege(adminSession, userStateNode.getPath(), userDn, Privilege.JCR_ALL); + JcrUtils.addPrivilege(adminSession, userDevicesNode.getPath(), userDn, Privilege.JCR_ALL); + } + return userNode; + } catch (RepositoryException e) { + throw new JcrException("Cannot create user node for " + userDn, e); + } + } + + /** @deprecated Use {@link AppUserState} instead. */ + @Deprecated + public static Node getCmsSessionNode(Session session, CmsSession cmsSession) { + try { + return session.getNode(SuiteUtils.getUserNodePath(cmsSession.getUserDn()) + '/' + USER_SESSIONS_NODE_NAME + '/' + + cmsSession.getUuid().toString()); + } catch (RepositoryException e) { + throw new JcrException("Cannot get session dir for " + cmsSession, e); + } + } + + /** @deprecated Use {@link AppUserState} instead. */ + @Deprecated + public static Node getOrCreateCmsSessionNode(Session adminSession, CmsSession cmsSession) { + try { + String userDn = cmsSession.getUserDn(); + Node userNode = getOrCreateUserNode(adminSession, userDn); + Node sessionsNode = userNode.getNode(USER_SESSIONS_NODE_NAME); + String cmsSessionUuid = cmsSession.getUuid().toString(); + Node cmsSessionNode; + if (!sessionsNode.hasNode(cmsSessionUuid)) { + cmsSessionNode = sessionsNode.addNode(cmsSessionUuid, NodeType.NT_UNSTRUCTURED); + cmsSessionNode.addMixin(NodeType.MIX_CREATED); + adminSession.save(); + JcrUtils.addPrivilege(adminSession, cmsSessionNode.getPath(), cmsSession.getUserRole(), + Privilege.JCR_ALL); + } else { + cmsSessionNode = sessionsNode.getNode(cmsSessionUuid); + } + return cmsSessionNode; + } catch (RepositoryException e) { + throw new JcrException("Cannot create session dir for " + cmsSession, e); + } + } + + /** singleton */ + private SuiteJcrUtils() { + } +} diff --git a/org.argeo.app.core/src/org/argeo/app/core/XPathUtils.java b/org.argeo.app.jcr/src/org/argeo/app/jcr/XPathUtils.java similarity index 99% rename from org.argeo.app.core/src/org/argeo/app/core/XPathUtils.java rename to org.argeo.app.jcr/src/org/argeo/app/jcr/XPathUtils.java index b0678cd..2c3babe 100644 --- a/org.argeo.app.core/src/org/argeo/app/core/XPathUtils.java +++ b/org.argeo.app.jcr/src/org/argeo/app/jcr/XPathUtils.java @@ -1,4 +1,4 @@ -package org.argeo.app.core; +package org.argeo.app.jcr; import java.text.DateFormat; import java.text.SimpleDateFormat; diff --git a/org.argeo.app.core/src/org/argeo/app/docbook/Dbk4Converter.java b/org.argeo.app.jcr/src/org/argeo/app/jcr/docbook/Dbk4Converter.java similarity index 99% rename from org.argeo.app.core/src/org/argeo/app/docbook/Dbk4Converter.java rename to org.argeo.app.jcr/src/org/argeo/app/jcr/docbook/Dbk4Converter.java index f213c02..60f2928 100644 --- a/org.argeo.app.core/src/org/argeo/app/docbook/Dbk4Converter.java +++ b/org.argeo.app.jcr/src/org/argeo/app/jcr/docbook/Dbk4Converter.java @@ -1,4 +1,4 @@ -package org.argeo.app.docbook; +package org.argeo.app.jcr.docbook; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; diff --git a/org.argeo.app.core/src/org/argeo/app/docbook/DbkUtils.java b/org.argeo.app.jcr/src/org/argeo/app/jcr/docbook/DbkJcrUtils.java similarity index 96% rename from org.argeo.app.core/src/org/argeo/app/docbook/DbkUtils.java rename to org.argeo.app.jcr/src/org/argeo/app/jcr/docbook/DbkJcrUtils.java index b0d352b..4454905 100644 --- a/org.argeo.app.core/src/org/argeo/app/docbook/DbkUtils.java +++ b/org.argeo.app.jcr/src/org/argeo/app/jcr/docbook/DbkJcrUtils.java @@ -1,4 +1,4 @@ -package org.argeo.app.docbook; +package org.argeo.app.jcr.docbook; import static org.argeo.app.docbook.DbkType.para; @@ -11,20 +11,20 @@ import java.nio.file.Path; import javax.jcr.ImportUUIDBehavior; import javax.jcr.Node; import javax.jcr.NodeIterator; -import javax.jcr.PathNotFoundException; import javax.jcr.RepositoryException; -import javax.jcr.ValueFormatException; import org.argeo.api.cms.CmsLog; import org.argeo.app.api.EntityType; +import org.argeo.app.docbook.DbkAttr; +import org.argeo.app.docbook.DbkType; import org.argeo.jcr.Jcr; import org.argeo.jcr.JcrException; import org.argeo.jcr.JcrUtils; import org.argeo.jcr.JcrxApi; -/** Utilities around DocBook. */ -public class DbkUtils { - private final static CmsLog log = CmsLog.getLog(DbkUtils.class); +/** JCR utilities around DocBook. */ +public class DbkJcrUtils { + private final static CmsLog log = CmsLog.getLog(DbkJcrUtils.class); /** Get or add a DocBook element. */ public static Node getOrAddDbk(Node parent, DbkType child) { @@ -247,7 +247,7 @@ public class DbkUtils { } /** Singleton. */ - private DbkUtils() { + private DbkJcrUtils() { } } diff --git a/org.argeo.app.core/src/org/argeo/app/docbook/db4-upgrade.xsl b/org.argeo.app.jcr/src/org/argeo/app/jcr/docbook/db4-upgrade.xsl similarity index 100% rename from org.argeo.app.core/src/org/argeo/app/docbook/db4-upgrade.xsl rename to org.argeo.app.jcr/src/org/argeo/app/jcr/docbook/db4-upgrade.xsl diff --git a/org.argeo.app.core/src/org/argeo/app/odk/OdkUtils.java b/org.argeo.app.jcr/src/org/argeo/app/jcr/odk/OdkJcrUtils.java similarity index 96% rename from org.argeo.app.core/src/org/argeo/app/odk/OdkUtils.java rename to org.argeo.app.jcr/src/org/argeo/app/jcr/odk/OdkJcrUtils.java index 4d2f521..881523f 100644 --- a/org.argeo.app.core/src/org/argeo/app/odk/OdkUtils.java +++ b/org.argeo.app.jcr/src/org/argeo/app/jcr/odk/OdkJcrUtils.java @@ -1,4 +1,4 @@ -package org.argeo.app.odk; +package org.argeo.app.jcr.odk; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -18,14 +18,17 @@ import javax.jcr.nodetype.NodeType; import org.argeo.api.cms.CmsLog; import org.argeo.app.api.EntityMimeType; import org.argeo.app.api.EntityType; +import org.argeo.app.odk.OdkNames; +import org.argeo.app.odk.OrxListName; +import org.argeo.app.odk.OrxManifestName; import org.argeo.cms.util.DigestUtils; import org.argeo.jcr.Jcr; import org.argeo.jcr.JcrUtils; import org.argeo.jcr.JcrxApi; /** Utilities around ODK. */ -public class OdkUtils { - private final static CmsLog log = CmsLog.getLog(OdkUtils.class); +public class OdkJcrUtils { + private final static CmsLog log = CmsLog.getLog(OdkJcrUtils.class); public static Node loadOdkForm(Node formBase, String name, InputStream in, InputStream... additionalNodes) throws RepositoryException, IOException { @@ -186,7 +189,7 @@ public class OdkUtils { } /** Singleton. */ - private OdkUtils() { + private OdkJcrUtils() { } diff --git a/org.argeo.app.core/src/org/argeo/app/core/SuiteTerm.java b/org.argeo.app.jcr/src/org/argeo/app/jcr/terms/SuiteTerm.java similarity index 97% rename from org.argeo.app.core/src/org/argeo/app/core/SuiteTerm.java rename to org.argeo.app.jcr/src/org/argeo/app/jcr/terms/SuiteTerm.java index aef23b5..db4e4a6 100644 --- a/org.argeo.app.core/src/org/argeo/app/core/SuiteTerm.java +++ b/org.argeo.app.jcr/src/org/argeo/app/jcr/terms/SuiteTerm.java @@ -1,4 +1,4 @@ -package org.argeo.app.core; +package org.argeo.app.jcr.terms; import java.util.ArrayList; import java.util.List; diff --git a/org.argeo.app.core/src/org/argeo/app/core/SuiteTermsManager.java b/org.argeo.app.jcr/src/org/argeo/app/jcr/terms/SuiteTermsManager.java similarity index 98% rename from org.argeo.app.core/src/org/argeo/app/core/SuiteTermsManager.java rename to org.argeo.app.jcr/src/org/argeo/app/jcr/terms/SuiteTermsManager.java index c14f871..6327a55 100644 --- a/org.argeo.app.core/src/org/argeo/app/core/SuiteTermsManager.java +++ b/org.argeo.app.jcr/src/org/argeo/app/jcr/terms/SuiteTermsManager.java @@ -1,4 +1,4 @@ -package org.argeo.app.core; +package org.argeo.app.jcr.terms; import java.util.ArrayList; import java.util.HashMap; diff --git a/org.argeo.app.core/src/org/argeo/app/core/SuiteTypology.java b/org.argeo.app.jcr/src/org/argeo/app/jcr/terms/SuiteTypology.java similarity index 98% rename from org.argeo.app.core/src/org/argeo/app/core/SuiteTypology.java rename to org.argeo.app.jcr/src/org/argeo/app/jcr/terms/SuiteTypology.java index 7838274..0040abb 100644 --- a/org.argeo.app.core/src/org/argeo/app/core/SuiteTypology.java +++ b/org.argeo.app.jcr/src/org/argeo/app/jcr/terms/SuiteTypology.java @@ -1,4 +1,4 @@ -package org.argeo.app.core; +package org.argeo.app.jcr.terms; import java.util.ArrayList; import java.util.List; diff --git a/org.argeo.app.core/src/org/argeo/internal/app/core/AppUserStateImpl.java b/org.argeo.app.jcr/src/org/argeo/internal/app/jcr/AppUserStateImpl.java similarity index 82% rename from org.argeo.app.core/src/org/argeo/internal/app/core/AppUserStateImpl.java rename to org.argeo.app.jcr/src/org/argeo/internal/app/jcr/AppUserStateImpl.java index b7201a1..faf217a 100644 --- a/org.argeo.app.core/src/org/argeo/internal/app/core/AppUserStateImpl.java +++ b/org.argeo.app.jcr/src/org/argeo/internal/app/jcr/AppUserStateImpl.java @@ -1,4 +1,4 @@ -package org.argeo.internal.app.core; +package org.argeo.internal.app.jcr; import javax.jcr.Node; @@ -7,7 +7,7 @@ import org.argeo.api.acr.ContentSession; import org.argeo.api.cms.CmsConstants; import org.argeo.api.cms.CmsSession; import org.argeo.app.api.AppUserState; -import org.argeo.app.core.SuiteUtils; +import org.argeo.app.jcr.SuiteJcrUtils; import org.argeo.cms.acr.ContentUtils; import org.argeo.cms.jcr.acr.JcrContentProvider; import org.argeo.jcr.Jcr; @@ -15,10 +15,11 @@ import org.argeo.jcr.Jcr; public class AppUserStateImpl implements AppUserState { private JcrContentProvider jcrContentProvider; + @SuppressWarnings("deprecation") @Override public Content getOrCreateSessionDir(ContentSession contentSession, CmsSession session) { Node userDirNode = jcrContentProvider.doInAdminSession((adminSession) -> { - Node node = SuiteUtils.getOrCreateCmsSessionNode(adminSession, session); + Node node = SuiteJcrUtils.getOrCreateCmsSessionNode(adminSession, session); return node; }); Content userDir = contentSession diff --git a/org.argeo.app.jcr/src/org/argeo/internal/app/jcr/SuiteMaintenanceService.java b/org.argeo.app.jcr/src/org/argeo/internal/app/jcr/SuiteMaintenanceService.java new file mode 100644 index 0000000..ceeb4f5 --- /dev/null +++ b/org.argeo.app.jcr/src/org/argeo/internal/app/jcr/SuiteMaintenanceService.java @@ -0,0 +1,39 @@ +package org.argeo.internal.app.jcr; + +import java.io.IOException; + +import javax.jcr.Node; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.nodetype.NodeType; +import javax.jcr.security.Privilege; + +import org.argeo.api.cms.CmsConstants; +import org.argeo.app.api.EntityType; +import org.argeo.jcr.JcrUtils; +import org.argeo.maintenance.AbstractMaintenanceService; + +/** Initialises JCR in an Argeo Suite backend. */ +public class SuiteMaintenanceService extends AbstractMaintenanceService { + @Override + public boolean prepareJcrTree(Session adminSession) throws RepositoryException, IOException { + boolean modified = false; + Node rootNode = adminSession.getRootNode(); + if (!rootNode.hasNode(EntityType.user.name())) { + rootNode.addNode(EntityType.user.name(), NodeType.NT_UNSTRUCTURED); + modified = true; + } + if (modified) + adminSession.save(); + return modified; + } + + @Override + public void configurePrivileges(Session adminSession) throws RepositoryException { + JcrUtils.addPrivilege(adminSession, EntityType.user.basePath(), CmsConstants.ROLE_USER_ADMIN, + Privilege.JCR_ALL); + // JcrUtils.addPrivilege(adminSession, "/", SuiteRole.coworker.dn(), + // Privilege.JCR_READ); + } + +} diff --git a/org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkSubmissionServlet.java b/org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkSubmissionServlet.java index 9392587..3740805 100644 --- a/org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkSubmissionServlet.java +++ b/org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkSubmissionServlet.java @@ -24,13 +24,14 @@ import javax.servlet.http.Part; import org.argeo.api.cms.CmsLog; import org.argeo.api.cms.CmsSession; -import org.argeo.app.core.SuiteUtils; import org.argeo.app.image.ImageProcessor; +import org.argeo.app.jcr.SuiteJcrUtils; import org.argeo.app.odk.OrxType; import org.argeo.app.xforms.FormSubmissionListener; import org.argeo.cms.auth.RemoteAuthRequest; import org.argeo.cms.auth.RemoteAuthUtils; import org.argeo.cms.jcr.CmsJcrUtils; +import org.argeo.cms.jcr.acr.JcrContent; import org.argeo.cms.servlet.ServletHttpRequest; import org.argeo.jcr.Jcr; import org.argeo.jcr.JcrUtils; @@ -54,9 +55,9 @@ public class OdkSubmissionServlet extends HttpServlet { resp.setContentType("text/xml; charset=utf-8"); resp.setHeader("X-OpenRosa-Version", "1.0"); resp.setDateHeader("Date", System.currentTimeMillis()); - + // should be set in HEAD? Let's rather use defaults. - //resp.setIntHeader("X-OpenRosa-Accept-Content-Length", 1024 * 1024); + // resp.setIntHeader("X-OpenRosa-Accept-Content-Length", 1024 * 1024); RemoteAuthRequest request = new ServletHttpRequest(req); Session session = RemoteAuthUtils.doAs(() -> Jcr.login(repository, null), request); @@ -67,13 +68,13 @@ public class OdkSubmissionServlet extends HttpServlet { try { // TODO centralise at a deeper level adminSession = CmsJcrUtils.openDataAdminSession(repository, null); - SuiteUtils.getOrCreateCmsSessionNode(adminSession, cmsSession); + SuiteJcrUtils.getOrCreateCmsSessionNode(adminSession, cmsSession); } finally { Jcr.logout(adminSession); } try { - Node cmsSessionNode = SuiteUtils.getCmsSessionNode(session, cmsSession); + Node cmsSessionNode = SuiteJcrUtils.getCmsSessionNode(session, cmsSession); Node submission = cmsSessionNode.addNode(submissionNameFormatter.format(Instant.now()), OrxType.submission.get()); for (Part part : req.getParts()) { @@ -117,7 +118,7 @@ public class OdkSubmissionServlet extends HttpServlet { session.save(); try { for (FormSubmissionListener submissionListener : submissionListeners) { - submissionListener.formSubmissionReceived(submission); + submissionListener.formSubmissionReceived(JcrContent.nodeToContent(submission)); } } catch (Exception e) { log.error("Cannot save submision, cancelling...", e); diff --git a/org.argeo.app.servlet.publish/src/org/argeo/app/servlet/publish/DbkServlet.java b/org.argeo.app.servlet.publish/src/org/argeo/app/servlet/publish/DbkServlet.java index 152df6e..246a0c2 100644 --- a/org.argeo.app.servlet.publish/src/org/argeo/app/servlet/publish/DbkServlet.java +++ b/org.argeo.app.servlet.publish/src/org/argeo/app/servlet/publish/DbkServlet.java @@ -45,7 +45,7 @@ import org.apache.fop.apps.FopFactory; import org.argeo.api.cms.CmsLog; import org.argeo.api.cms.ux.CmsTheme; import org.argeo.app.docbook.DbkType; -import org.argeo.app.docbook.DbkUtils; +import org.argeo.app.jcr.docbook.DbkJcrUtils; import org.argeo.cms.auth.RemoteAuthUtils; import org.argeo.cms.servlet.ServletHttpRequest; import org.argeo.jcr.Jcr; @@ -116,7 +116,7 @@ public class DbkServlet extends HttpServlet { if (node.hasNode(DbkType.article.get())) { Node dbkNode = node.getNode(DbkType.article.get()); - if (DbkUtils.isDbk(dbkNode)) { + if (DbkJcrUtils.isDbk(dbkNode)) { CmsTheme cmsTheme = null; String themeId = req.getParameter("themeId"); if (themeId != null) { diff --git a/org.argeo.product.knowledge/.classpath b/org.argeo.product.knowledge/.classpath new file mode 100644 index 0000000..81fe078 --- /dev/null +++ b/org.argeo.product.knowledge/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/org.argeo.product.knowledge/.project b/org.argeo.product.knowledge/.project new file mode 100644 index 0000000..54f9ad4 --- /dev/null +++ b/org.argeo.product.knowledge/.project @@ -0,0 +1,33 @@ + + + org.argeo.product.knowledge + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + org.eclipse.pde.ds.core.builder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/org.argeo.product.knowledge/OSGI-INF/l10n/bundle.properties b/org.argeo.product.knowledge/OSGI-INF/l10n/bundle.properties new file mode 100644 index 0000000..a750a7a --- /dev/null +++ b/org.argeo.product.knowledge/OSGI-INF/l10n/bundle.properties @@ -0,0 +1 @@ +appTitle=Argeo Knowledge diff --git a/org.argeo.product.knowledge/OSGI-INF/swtArgeoApp.xml b/org.argeo.product.knowledge/OSGI-INF/swtArgeoApp.xml new file mode 100644 index 0000000..ad18dd9 --- /dev/null +++ b/org.argeo.product.knowledge/OSGI-INF/swtArgeoApp.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/swt/org.argeo.app.ui/OSGI-INF/termsEntryArea.xml b/org.argeo.product.knowledge/OSGI-INF/termsEntryArea.xml similarity index 84% rename from swt/org.argeo.app.ui/OSGI-INF/termsEntryArea.xml rename to org.argeo.product.knowledge/OSGI-INF/termsEntryArea.xml index 6387f1a..e241b11 100644 --- a/swt/org.argeo.app.ui/OSGI-INF/termsEntryArea.xml +++ b/org.argeo.product.knowledge/OSGI-INF/termsEntryArea.xml @@ -1,6 +1,6 @@ - + diff --git a/swt/org.argeo.app.ui/OSGI-INF/termsLayer.xml b/org.argeo.product.knowledge/OSGI-INF/termsLayer.xml similarity index 100% rename from swt/org.argeo.app.ui/OSGI-INF/termsLayer.xml rename to org.argeo.product.knowledge/OSGI-INF/termsLayer.xml diff --git a/org.argeo.product.knowledge/bnd.bnd b/org.argeo.product.knowledge/bnd.bnd new file mode 100644 index 0000000..d942709 --- /dev/null +++ b/org.argeo.product.knowledge/bnd.bnd @@ -0,0 +1,9 @@ +Service-Component:\ +OSGI-INF/swtArgeoApp.xml,\ +OSGI-INF/termsEntryArea.xml,\ +OSGI-INF/termsLayer.xml,\ + +Import-Package:\ +org.argeo.app.swt.ux,\ +org.argeo.app.swt.terms,\ +* \ No newline at end of file diff --git a/org.argeo.product.knowledge/build.properties b/org.argeo.product.knowledge/build.properties new file mode 100644 index 0000000..fde2b82 --- /dev/null +++ b/org.argeo.product.knowledge/build.properties @@ -0,0 +1,5 @@ +bin.includes = META-INF/,\ + .,\ + OSGI-INF/swtArgeoApp.xml +source.. = src/ +output.. = bin/ diff --git a/org.argeo.product.knowledge/config/swtArgeoApp.properties b/org.argeo.product.knowledge/config/swtArgeoApp.properties new file mode 100644 index 0000000..96e1d31 --- /dev/null +++ b/org.argeo.product.knowledge/config/swtArgeoApp.properties @@ -0,0 +1,5 @@ +service.pid=argeo.product.knowledge.swtArgeoApp + +event.topics=argeo/suite/* + +argeo.cms.app.contextName=argeo/knowledge \ No newline at end of file diff --git a/swt/org.argeo.app.ui/config/termsEntryArea.properties b/org.argeo.product.knowledge/config/termsEntryArea.properties similarity index 100% rename from swt/org.argeo.app.ui/config/termsEntryArea.properties rename to org.argeo.product.knowledge/config/termsEntryArea.properties diff --git a/swt/org.argeo.app.ui/config/termsLayer.properties b/org.argeo.product.knowledge/config/termsLayer.properties similarity index 100% rename from swt/org.argeo.app.ui/config/termsLayer.properties rename to org.argeo.product.knowledge/config/termsLayer.properties diff --git a/sdk/argeo-suite-server.properties b/sdk/argeo-suite-server.properties index 82576bf..6407f79 100644 --- a/sdk/argeo-suite-server.properties +++ b/sdk/argeo-suite-server.properties @@ -19,10 +19,12 @@ org.argeo.cms.jcr argeo.osgi.start.5=\ org.argeo.app.profile.acr.fs,\ org.argeo.app.core,\ +org.argeo.app.jcr,\ org.argeo.app.ui,\ org.argeo.app.theme.default,\ org.argeo.app.servlet.publish,\ -org.argeo.app.servlet.odk +org.argeo.app.servlet.odk,\ +org.argeo.product.knowledge,\ # Local diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/TermsEntryArea.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/terms/TermsEntryArea.java similarity index 51% rename from swt/org.argeo.app.ui/src/org/argeo/app/ui/TermsEntryArea.java rename to swt/org.argeo.app.swt/src/org/argeo/app/swt/terms/TermsEntryArea.java index 97d8c1f..2193a3c 100644 --- a/swt/org.argeo.app.ui/src/org/argeo/app/ui/TermsEntryArea.java +++ b/swt/org.argeo.app.swt/src/org/argeo/app/swt/terms/TermsEntryArea.java @@ -1,20 +1,18 @@ -package org.argeo.app.ui; +package org.argeo.app.swt.terms; -import javax.jcr.Node; -import javax.jcr.RepositoryException; - -import org.argeo.cms.ui.CmsUiProvider; +import org.argeo.api.acr.Content; +import org.argeo.cms.swt.acr.SwtUiProvider; import org.eclipse.swt.SWT; 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 th etypologies. */ -public class TermsEntryArea implements CmsUiProvider { +/** Entry area for managing the typologies. */ +public class TermsEntryArea implements SwtUiProvider { @Override - public Control createUi(Composite parent, Node context) throws RepositoryException { + public Control createUiPart(Composite parent, Content content) { parent.setLayout(new GridLayout()); Label lbl = new Label(parent, SWT.NONE); lbl.setText("Typologies"); diff --git a/swt/org.argeo.app.ui/OSGI-INF/l10n/bundle.properties b/swt/org.argeo.app.ui/OSGI-INF/l10n/bundle.properties index 8a9cc95..afa3f49 100644 --- a/swt/org.argeo.app.ui/OSGI-INF/l10n/bundle.properties +++ b/swt/org.argeo.app.ui/OSGI-INF/l10n/bundle.properties @@ -1 +1,3 @@ +appTitle=Argeo Suite + people=People diff --git a/swt/org.argeo.app.ui/bnd.bnd b/swt/org.argeo.app.ui/bnd.bnd index fb2e3f7..5bc2eea 100644 --- a/swt/org.argeo.app.ui/bnd.bnd +++ b/swt/org.argeo.app.ui/bnd.bnd @@ -7,8 +7,6 @@ OSGI-INF/leadPane.xml,\ OSGI-INF/loginScreen.xml,\ OSGI-INF/recentItems.xml,\ OSGI-INF/adminLeadPane.xml,\ -OSGI-INF/termsEntryArea.xml,\ -OSGI-INF/termsLayer.xml,\ OSGI-INF/dashboard.xml,\ OSGI-INF/dashboardLayer.xml,\ OSGI-INF/peopleEntryArea.xml,\ diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/RecentItems.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/RecentItems.java index e16b7d6..3cc6210 100644 --- a/swt/org.argeo.app.ui/src/org/argeo/app/ui/RecentItems.java +++ b/swt/org.argeo.app.ui/src/org/argeo/app/ui/RecentItems.java @@ -16,7 +16,7 @@ import javax.jcr.query.Query; import javax.jcr.query.QueryResult; import org.argeo.app.api.EntityType; -import org.argeo.app.core.XPathUtils; +import org.argeo.app.jcr.XPathUtils; import org.argeo.app.ui.widgets.DelayedText; import org.argeo.app.ux.SuiteIcon; import org.argeo.app.ux.SuiteUxEvent; diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/AbstractDbkViewer.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/AbstractDbkViewer.java index 98b9c6c..16b3f42 100644 --- a/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/AbstractDbkViewer.java +++ b/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/AbstractDbkViewer.java @@ -1,8 +1,8 @@ package org.argeo.app.ui.docbook; import static org.argeo.app.docbook.DbkType.para; -import static org.argeo.app.docbook.DbkUtils.addDbk; -import static org.argeo.app.docbook.DbkUtils.isDbk; +import static org.argeo.app.jcr.docbook.DbkJcrUtils.addDbk; +import static org.argeo.app.jcr.docbook.DbkJcrUtils.isDbk; import java.util.ArrayList; import java.util.Iterator; @@ -21,7 +21,7 @@ import org.argeo.api.cms.ux.Cms2DSize; import org.argeo.api.cms.ux.CmsEditable; import org.argeo.app.docbook.DbkAttr; import org.argeo.app.docbook.DbkType; -import org.argeo.app.docbook.DbkUtils; +import org.argeo.app.jcr.docbook.DbkJcrUtils; import org.argeo.cms.swt.CmsSwtUtils; import org.argeo.cms.swt.SwtEditablePart; import org.argeo.cms.ui.viewers.AbstractPageViewer; @@ -265,7 +265,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke protected DbkSectionTitle prepareSectionTitle(Section newSection, String titleText) throws RepositoryException { Node sectionNode = newSection.getNode(); - Node titleNode = DbkUtils.getOrAddDbk(sectionNode, DbkType.title); + Node titleNode = DbkJcrUtils.getOrAddDbk(sectionNode, DbkType.title); getTextInterpreter().write(titleNode, titleText); if (newSection.getHeader() == null) newSection.createHeader(); @@ -685,7 +685,7 @@ public abstract class AbstractDbkViewer extends AbstractPageViewer implements Ke ((Control) sp).dispose(); } // create title - Node titleNode = DbkUtils.addDbk(newSectionNode, DbkType.title); + Node titleNode = DbkJcrUtils.addDbk(newSectionNode, DbkType.title); // newSectionNode.addNode(DocBookType.TITLE, DocBookType.TITLE); getTextInterpreter().write(titleNode, txt); diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkContextMenu.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkContextMenu.java index 1673bd8..89b5493 100644 --- a/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkContextMenu.java +++ b/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkContextMenu.java @@ -7,7 +7,7 @@ import javax.jcr.Node; import org.argeo.api.cms.ux.CmsEditable; import org.argeo.app.docbook.DbkMsg; -import org.argeo.app.docbook.DbkUtils; +import org.argeo.app.jcr.docbook.DbkJcrUtils; import org.argeo.cms.swt.CmsSwtUtils; import org.argeo.cms.swt.SwtEditablePart; import org.argeo.cms.swt.MouseDown; @@ -136,7 +136,7 @@ class DbkContextMenu { Label insertPictureB = new Label(parent, SWT.NONE); insertPictureB.setText(DbkMsg.insertPicture.lead()); insertPictureB.addMouseListener((MouseDown) (e) -> { - Node newNode = DbkUtils.insertImageAfter(nodePart.getNode()); + Node newNode = DbkJcrUtils.insertImageAfter(nodePart.getNode()); Jcr.save(newNode); textViewer.insertPart(section, newNode); hide(); @@ -144,7 +144,7 @@ class DbkContextMenu { Label insertVideoB = new Label(parent, SWT.NONE); insertVideoB.setText(DbkMsg.insertVideo.lead()); insertVideoB.addMouseListener((MouseDown) (e) -> { - Node newNode = DbkUtils.insertVideoAfter(nodePart.getNode()); + Node newNode = DbkJcrUtils.insertVideoAfter(nodePart.getNode()); Jcr.save(newNode); textViewer.insertPart(section, newNode); hide(); diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkImageManager.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkImageManager.java index 1493223..fef7a02 100644 --- a/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkImageManager.java +++ b/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkImageManager.java @@ -23,7 +23,7 @@ import org.argeo.app.api.EntityNames; import org.argeo.app.api.EntityType; import org.argeo.app.docbook.DbkAttr; import org.argeo.app.docbook.DbkType; -import org.argeo.app.docbook.DbkUtils; +import org.argeo.app.jcr.docbook.DbkJcrUtils; import org.argeo.cms.ui.util.CmsUiUtils; import org.argeo.cms.ui.util.DefaultImageManager; import org.argeo.jcr.JcrException; @@ -55,7 +55,7 @@ public class DbkImageManager extends DefaultImageManager { @Override public Binary getImageBinary(Node node) { Node fileNode = null; - if (DbkUtils.isDbk(node, DbkType.mediaobject)) { + if (DbkJcrUtils.isDbk(node, DbkType.mediaobject)) { Node imageDataNode = getImageDataNode(node); fileNode = getFileNode(imageDataNode); } diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkTextInterpreter.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkTextInterpreter.java index 80f768c..4875f7d 100644 --- a/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkTextInterpreter.java +++ b/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkTextInterpreter.java @@ -2,7 +2,7 @@ package org.argeo.app.ui.docbook; import static org.argeo.app.docbook.DbkType.para; import static org.argeo.app.docbook.DbkType.title; -import static org.argeo.app.docbook.DbkUtils.isDbk; +import static org.argeo.app.jcr.docbook.DbkJcrUtils.isDbk; import java.io.ByteArrayInputStream; import java.io.IOException; diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkVideo.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkVideo.java index c911700..a0944d5 100644 --- a/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkVideo.java +++ b/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkVideo.java @@ -12,7 +12,7 @@ import javax.jcr.RepositoryException; import org.argeo.api.acr.ldap.NamingUtils; import org.argeo.app.docbook.DbkAttr; import org.argeo.app.docbook.DbkType; -import org.argeo.app.docbook.DbkUtils; +import org.argeo.app.jcr.docbook.DbkJcrUtils; import org.argeo.cms.swt.CmsSwtUtils; import org.argeo.cms.swt.Selected; import org.argeo.cms.ui.viewers.NodePart; @@ -70,7 +70,7 @@ public class DbkVideo extends StyledControl implements SectionPart, NodePart { Composite editor = new Composite(wrapper, SWT.BORDER); editor.setLayout(new GridLayout(3, false)); editor.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); - String fileref = DbkUtils.getMediaFileref(mediaobject); + String fileref = DbkJcrUtils.getMediaFileref(mediaobject); Text text = new Text(editor, SWT.SINGLE); if (fileref != null) text.setText(fileref); @@ -171,7 +171,7 @@ public class DbkVideo extends StyledControl implements SectionPart, NodePart { if (control instanceof Browser) { Browser browser = (Browser) control; getNode().getSession(); - String fileref = DbkUtils.getMediaFileref(getNode()); + String fileref = DbkJcrUtils.getMediaFileref(getNode()); if (fileref != null) { // TODO manage self-hosted videos // TODO for YouTube videos, check whether the URL starts with diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DocumentTextEditor.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DocumentTextEditor.java index 7d41117..330abd2 100644 --- a/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DocumentTextEditor.java +++ b/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DocumentTextEditor.java @@ -5,7 +5,7 @@ import javax.jcr.RepositoryException; import org.argeo.api.cms.ux.CmsEditable; import org.argeo.app.docbook.DbkType; -import org.argeo.app.docbook.DbkUtils; +import org.argeo.app.jcr.docbook.DbkJcrUtils; import org.argeo.cms.swt.CmsSwtUtils; import org.eclipse.swt.widgets.Composite; @@ -22,7 +22,7 @@ public class DocumentTextEditor extends AbstractDbkViewer { @Override protected void initModel(Node textNode) throws RepositoryException { if (isFlat()) { - DbkUtils.addParagraph(textNode, ""); + DbkJcrUtils.addParagraph(textNode, ""); } // else // textNode.setProperty(DocBookNames.DBK_TITLE, textNode.getName()); -- 2.30.2