From 8630eb1e679307eb8a8448f80a99cc530402d8d3 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sun, 1 Nov 2020 11:31:10 +0100 Subject: [PATCH] Introduce XForms support. --- dep/org.argeo.suite.dep.ui.rap/pom.xml | 5 + knowledge/org.argeo.support.odk/bnd.bnd | 13 +- knowledge/org.argeo.support.odk/pom.xml | 6 +- .../src/org/argeo/support/odk/odk.cnd | 39 + knowledge/org.argeo.support.xforms/.classpath | 7 + knowledge/org.argeo.support.xforms/.gitignore | 2 + knowledge/org.argeo.support.xforms/.project | 28 + .../META-INF/.gitignore | 1 + knowledge/org.argeo.support.xforms/bnd.bnd | 5 + .../org.argeo.support.xforms/build.properties | 4 + knowledge/org.argeo.support.xforms/pom.xml | 22 + .../src/org/argeo/support/xforms/xforms.cnd | 37 + .../xsd/XForms-Schema.xsd | 858 ++++++++++++++++++ knowledge/pom.xml | 1 + org.argeo.entity.api/bnd.bnd | 2 + .../src/org/argeo/entity/EntityJcrUtils.java | 60 -- .../src/org/argeo/entity/EntityNames.java | 1 + .../src/org/argeo/entity/EntityType.java | 8 +- .../src/org/argeo/entity/entity.cnd | 37 +- org.argeo.suite.core/.project | 5 + .../OSGI-INF/maintenanceService.xml | 7 + org.argeo.suite.core/bnd.bnd | 6 + org.argeo.suite.core/build.properties | 5 +- org.argeo.suite.core/pom.xml | 5 + .../suite/core/SuiteMaintenanceService.java | 19 + 25 files changed, 1084 insertions(+), 99 deletions(-) create mode 100644 knowledge/org.argeo.support.odk/src/org/argeo/support/odk/odk.cnd create mode 100644 knowledge/org.argeo.support.xforms/.classpath create mode 100644 knowledge/org.argeo.support.xforms/.gitignore create mode 100644 knowledge/org.argeo.support.xforms/.project create mode 100644 knowledge/org.argeo.support.xforms/META-INF/.gitignore create mode 100644 knowledge/org.argeo.support.xforms/bnd.bnd create mode 100644 knowledge/org.argeo.support.xforms/build.properties create mode 100644 knowledge/org.argeo.support.xforms/pom.xml create mode 100644 knowledge/org.argeo.support.xforms/src/org/argeo/support/xforms/xforms.cnd create mode 100644 knowledge/org.argeo.support.xforms/xsd/XForms-Schema.xsd delete mode 100644 org.argeo.entity.api/src/org/argeo/entity/EntityJcrUtils.java create mode 100644 org.argeo.suite.core/OSGI-INF/maintenanceService.xml create mode 100644 org.argeo.suite.core/src/org/argeo/suite/core/SuiteMaintenanceService.java diff --git a/dep/org.argeo.suite.dep.ui.rap/pom.xml b/dep/org.argeo.suite.dep.ui.rap/pom.xml index bcaa6a4..8cba39e 100644 --- a/dep/org.argeo.suite.dep.ui.rap/pom.xml +++ b/dep/org.argeo.suite.dep.ui.rap/pom.xml @@ -60,6 +60,11 @@ + + org.argeo.suite + org.argeo.support.xforms + 2.1.16-SNAPSHOT + org.argeo.suite org.argeo.support.odk diff --git a/knowledge/org.argeo.support.odk/bnd.bnd b/knowledge/org.argeo.support.odk/bnd.bnd index 9db4e0c..caa9dce 100644 --- a/knowledge/org.argeo.support.odk/bnd.bnd +++ b/knowledge/org.argeo.support.odk/bnd.bnd @@ -1,9 +1,16 @@ -Import-Package:\ -org.osgi.service.http.context,\ -* +Require-Capability:\ +cms.datamodel;filter:="(name=entity)",\ +cms.datamodel;filter:="(name=xforms)" + +Provide-Capability:\ +cms.datamodel; name=odk; cnd=/org/argeo/support/odk/odk.cnd Service-Component:\ OSGI-INF/odkServletContext.xml,\ OSGI-INF/odkFormListServlet.xml,\ OSGI-INF/odkFormServlet.xml,\ OSGI-INF/odkSubmissionServlet.xml + +Import-Package:\ +org.osgi.service.http.context,\ +* diff --git a/knowledge/org.argeo.support.odk/pom.xml b/knowledge/org.argeo.support.odk/pom.xml index 26177c9..69cc95e 100644 --- a/knowledge/org.argeo.support.odk/pom.xml +++ b/knowledge/org.argeo.support.odk/pom.xml @@ -14,9 +14,9 @@ jar - org.argeo.commons - org.argeo.cms - ${version.argeo-commons} + org.argeo.suite + org.argeo.suite.core + 2.1.16-SNAPSHOT diff --git a/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/odk.cnd b/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/odk.cnd new file mode 100644 index 0000000..c3f43c8 --- /dev/null +++ b/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/odk.cnd @@ -0,0 +1,39 @@ + + + + + + +[orxList:xform] ++ h:html (odk:html) = odk:html + +[odk:head] ++ h:title (jcrx:xmlvalue) = jcrx:xmlvalue ++ xforms:model (odk:model) = odk:model + +[odk:body] > xforms:ui + + +[odk:html] > mix:referenceable ++ h:head (odk:head) = odk:head ++ h:body (odk:body) = odk:body + +[odk:model] > xforms:model ++ odk:setgeopoint (odk:setgeopoint) = odk:setgeopoint ++ xforms:itext (odk:itext) = odk:itext + +[odk:itext] ++ xforms:translation (odk:translation) = odk:translation * + +[odk:translation] +- lang (STRING) m +- default (STRING) ++ xforms:text (odk:text) = odk:text * + +[odk:text] +- id (STRING) m ++ xforms:value (jcrx:xmlvalue) = jcrx:xmlvalue + +[odk:setgeopoint] +- event (STRING) +- ref (STRING) diff --git a/knowledge/org.argeo.support.xforms/.classpath b/knowledge/org.argeo.support.xforms/.classpath new file mode 100644 index 0000000..e801ebf --- /dev/null +++ b/knowledge/org.argeo.support.xforms/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/knowledge/org.argeo.support.xforms/.gitignore b/knowledge/org.argeo.support.xforms/.gitignore new file mode 100644 index 0000000..09e3bc9 --- /dev/null +++ b/knowledge/org.argeo.support.xforms/.gitignore @@ -0,0 +1,2 @@ +/bin/ +/target/ diff --git a/knowledge/org.argeo.support.xforms/.project b/knowledge/org.argeo.support.xforms/.project new file mode 100644 index 0000000..3c50bfa --- /dev/null +++ b/knowledge/org.argeo.support.xforms/.project @@ -0,0 +1,28 @@ + + + org.argeo.support.xforms + + + + + + 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/knowledge/org.argeo.support.xforms/META-INF/.gitignore b/knowledge/org.argeo.support.xforms/META-INF/.gitignore new file mode 100644 index 0000000..4854a41 --- /dev/null +++ b/knowledge/org.argeo.support.xforms/META-INF/.gitignore @@ -0,0 +1 @@ +/MANIFEST.MF diff --git a/knowledge/org.argeo.support.xforms/bnd.bnd b/knowledge/org.argeo.support.xforms/bnd.bnd new file mode 100644 index 0000000..23c86a9 --- /dev/null +++ b/knowledge/org.argeo.support.xforms/bnd.bnd @@ -0,0 +1,5 @@ +Require-Capability:\ +cms.datamodel;filter:="(name=entity)" + +Provide-Capability:\ +cms.datamodel; name=xforms; cnd=/org/argeo/support/xforms/xforms.cnd diff --git a/knowledge/org.argeo.support.xforms/build.properties b/knowledge/org.argeo.support.xforms/build.properties new file mode 100644 index 0000000..34d2e4d --- /dev/null +++ b/knowledge/org.argeo.support.xforms/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/knowledge/org.argeo.support.xforms/pom.xml b/knowledge/org.argeo.support.xforms/pom.xml new file mode 100644 index 0000000..0d75c9a --- /dev/null +++ b/knowledge/org.argeo.support.xforms/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + + org.argeo.suite + knowledge + 2.1.16-SNAPSHOT + .. + + org.argeo.support.xforms + XForms support + jar + + + org.argeo.suite + org.argeo.suite.core + 2.1.16-SNAPSHOT + + + diff --git a/knowledge/org.argeo.support.xforms/src/org/argeo/support/xforms/xforms.cnd b/knowledge/org.argeo.support.xforms/src/org/argeo/support/xforms/xforms.cnd new file mode 100644 index 0000000..a9f986a --- /dev/null +++ b/knowledge/org.argeo.support.xforms/src/org/argeo/support/xforms/xforms.cnd @@ -0,0 +1,37 @@ + + +[xforms:model] ++ xforms:instance (nt:base) = nt:unstructured * ++ xforms:bind (xforms:bind) = xforms:bind * ++ xforms:setvalue (xforms:setvalue) = xforms:setvalue * + +[xforms:bind] +- * (STRING) + +[xforms:setvalue] +- * (STRING) + +[xforms:select] > xforms:input ++ xforms:itemset (xforms:itemset) = xforms:itemset + +[xforms:itemset] +- nodeset (STRING) ++ xforms:label (jcrx:xmlvalue) = jcrx:xmlvalue ++ xforms:value (jcrx:xmlvalue) = jcrx:xmlvalue + +[xforms:ui] +- * (STRING) ++ xforms:label (jcrx:xmlvalue) = jcrx:xmlvalue * ++ xforms:hint (jcrx:xmlvalue) = jcrx:xmlvalue * ++ xforms:input (xforms:input) = xforms:input * ++ xforms:select (xforms:select) = xforms:select * ++ xforms:select1 (xforms:select) = xforms:select * ++ xforms:trigger (xforms:input) = xforms:input * ++ xforms:upload (xforms:input) = xforms:input * ++ xforms:group (xforms:ui) = xforms:ui * ++ xforms:repeat (xforms:ui) = xforms:ui * + +[xforms:input] +- * (STRING) ++ xforms:label (jcrx:xmlvalue) = jcrx:xmlvalue ++ xforms:hint (jcrx:xmlvalue) = jcrx:xmlvalue * diff --git a/knowledge/org.argeo.support.xforms/xsd/XForms-Schema.xsd b/knowledge/org.argeo.support.xforms/xsd/XForms-Schema.xsd new file mode 100644 index 0000000..6383f86 --- /dev/null +++ b/knowledge/org.argeo.support.xforms/xsd/XForms-Schema.xsd @@ -0,0 +1,858 @@ + + + + + + + + Attributes for _every_ element in XForms + + + + + + + + + + + + + + + + + + + + + + + + + instance container. + + + + + + + + + + + + submit info container. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Definition of bind container. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/knowledge/pom.xml b/knowledge/pom.xml index 6316767..91c2af3 100644 --- a/knowledge/pom.xml +++ b/knowledge/pom.xml @@ -11,6 +11,7 @@ Argeo Knowledge Components pom + org.argeo.support.xforms org.argeo.support.odk org.argeo.support.geonames diff --git a/org.argeo.entity.api/bnd.bnd b/org.argeo.entity.api/bnd.bnd index a7d5dd1..ab46172 100644 --- a/org.argeo.entity.api/bnd.bnd +++ b/org.argeo.entity.api/bnd.bnd @@ -1,3 +1,5 @@ +Require-Capability:\ +cms.datamodel;filter:="(name=jcrx)" Provide-Capability:\ cms.datamodel; name=entity; cnd=/org/argeo/entity/entity.cnd diff --git a/org.argeo.entity.api/src/org/argeo/entity/EntityJcrUtils.java b/org.argeo.entity.api/src/org/argeo/entity/EntityJcrUtils.java deleted file mode 100644 index dfe3df7..0000000 --- a/org.argeo.entity.api/src/org/argeo/entity/EntityJcrUtils.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.argeo.entity; - -import javax.jcr.Node; -import javax.jcr.RepositoryException; - -/** JCR utilities around the entity concepts. */ -public class EntityJcrUtils { - /** - * The name of a node which will be serialized as XML text, as per section 7.3.1 - * of the JCR 2.0 specifications. - */ - private final static String JCR_XMLTEXT = "jcr:xmltext"; - - /** - * The name of a property which will be serialized as XML text, as per section - * 7.3.1 of the JCR 2.0 specifications. - */ - private final static String JCR_XMLCHARACTERS = "jcr:xmlcharacters"; - - /* - * XML - */ - /** - * Set both as a property and as a subnode which will be exported as an XML - * element. - */ - -// public static void setAttrAndElem(Node node, String name, String value) { -// Jcr.set(node, name, value); -// setElem(node, name, value); -// } - /** - * Set as a subnode which will be exported as an XML element. - */ - public static String getXmlValue(Node node, String name) { - try { - if (!node.hasNode(name)) - throw new IllegalArgumentException("No XML text named " + name); - return node.getNode(name).getNode(JCR_XMLTEXT).getProperty(JCR_XMLCHARACTERS).getString(); - } catch (RepositoryException e) { - throw new IllegalStateException("Cannot get " + name + " as XML text", e); - } - } - - /** - * Set as a subnode which will be exported as an XML element. - */ - public static void setXmlValue(Node node, String name, String value) { - try { - if (node.hasNode(name)) - node.getNode(name).getNode(JCR_XMLTEXT).setProperty(JCR_XMLCHARACTERS, value); - else - node.addNode(name, EntityType.xmlvalue.qualified()).addNode(JCR_XMLTEXT, EntityType.xmltext.qualified()) - .setProperty(JCR_XMLCHARACTERS, value); - } catch (RepositoryException e) { - throw new IllegalStateException("Cannot set " + name + " as XML text", e); - } - } - -} diff --git a/org.argeo.entity.api/src/org/argeo/entity/EntityNames.java b/org.argeo.entity.api/src/org/argeo/entity/EntityNames.java index b28e71d..f8c8840 100644 --- a/org.argeo.entity.api/src/org/argeo/entity/EntityNames.java +++ b/org.argeo.entity.api/src/org/argeo/entity/EntityNames.java @@ -6,6 +6,7 @@ import org.argeo.naming.LdapAttrs; public interface EntityNames { final String ENTITY_DEFINITIONS_PATH = "/entity"; final String TYPOLOGIES_PATH = "/class"; + final String FORM_BASE = "form"; /** Administrative units. */ final String ADM = "adm"; diff --git a/org.argeo.entity.api/src/org/argeo/entity/EntityType.java b/org.argeo.entity.api/src/org/argeo/entity/EntityType.java index 7fc86a3..f0905d8 100644 --- a/org.argeo.entity.api/src/org/argeo/entity/EntityType.java +++ b/org.argeo.entity.api/src/org/argeo/entity/EntityType.java @@ -7,11 +7,13 @@ public enum EntityType implements QualifiedName { // entity entity, definition, // xml - xmlvalue,xmltext, + xmlvalue, xmltext, // typology - typology, term + typology, term, + // form + form, formSet, // ldap - , person; + person; @Override public String getPrefix() { diff --git a/org.argeo.entity.api/src/org/argeo/entity/entity.cnd b/org.argeo.entity.api/src/org/argeo/entity/entity.cnd index 1ef20a7..45be8ad 100644 --- a/org.argeo.entity.api/src/org/argeo/entity/entity.cnd +++ b/org.argeo.entity.api/src/org/argeo/entity/entity.cnd @@ -1,14 +1,11 @@ - - - -// standard namespaces +// Standard namespaces - - // see https://www.w3.org/2003/01/geo/ - +// + + [entity:entity] > mix:created, mix:referenceable mixin @@ -43,29 +40,13 @@ orderable + * (entity:term) * // -// XML -// -[entity:xmlvalue] > mix:language -- * -+ jcr:xmltext (entity:xmltext) - -[entity:xmltext] - - jcr:xmlcharacters (String) mandatory - -// -// HTML +// FORM // -[h:head] -+ h:title (entity:xmlvalue) -+ h:base (entity:xmlvalue) -+ h:style (entity:xmlvalue) multiple -+ h:meta (entity:xmlvalue) multiple -+ h:link (entity:xmlvalue) multiple -+ h:script (entity:xmlvalue) multiple +[entity:form] +mixin -[h:html] -+ h:head (h:head) -+ h:body (nt:unstructured) +[entity:formSet] +mixin // LDAP-LIKE ENTITIES // A real person diff --git a/org.argeo.suite.core/.project b/org.argeo.suite.core/.project index f47b00e..ab084af 100644 --- a/org.argeo.suite.core/.project +++ b/org.argeo.suite.core/.project @@ -20,6 +20,11 @@ + + org.eclipse.pde.ds.core.builder + + + org.eclipse.pde.PluginNature diff --git a/org.argeo.suite.core/OSGI-INF/maintenanceService.xml b/org.argeo.suite.core/OSGI-INF/maintenanceService.xml new file mode 100644 index 0000000..2d495c8 --- /dev/null +++ b/org.argeo.suite.core/OSGI-INF/maintenanceService.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/org.argeo.suite.core/bnd.bnd b/org.argeo.suite.core/bnd.bnd index d70ca8c..4887675 100644 --- a/org.argeo.suite.core/bnd.bnd +++ b/org.argeo.suite.core/bnd.bnd @@ -1,4 +1,10 @@ +Service-Component:\ +OSGI-INF/maintenanceService.xml Import-Package:\ +javax.transaction,\ +org.osgi.service.useradmin,\ +javax.jcr.nodetype,\ org.argeo.api,\ +org.argeo.entity,\ * \ No newline at end of file diff --git a/org.argeo.suite.core/build.properties b/org.argeo.suite.core/build.properties index 34d2e4d..6210e84 100644 --- a/org.argeo.suite.core/build.properties +++ b/org.argeo.suite.core/build.properties @@ -1,4 +1,5 @@ -source.. = src/ output.. = bin/ bin.includes = META-INF/,\ - . + .,\ + OSGI-INF/ +source.. = src/ diff --git a/org.argeo.suite.core/pom.xml b/org.argeo.suite.core/pom.xml index c6a7d4f..9c89ce5 100644 --- a/org.argeo.suite.core/pom.xml +++ b/org.argeo.suite.core/pom.xml @@ -25,5 +25,10 @@ org.argeo.cms ${version.argeo-commons} + + org.argeo.commons + org.argeo.maintenance + ${version.argeo-commons} + diff --git a/org.argeo.suite.core/src/org/argeo/suite/core/SuiteMaintenanceService.java b/org.argeo.suite.core/src/org/argeo/suite/core/SuiteMaintenanceService.java new file mode 100644 index 0000000..7e54eaa --- /dev/null +++ b/org.argeo.suite.core/src/org/argeo/suite/core/SuiteMaintenanceService.java @@ -0,0 +1,19 @@ +package org.argeo.suite.core; + +import java.io.IOException; + +import javax.jcr.RepositoryException; +import javax.jcr.Session; + +import org.argeo.maintenance.AbstractMaintenanceService; + +/** Initialises an Argeo Suite backend. */ +public class SuiteMaintenanceService extends AbstractMaintenanceService { + + @Override + public boolean prepareJcrTree(Session adminSession) throws RepositoryException, IOException { + //EntityJcrUtils.getOrAddFormFolder(adminSession.getRootNode(), EntityNames.FORM_BASE); + return adminSession.hasPendingChanges(); + } + +} -- 2.30.2