From: Mathieu Baudier Date: Thu, 13 Jan 2022 13:52:21 +0000 (+0100) Subject: Rename OSGi bundles X-Git-Tag: argeo-suite-2.3.3~32 X-Git-Url: https://git.argeo.org/?p=gpl%2Fargeo-suite.git;a=commitdiff_plain;h=9dad741609777467f58a508e07139be9a086919b Rename OSGi bundles --- diff --git a/dep/org.argeo.suite.dep.ui.rap/pom.xml b/dep/org.argeo.suite.dep.ui.rap/pom.xml index f52ecf1..b4a6e61 100644 --- a/dep/org.argeo.suite.dep.ui.rap/pom.xml +++ b/dep/org.argeo.suite.dep.ui.rap/pom.xml @@ -28,19 +28,19 @@ org.argeo.suite - org.argeo.entity.api - 2.3-SNAPSHOT - - - org.argeo.suite - org.argeo.entity.core - 2.3-SNAPSHOT - - - org.argeo.suite - org.argeo.entity.ui + org.argeo.app.api 2.3-SNAPSHOT + + + + + + + + + + @@ -52,69 +52,69 @@ org.argeo.suite - org.argeo.suite.core + org.argeo.app.core 2.3-SNAPSHOT org.argeo.suite - org.argeo.suite.ui + org.argeo.app.ui 2.3-SNAPSHOT org.argeo.suite - org.argeo.suite.theme.default + org.argeo.app.theme.default 2.3-SNAPSHOT org.argeo.suite - org.argeo.suite.ui.rap + org.argeo.app.ui.rap 2.3-SNAPSHOT - - org.argeo.suite - org.argeo.people.ui - 2.3-SNAPSHOT - + + + + + - - org.argeo.suite - org.argeo.library.ui - 2.3-SNAPSHOT - + + + + + - - org.argeo.suite - org.argeo.geo.ui - 2.3-SNAPSHOT - + + + + + org.argeo.suite - org.argeo.publishing.ui + org.argeo.app.servlet.publish 2.3-SNAPSHOT + + + + + org.argeo.suite - org.argeo.support.xforms - 2.3-SNAPSHOT - - - org.argeo.suite - org.argeo.support.odk - 2.3-SNAPSHOT - - - org.argeo.suite - org.argeo.support.geonames + org.argeo.app.servlet.odk 2.3-SNAPSHOT + + + + + diff --git a/org.argeo.app.api/.classpath b/org.argeo.app.api/.classpath new file mode 100644 index 0000000..e801ebf --- /dev/null +++ b/org.argeo.app.api/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/org.argeo.app.api/.gitignore b/org.argeo.app.api/.gitignore new file mode 100644 index 0000000..09e3bc9 --- /dev/null +++ b/org.argeo.app.api/.gitignore @@ -0,0 +1,2 @@ +/bin/ +/target/ diff --git a/org.argeo.app.api/.project b/org.argeo.app.api/.project new file mode 100644 index 0000000..2f51e20 --- /dev/null +++ b/org.argeo.app.api/.project @@ -0,0 +1,28 @@ + + + org.argeo.app.api + + + + + + 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.api/META-INF/.gitignore b/org.argeo.app.api/META-INF/.gitignore new file mode 100644 index 0000000..4854a41 --- /dev/null +++ b/org.argeo.app.api/META-INF/.gitignore @@ -0,0 +1 @@ +/MANIFEST.MF diff --git a/org.argeo.app.api/bnd.bnd b/org.argeo.app.api/bnd.bnd new file mode 100644 index 0000000..ab46172 --- /dev/null +++ b/org.argeo.app.api/bnd.bnd @@ -0,0 +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.app.api/build.properties b/org.argeo.app.api/build.properties new file mode 100644 index 0000000..34d2e4d --- /dev/null +++ b/org.argeo.app.api/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/org.argeo.app.api/pom.xml b/org.argeo.app.api/pom.xml new file mode 100644 index 0000000..4bd6bcf --- /dev/null +++ b/org.argeo.app.api/pom.xml @@ -0,0 +1,21 @@ + + + 4.0.0 + + org.argeo.suite + argeo-suite + 2.3-SNAPSHOT + .. + + org.argeo.app.api + Suite API + jar + + + + org.argeo.commons + org.argeo.util + ${version.argeo-commons} + + + diff --git a/org.argeo.app.api/src/org/argeo/entity/EntityConstants.java b/org.argeo.app.api/src/org/argeo/entity/EntityConstants.java new file mode 100644 index 0000000..93021e0 --- /dev/null +++ b/org.argeo.app.api/src/org/argeo/entity/EntityConstants.java @@ -0,0 +1,8 @@ +package org.argeo.entity; + +/** Constant related to entities, typically used in an OSGi context. */ +public interface EntityConstants { + final static String TYPE = "entity.type"; + final static String DEFAULT_EDITOR_ID = "entity.defaultEditorId"; + +} diff --git a/org.argeo.app.api/src/org/argeo/entity/EntityDefinition.java b/org.argeo.app.api/src/org/argeo/entity/EntityDefinition.java new file mode 100644 index 0000000..08aff61 --- /dev/null +++ b/org.argeo.app.api/src/org/argeo/entity/EntityDefinition.java @@ -0,0 +1,10 @@ +package org.argeo.entity; + +import javax.jcr.Node; + +/** The definition of an entity, a composite configurable data structure. */ +public interface EntityDefinition { + String getEditorId(Node entity); + + String getType(); +} diff --git a/org.argeo.app.api/src/org/argeo/entity/EntityMimeType.java b/org.argeo.app.api/src/org/argeo/entity/EntityMimeType.java new file mode 100644 index 0000000..997f1be --- /dev/null +++ b/org.argeo.app.api/src/org/argeo/entity/EntityMimeType.java @@ -0,0 +1,60 @@ +package org.argeo.entity; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +/** Supported mime types. */ +public enum EntityMimeType { + XML("text/xml", "xml"), CSV("text/csv", "csv"); + + private final String mimeType; + private final String[] extensions; + + EntityMimeType(String mimeType, String... extensions) { + this.mimeType = mimeType; + this.extensions = extensions; + } + + public String getMimeType() { + return mimeType; + } + + public String[] getExtensions() { + return extensions; + } + + public String getDefaultExtension() { + if (extensions.length > 0) + return extensions[0]; + else + return null; + } + + public String toHttpContentType(Charset charset) { + if (charset == null) + return mimeType; + return mimeType + "; charset=" + charset.name(); + } + + public String toHttpContentType() { + if (mimeType.startsWith("text/")) { + return toHttpContentType(StandardCharsets.UTF_8); + } else { + return mimeType; + } + } + + public static EntityMimeType find(String mimeType) { + for (EntityMimeType entityMimeType : values()) { + if (entityMimeType.mimeType.equals(mimeType)) + return entityMimeType; + } + return null; + } + + @Override + public String toString() { + return mimeType; + } + +} diff --git a/org.argeo.app.api/src/org/argeo/entity/EntityNames.java b/org.argeo.app.api/src/org/argeo/entity/EntityNames.java new file mode 100644 index 0000000..57901c4 --- /dev/null +++ b/org.argeo.app.api/src/org/argeo/entity/EntityNames.java @@ -0,0 +1,61 @@ +package org.argeo.entity; + +import org.argeo.util.naming.LdapAttrs; + +/** Constants used to name entity structures. */ +public interface EntityNames { + @Deprecated + final String FORM_BASE = "form"; + final String SUBMISSIONS_BASE = "submissions"; + @Deprecated + final String TERM = "term"; + final String NAME = "name"; + +// final String ENTITY_DEFINITIONS_PATH = "/entity"; + @Deprecated + final String TYPOLOGIES_PATH = "/" + TERM; + /** Administrative units. */ + final String ADM = "adm"; + + final String ENTITY_TYPE = "entity:type"; + // final String ENTITY_UID = "entity:uid"; + // final String ENTITY_NAME = "entity:name"; + + // GENERIC CONCEPTS + /** The language which is relevant. */ + final String XML_LANG = "xml:lang"; + /** The date which is relevant. */ + final String ENTITY_DATE = "entity:date"; + @Deprecated + final String ENTITY_RELATED_TO = "entity:relatedTo"; + + // DEFAULT FOLDER NAMES + final String MEDIA = "media"; + final String FILES = "files"; + + // LDAP-LIKE ENTITIES + @Deprecated + final String DISPLAY_NAME = LdapAttrs.displayName.property(); + // Persons + @Deprecated + final String GIVEN_NAME = LdapAttrs.givenName.property(); + @Deprecated + final String SURNAME = LdapAttrs.sn.property(); + @Deprecated + final String EMAIL = LdapAttrs.mail.property(); + @Deprecated + final String OU = LdapAttrs.ou.property(); + + // WGS84 + final String GEO_LAT = "geo:lat"; + final String GEO_LONG = "geo:long"; + final String GEO_ALT = "geo:alt"; + + // SVG + final String SVG_WIDTH = "svg:width"; + final String SVG_HEIGHT = "svg:height"; + final String SVG_LENGTH = "svg:length"; + final String SVG_UNIT = "svg:unit"; + final String SVG_DUR = "svg:dur"; + final String SVG_DIRECTION = "svg:direction"; +} diff --git a/org.argeo.app.api/src/org/argeo/entity/EntityType.java b/org.argeo.app.api/src/org/argeo/entity/EntityType.java new file mode 100644 index 0000000..089cdcf --- /dev/null +++ b/org.argeo.app.api/src/org/argeo/entity/EntityType.java @@ -0,0 +1,42 @@ +package org.argeo.entity; + +/** Types related to entities. */ +public enum EntityType implements JcrName { + // entity + entity, local, relatedTo, + // structure + space, document, + // typology + typologies, terms, term, + // form + form, formSet, formSubmission, + // graphics + box, + // geography + geopoint, bearing, + // ldap + person, user; + + @Override + public String getPrefix() { + return prefix(); + } + + public static String prefix() { + return "entity"; + } + + public String basePath() { + return '/' + name(); + } + + @Override + public String getNamespace() { + return namespace(); + } + + public static String namespace() { + return "http://www.argeo.org/ns/entity"; + } + +} diff --git a/org.argeo.app.api/src/org/argeo/entity/EntityTypes.java b/org.argeo.app.api/src/org/argeo/entity/EntityTypes.java new file mode 100644 index 0000000..ef35147 --- /dev/null +++ b/org.argeo.app.api/src/org/argeo/entity/EntityTypes.java @@ -0,0 +1,10 @@ +package org.argeo.entity; + +/** Types related to entities. */ +@Deprecated +public interface EntityTypes { + final static String ENTITY_ENTITY = "entity:entity"; + final static String ENTITY_DEFINITION = "entity:definition"; + + final static String ENTITY_PERSON = "entity:person"; +} diff --git a/org.argeo.app.api/src/org/argeo/entity/JcrName.java b/org.argeo.app.api/src/org/argeo/entity/JcrName.java new file mode 100644 index 0000000..322c42e --- /dev/null +++ b/org.argeo.app.api/src/org/argeo/entity/JcrName.java @@ -0,0 +1,30 @@ +package org.argeo.entity; + +import java.util.function.Supplier; + +/** Can be applied to {@link Enum}s in order to generate prefixed names. */ +@FunctionalInterface +public interface JcrName extends Supplier { + String name(); + + default String getPrefix() { + return null; + } + + default String getNamespace() { + return null; + } + + @Override + default String get() { + String prefix = getPrefix(); + return prefix != null ? prefix + ":" + name() : name(); + } + + default String withNamespace() { + String namespace = getNamespace(); + if (namespace == null) + throw new UnsupportedOperationException("No namespace is specified for " + getClass()); + return "{" + namespace + "}" + name(); + } +} diff --git a/org.argeo.app.api/src/org/argeo/entity/Term.java b/org.argeo.app.api/src/org/argeo/entity/Term.java new file mode 100644 index 0000000..3bf075a --- /dev/null +++ b/org.argeo.app.api/src/org/argeo/entity/Term.java @@ -0,0 +1,22 @@ +package org.argeo.entity; + +import java.util.List; + +/** + * A name within a {@link Typology}, used to qualify an entity (categories, + * keywords, etc.). + */ +public interface Term { + String getId(); + + String getName(); + +// String getRelativePath(); + + Typology getTypology(); + + List getSubTerms(); + + Term getParentTerm(); + +} diff --git a/org.argeo.app.api/src/org/argeo/entity/TermsManager.java b/org.argeo.app.api/src/org/argeo/entity/TermsManager.java new file mode 100644 index 0000000..7564ff9 --- /dev/null +++ b/org.argeo.app.api/src/org/argeo/entity/TermsManager.java @@ -0,0 +1,13 @@ +package org.argeo.entity; + +import java.util.List; + +/** Provides optimised access and utilities around terms typologies. */ +public interface TermsManager { + Typology getTypology(String typology); + + Term getTerm(String id); + + List listAllTerms(String typology); + +} diff --git a/org.argeo.app.api/src/org/argeo/entity/Typology.java b/org.argeo.app.api/src/org/argeo/entity/Typology.java new file mode 100644 index 0000000..5be27e3 --- /dev/null +++ b/org.argeo.app.api/src/org/argeo/entity/Typology.java @@ -0,0 +1,15 @@ +package org.argeo.entity; + +import java.util.List; + +/** A structured and exhaustive set of {@link Term}s. */ +public interface Typology { + + String getId(); + + boolean isFlat(); + + List getSubTerms(); + + Term findTermByName(String name); +} diff --git a/org.argeo.app.api/src/org/argeo/entity/entity.cnd b/org.argeo.app.api/src/org/argeo/entity/entity.cnd new file mode 100644 index 0000000..2ea89f9 --- /dev/null +++ b/org.argeo.app.api/src/org/argeo/entity/entity.cnd @@ -0,0 +1,114 @@ +// Standard namespaces + + +// see https://www.w3.org/2003/01/geo/ + + + + + + +[entity:entity] > mix:created, mix:referenceable +mixin + +[entity:local] > entity:entity +mixin +- entity:type (String) m + +[entity:relatedTo] +mixin ++ entity:relatedTo (nt:address) * + +// +// ENTITY DEFINITION +// +//[entity:definition] > entity:composite, mix:created, mix:lastModified, mix:referenceable +//- entity:type (String) multiple + +//[entity:part] + +//[entity:reference] + +//[entity:composite] +//orderable +//+ * (entity:part) +//+ * (entity:reference) +//+ * (entity:composite) + +[entity:query] > nt:query, mix:referenceable + +[entity:querySet] ++ * (entity:query) = entity:query * + +// +// STRUCTURE +// +[entity:space] +mixin + +[entity:document] +mixin + +// +// TYPOLOGY +// +[entity:typologies] ++ * (entity:terms) = entity:terms + +[entity:term] +orderable +- name (NAME) +- * (*) ++ term (entity:term) = entity:term * + +[entity:terms] > mix:referenceable +orderable ++ term (entity:term) = entity:term * + +// +// FORM +// +[entity:form] +mixin ++ queries (entity:querySet) = entity:querySet + +[entity:formSubmission] +mixin + +[entity:formSet] > mix:title +mixin + +// +// GRAPHICS +// +[entity:box] +mixin +- svg:width (DOUBLE) +- svg:height (DOUBLE) +- svg:length (DOUBLE) +- svg:unit (STRING) +- svg:dur (DOUBLE) + +// LDAP-LIKE ENTITIES +// A real person +[entity:person] > entity:entity +mixin +- ldap:sn (String) +- ldap:givenName (String) +- ldap:mail (String) * + +[entity:user] > entity:person +mixin +- ldap:distinguishedName (String) +- ldap:uid (String) + +// GEOGRAPHY +[entity:geopoint] +mixin +- geo:long (DOUBLE) +- geo:lat (DOUBLE) +- geo:alt (DOUBLE) + +[entity:bearing] +mixin +- svg:direction (DOUBLE) diff --git a/org.argeo.app.core/.classpath b/org.argeo.app.core/.classpath new file mode 100644 index 0000000..e801ebf --- /dev/null +++ b/org.argeo.app.core/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/org.argeo.app.core/.gitignore b/org.argeo.app.core/.gitignore new file mode 100644 index 0000000..09e3bc9 --- /dev/null +++ b/org.argeo.app.core/.gitignore @@ -0,0 +1,2 @@ +/bin/ +/target/ diff --git a/org.argeo.app.core/.project b/org.argeo.app.core/.project new file mode 100644 index 0000000..b5ada14 --- /dev/null +++ b/org.argeo.app.core/.project @@ -0,0 +1,33 @@ + + + org.argeo.app.core + + + + + + 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.app.core/META-INF/.gitignore b/org.argeo.app.core/META-INF/.gitignore new file mode 100644 index 0000000..4854a41 --- /dev/null +++ b/org.argeo.app.core/META-INF/.gitignore @@ -0,0 +1 @@ +/MANIFEST.MF diff --git a/org.argeo.app.core/OSGI-INF/maintenanceService.xml b/org.argeo.app.core/OSGI-INF/maintenanceService.xml new file mode 100644 index 0000000..2d495c8 --- /dev/null +++ b/org.argeo.app.core/OSGI-INF/maintenanceService.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/org.argeo.app.core/OSGI-INF/termsManager.xml b/org.argeo.app.core/OSGI-INF/termsManager.xml new file mode 100644 index 0000000..3e6d4c6 --- /dev/null +++ b/org.argeo.app.core/OSGI-INF/termsManager.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/org.argeo.app.core/bnd.bnd b/org.argeo.app.core/bnd.bnd new file mode 100644 index 0000000..fc27132 --- /dev/null +++ b/org.argeo.app.core/bnd.bnd @@ -0,0 +1,14 @@ +Bundle-ActivationPolicy: lazy + +Service-Component:\ +OSGI-INF/termsManager.xml,\ +OSGI-INF/maintenanceService.xml + +Import-Package:\ +javax.transaction,\ +org.osgi.service.useradmin,\ +javax.jcr.nodetype,\ +javax.jcr.security,\ +com.fasterxml.jackson.core,\ +org.argeo.entity,\ +* \ No newline at end of file diff --git a/org.argeo.app.core/build.properties b/org.argeo.app.core/build.properties new file mode 100644 index 0000000..6210e84 --- /dev/null +++ b/org.argeo.app.core/build.properties @@ -0,0 +1,5 @@ +output.. = bin/ +bin.includes = META-INF/,\ + .,\ + OSGI-INF/ +source.. = src/ diff --git a/org.argeo.app.core/pom.xml b/org.argeo.app.core/pom.xml new file mode 100644 index 0000000..285e873 --- /dev/null +++ b/org.argeo.app.core/pom.xml @@ -0,0 +1,32 @@ + + + 4.0.0 + + org.argeo.suite + argeo-suite + 2.3-SNAPSHOT + .. + + org.argeo.app.core + Suite Core + jar + + + org.argeo.suite + org.argeo.app.api + 2.3-SNAPSHOT + + + + + org.argeo.commons + org.argeo.cms + ${version.argeo-commons} + + + org.argeo.commons + org.argeo.cms.jcr + ${version.argeo-commons} + + + diff --git a/org.argeo.app.core/src/org/argeo/docbook/Dbk4Converter.java b/org.argeo.app.core/src/org/argeo/docbook/Dbk4Converter.java new file mode 100644 index 0000000..916dddd --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/docbook/Dbk4Converter.java @@ -0,0 +1,100 @@ +package org.argeo.docbook; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; + +import javax.jcr.ImportUUIDBehavior; +import javax.jcr.Node; +import javax.jcr.RepositoryException; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.Result; +import javax.xml.transform.Source; +import javax.xml.transform.Templates; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; + +import org.apache.xalan.processor.TransformerFactoryImpl; +import org.argeo.jcr.JcrException; +import org.w3c.dom.Document; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +/** Convert from DocBook v4 to DocBook v5, using the official XSL. */ +public class Dbk4Converter { + private final Templates templates; + + public Dbk4Converter() { + try (InputStream in = getClass().getResourceAsStream("db4-upgrade.xsl")) { + Source xsl = new StreamSource(in); + TransformerFactory transformerFactory = new TransformerFactoryImpl(); + templates = transformerFactory.newTemplates(xsl); + } catch (IOException | TransformerConfigurationException e) { + throw new RuntimeException("Cannot initialise DocBook v4 converter", e); + } + } + + public void importXml(Node baseNode, InputStream in) throws IOException { + try (ByteArrayOutputStream out = new ByteArrayOutputStream();) { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setXIncludeAware(true); + factory.setNamespaceAware(true); + DocumentBuilder docBuilder = factory.newDocumentBuilder(); + Document doc = docBuilder.parse(new InputSource(in)); + Source xmlInput = new DOMSource(doc); + +// ContentHandler contentHandler = baseNode.getSession().getImportContentHandler(baseNode.getPath(), +// ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING); + + Transformer transformer = templates.newTransformer(); + Result xmlOutput = new StreamResult(out); + transformer.transform(xmlInput, xmlOutput); + try (InputStream dbk5in = new ByteArrayInputStream(out.toByteArray())) { + baseNode.getSession().importXML(baseNode.getPath(), dbk5in, + ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING); + } + } catch (RepositoryException e) { + throw new JcrException("Cannot import XML to " + baseNode, e); + } catch (TransformerException | SAXException | ParserConfigurationException e) { + throw new RuntimeException("Cannot import DocBook v4 to " + baseNode, e); + } + + } + + public static void main(String[] args) { + try { + + Source xsl = new StreamSource(new File("/usr/share/xml/docbook5/stylesheet/upgrade/db4-upgrade.xsl")); + TransformerFactory transformerFactory = new TransformerFactoryImpl(); + Templates templates = transformerFactory.newTemplates(xsl); + + File inputDir = new File(args[0]); + File outputDir = new File(args[1]); + + for (File inputFile : inputDir.listFiles()) { + Result xmlOutput = new StreamResult(new File(outputDir, inputFile.getName())); + + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setXIncludeAware(true); + factory.setNamespaceAware(true); + DocumentBuilder docBuilder = factory.newDocumentBuilder(); + Document doc = docBuilder.parse(inputFile); + Source xmlInput = new DOMSource(doc); + Transformer transformer = templates.newTransformer(); + transformer.transform(xmlInput, xmlOutput); + } + } catch (Throwable e) { + e.printStackTrace(); + } + } + +} diff --git a/org.argeo.app.core/src/org/argeo/docbook/DbkAttr.java b/org.argeo.app.core/src/org/argeo/docbook/DbkAttr.java new file mode 100644 index 0000000..84097e2 --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/docbook/DbkAttr.java @@ -0,0 +1,13 @@ +package org.argeo.docbook; + +/** Supported DocBook attributes. */ +public enum DbkAttr { + role, + // + fileref, contentwidth, contentdepth + // + ; + + public final static String XLINK_HREF = "xlink:href"; + +} diff --git a/org.argeo.app.core/src/org/argeo/docbook/DbkMsg.java b/org.argeo.app.core/src/org/argeo/docbook/DbkMsg.java new file mode 100644 index 0000000..8e87231 --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/docbook/DbkMsg.java @@ -0,0 +1,14 @@ +package org.argeo.docbook; + +import org.argeo.cms.Localized; + +/** DocBook related messages. */ +public enum DbkMsg implements Localized { + paragraph, deleteParagraph, + // + section, deleteSection, + // + media, deleteMedia, insertPicture, insertVideo, insertParagraph, + // + ; +} diff --git a/org.argeo.app.core/src/org/argeo/docbook/DbkType.java b/org.argeo.app.core/src/org/argeo/docbook/DbkType.java new file mode 100644 index 0000000..005d165 --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/docbook/DbkType.java @@ -0,0 +1,35 @@ +package org.argeo.docbook; + +import org.argeo.entity.JcrName; + +/** Supported DocBook elements */ +public enum DbkType implements JcrName { + book, article, section, + // + info, title, para, + // + mediaobject, imageobject, imagedata, videoobject, videodata, caption, + // + link, + // + ; + + @Override + public String getPrefix() { + return prefix(); + } + + public static String prefix() { + return "dbk"; + } + + @Override + public String getNamespace() { + return namespace(); + } + + public static String namespace() { + return "http://docbook.org/ns/docbook"; + } + +} diff --git a/org.argeo.app.core/src/org/argeo/docbook/DbkUtils.java b/org.argeo.app.core/src/org/argeo/docbook/DbkUtils.java new file mode 100644 index 0000000..f4bf502 --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/docbook/DbkUtils.java @@ -0,0 +1,253 @@ +package org.argeo.docbook; + +import static org.argeo.docbook.DbkType.para; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.Files; +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.entity.EntityType; +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); + + /** Get or add a DocBook element. */ + public static Node getOrAddDbk(Node parent, DbkType child) { + try { + if (!parent.hasNode(child.get())) { + return addDbk(parent, child); + } else { + return parent.getNode(child.get()); + } + } catch (RepositoryException e) { + throw new JcrException("Cannot get or add element " + child.get() + " to " + parent, e); + } + } + + /** Add a DocBook element to this node. */ + public static Node addDbk(Node parent, DbkType child) { + try { + Node node = parent.addNode(child.get(), child.get()); + return node; + } catch (RepositoryException e) { + throw new JcrException("Cannot add element " + child.get() + " to " + parent, e); + } + } + + /** Whether this DocBook element is of this type. */ + public static boolean isDbk(Node node, DbkType type) { + return Jcr.getName(node).equals(type.get()); + } + + /** Whether this node is a DocBook type. */ + public static boolean isDbk(Node node) { + String name = Jcr.getName(node); + for (DbkType type : DbkType.values()) { + if (name.equals(type.get())) + return true; + } + return false; + } + + public static String getTitle(Node node) { + return JcrxApi.getXmlValue(node, DbkType.title.get()); + } + + public static void setTitle(Node node, String txt) { + Node titleNode = getOrAddDbk(node, DbkType.title); + JcrxApi.setXmlValue(node, titleNode, txt); + } + + public static Node getMetadata(Node infoContainer) { + try { + if (!infoContainer.hasNode(DbkType.info.get())) + return null; + Node info = infoContainer.getNode(DbkType.info.get()); + if (!info.hasNode(EntityType.local.get())) + return null; + return info.getNode(EntityType.local.get()); + } catch (RepositoryException e) { + throw new JcrException("Cannot retrieve metadata from " + infoContainer, e); + } + } + + public static Node getChildByRole(Node parent, String role) { + try { + NodeIterator baseSections = parent.getNodes(); + while (baseSections.hasNext()) { + Node n = baseSections.nextNode(); + String r = Jcr.get(n, DbkAttr.role.name()); + if (r != null && r.equals(role)) + return n; + } + return null; + } catch (RepositoryException e) { + throw new JcrException("Cannot get child from " + parent + " with role " + role, e); + } + } + + public static Node addParagraph(Node node, String txt) { + Node p = addDbk(node, para); + JcrxApi.setXmlValue(node, p, txt); + return p; + } + + /** + * Removes a paragraph if it empty. The sesison is not saved. + * + * @return true if the paragraph was empty and it was removed + */ + public static boolean removeIfEmptyParagraph(Node node) { + try { + if (isDbk(node, DbkType.para)) { + NodeIterator nit = node.getNodes(); + if (!nit.hasNext()) { + node.remove(); + return true; + } + Node first = nit.nextNode(); + if (nit.hasNext()) + return false; + if (first.getName().equals(Jcr.JCR_XMLTEXT)) { + String str = Jcr.get(first, Jcr.JCR_XMLCHARACTERS); + if (str != null && str.trim().equals("")) { + node.remove(); + return true; + } + } else { + return false; + } + } + return false; + } catch (RepositoryException e) { + throw new JcrException("Cannot remove possibly empty paragraph", e); + } + } + + public static Node insertImageAfter(Node sibling) { + try { + + Node parent = sibling.getParent(); + Node mediaNode = addDbk(parent, DbkType.mediaobject); + // TODO optimise? + parent.orderBefore(mediaNode.getName() + "[" + mediaNode.getIndex() + "]", + sibling.getName() + "[" + sibling.getIndex() + "]"); + parent.orderBefore(sibling.getName() + "[" + sibling.getIndex() + "]", + mediaNode.getName() + "[" + mediaNode.getIndex() + "]"); + + Node imageNode = addDbk(mediaNode, DbkType.imageobject); + Node imageDataNode = addDbk(imageNode, DbkType.imagedata); +// Node infoNode = imageNode.addNode(DocBookTypes.INFO, DocBookTypes.INFO); +// Node fileNode = JcrUtils.copyBytesAsFile(mediaFolder, EntityType.box.get(), new byte[0]); +// fileNode.addMixin(EntityType.box.get()); +// fileNode.setProperty(EntityNames.SVG_WIDTH, 0); +// fileNode.setProperty(EntityNames.SVG_LENGTH, 0); +// fileNode.addMixin(NodeType.MIX_MIMETYPE); +// +// // we assume this is a folder next to the main DocBook document +// // TODO make it more robust and generic +// String fileRef = mediaNode.getName(); +// imageDataNode.setProperty(DocBookNames.DBK_FILEREF, fileRef); + return mediaNode; + } catch (RepositoryException e) { + throw new JcrException("Cannot insert empty image after " + sibling, e); + } + } + + public static Node insertVideoAfter(Node sibling) { + try { + + Node parent = sibling.getParent(); + Node mediaNode = addDbk(parent, DbkType.mediaobject); + // TODO optimise? + parent.orderBefore(mediaNode.getName() + "[" + mediaNode.getIndex() + "]", + sibling.getName() + "[" + sibling.getIndex() + "]"); + parent.orderBefore(sibling.getName() + "[" + sibling.getIndex() + "]", + mediaNode.getName() + "[" + mediaNode.getIndex() + "]"); + + Node videoNode = addDbk(mediaNode, DbkType.videoobject); + Node videoDataNode = addDbk(videoNode, DbkType.videodata); + return mediaNode; + } catch (RepositoryException e) { + throw new JcrException("Cannot insert empty image after " + sibling, e); + } + } + + public static String getMediaFileref(Node node) { + try { + Node mediadata; + if (node.hasNode(DbkType.imageobject.get())) { + mediadata = node.getNode(DbkType.imageobject.get()).getNode(DbkType.imagedata.get()); + } else if (node.hasNode(DbkType.videoobject.get())) { + mediadata = node.getNode(DbkType.videoobject.get()).getNode(DbkType.videodata.get()); + } else { + throw new IllegalArgumentException("Fileref not found in " + node); + } + + if (mediadata.hasProperty(DbkAttr.fileref.name())) { + return mediadata.getProperty(DbkAttr.fileref.name()).getString(); + } else { + return null; + } + } catch (RepositoryException e) { + throw new JcrException("Cannot retrieve file ref from " + node, e); + } + } + + public static void exportXml(Node node, OutputStream out) throws IOException { + try { + node.getSession().exportDocumentView(node.getPath(), out, false, false); + } catch (RepositoryException e) { + throw new JcrException("Cannot export " + node + " to XML", e); + } + } + + public static void exportToFs(Node baseNode, DbkType type, Path directory) { + String fileName = Jcr.getName(baseNode) + ".dbk.xml"; + Path filePath = directory.resolve(fileName); + Node docBookNode = Jcr.getNode(baseNode, type.get()); + if (docBookNode == null) + throw new IllegalArgumentException("No " + type.get() + " under " + baseNode); + try { + Files.createDirectories(directory); + try (OutputStream out = Files.newOutputStream(filePath)) { + exportXml(docBookNode, out); + } + JcrUtils.copyFilesToFs(baseNode, directory, true); + if (log.isDebugEnabled()) + log.debug("DocBook " + baseNode + " exported to " + filePath.toAbsolutePath()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static void importXml(Node baseNode, InputStream in) throws IOException { + try { + baseNode.getSession().importXML(baseNode.getPath(), in, + ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING); + } catch (RepositoryException e) { + throw new JcrException("Cannot import XML to " + baseNode, e); + } + + } + + /** Singleton. */ + private DbkUtils() { + } + +} diff --git a/org.argeo.app.core/src/org/argeo/docbook/db4-upgrade.xsl b/org.argeo.app.core/src/org/argeo/docbook/db4-upgrade.xsl new file mode 100644 index 0000000..00096be --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/docbook/db4-upgrade.xsl @@ -0,0 +1,1398 @@ + + + + + + + + + + + + + + + + + UNKNOWN + + + + + + + + + + + + Converted by db4-upgrade version + + + + + + + + + + + + + + + + + + Check + + title. + + + + + + + + + + + + + + + Check + + : no title. + + + + + + + + + + + Check + + titleabbrev. + + + + + + + + + + + + + + + + + + + Check + + subtitle. + + + + + + + + + + + + + + + + + + + + + + + + + + + + Check + + title. + + + + + + + + + + + + + + + + + + + + + + Check + + titleabbrev. + + + + + + + + + + + + + + + + + + + Check + + subtitle. + + + + + + + + + + + + + + + + + + + + + + + + + + Discarding title from refentryinfo! + + + + + + + + Discarding titleabbrev from refentryinfo! + + + + + + + + Discarding subtitle from refentryinfo! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Dropping class attribute from productname + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Convert equation without title to informal equation. + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Check conversion of srccredit + (othercredit="srccredit"). + + + + + ??? + + + + + + + + + + + + + + comment + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Converting invpartnumber to biblioid otherclass="invpartnumber". + + + + + + + + + + + + + + Converting contractsponsor to othercredit="contractsponsor". + + + + + + + + + + + + + + + + + + + + + Converting contractnum to othercredit="contractnum". + + + + + ??? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Check conversion of collabname + (orgname role="collabname"). + + + + + + + + + + + + Discarding modespec ( + + ). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Check conversion of contrib + (othercontrib="contrib"). + + + + ??? + + + + + + + + + + + + + + + + + + + + Converting ulink to link. + + + + + + + + + + + + + + Converting ulink to uri. + + + + + + + + + + + + + + + + + + Discarding linkmode on olink. + + + + + + + + + Converting olink targetdocent to targetdoc. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -01- + + + + + -02- + + + + + -03- + + + + + -04- + + + + + -05- + + + + + -06- + + + + + -07- + + + + + -08- + + + + + -09- + + + + + -10- + + + + + -11- + + + + + -12- + + + + + + + + + + + + -01- + + + + + -02- + + + + + -03- + + + + + -04- + + + + + -05- + + + + + -06- + + + + + -07- + + + + + -08- + + + + + -09- + + + + + -10- + + + + + -11- + + + + + -12- + + + + + + + + + + + + + + + + + + Converted + + into + + for + + + + + + + + + + + + + + Unparseable date: + + in + + (Using default: + + ) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Check abstract; moved into info correctly? + + + + + + + + + + + significance + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + beginpage pagenum= + + + Replacing beginpage with comment + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Discarding moreinfo on + + + + + + + + + + + + + + + + + + + + + Discarding float on + + + + + + + Adding floatstyle='normal' on + + + + + normal + + + + + + + Discarding float on + + + + + + + + Discarding float on + + + + + + + Adding floatstyle=' + + ' on + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Converting refmiscinfo@role=type to + @class=other,otherclass=type + + + other + type + + + + + + + + + + + + + + + + + 5.0 + + + + + + + + + 5.0 + + + + + + + + + + + + + + + + + + + ( + + ) + + + +
diff --git a/org.argeo.app.core/src/org/argeo/docbook/docbook-full.cnd b/org.argeo.app.core/src/org/argeo/docbook/docbook-full.cnd new file mode 100644 index 0000000..79c3882 --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/docbook/docbook-full.cnd @@ -0,0 +1,2998 @@ + + + +// + +[argeodbk:titled] +mixin + + dbk:info (dbk:info) = dbk:info * + + dbk:title (dbk:title) = dbk:title * + + dbk:titleabbrev (dbk:titleabbrev) = dbk:titleabbrev * + +[argeodbk:linkingAttributes] +mixin + - linkend (String) + - xlink:actuate (String) + - xlink:arcrole (String) + - xlink:href (String) + - xlink:role (String) + - xlink:show (String) + - xlink:title (String) + - xlink:type (String) + +[argeodbk:freeText] +mixin + + dbk:phrase (dbk:phrase) = dbk:phrase * + + dbk:replaceable (dbk:replaceable) = dbk:replaceable * + + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext * + +[argeodbk:markupInlines] +mixin + + dbk:code (dbk:code) = dbk:code * + + dbk:constant (dbk:constant) = dbk:constant * + + dbk:email (dbk:email) = dbk:email * + + dbk:literal (dbk:literal) = dbk:literal * + + dbk:markup (dbk:markup) = dbk:markup * + + dbk:symbol (dbk:symbol) = dbk:symbol * + + dbk:tag (dbk:tag) = dbk:tag * + + dbk:token (dbk:token) = dbk:token * + + dbk:uri (dbk:uri) = dbk:uri * + +[argeodbk:listElements] +mixin + + dbk:bibliolist (dbk:bibliolist) = dbk:bibliolist * + + dbk:calloutlist (dbk:calloutlist) = dbk:calloutlist * + + dbk:glosslist (dbk:glosslist) = dbk:glosslist * + + dbk:itemizedlist (dbk:itemizedlist) = dbk:itemizedlist * + + dbk:orderedlist (dbk:orderedlist) = dbk:orderedlist * + + dbk:procedure (dbk:procedure) = dbk:procedure * + + dbk:qandaset (dbk:qandaset) = dbk:qandaset * + + dbk:segmentedlist (dbk:segmentedlist) = dbk:segmentedlist * + + dbk:simplelist (dbk:simplelist) = dbk:simplelist * + + dbk:variablelist (dbk:variablelist) = dbk:variablelist * + +[argeodbk:paragraphElements] +mixin + + dbk:formalpara (dbk:formalpara) = dbk:formalpara * + + dbk:para (dbk:para) = dbk:para * + + dbk:simpara (dbk:simpara) = dbk:simpara * + +[argeodbk:indexingInlines] +mixin + + dbk:indexterm (dbk:indexterm) = dbk:indexterm * + +[argeodbk:techDocElements] +mixin + + dbk:caution (dbk:caution) = dbk:caution * + + dbk:classsynopsis (dbk:classsynopsis) = dbk:classsynopsis * + + dbk:cmdsynopsis (dbk:cmdsynopsis) = dbk:cmdsynopsis * + + dbk:constraintdef (dbk:constraintdef) = dbk:constraintdef * + + dbk:constructorsynopsis (dbk:constructorsynopsis) = dbk:constructorsynopsis * + + dbk:destructorsynopsis (dbk:destructorsynopsis) = dbk:destructorsynopsis * + + dbk:equation (dbk:equation) = dbk:equation * + + dbk:example (dbk:example) = dbk:example * + + dbk:fieldsynopsis (dbk:fieldsynopsis) = dbk:fieldsynopsis * + + dbk:figure (dbk:figure) = dbk:figure * + + dbk:funcsynopsis (dbk:funcsynopsis) = dbk:funcsynopsis * + + dbk:important (dbk:important) = dbk:important * + + dbk:informalequation (dbk:informalequation) = dbk:informalequation * + + dbk:informalexample (dbk:informalexample) = dbk:informalexample * + + dbk:informalfigure (dbk:informalfigure) = dbk:informalfigure * + + dbk:informaltable (dbk:informaltable) = dbk:informaltable * + + dbk:literallayout (dbk:literallayout) = dbk:literallayout * + + dbk:methodsynopsis (dbk:methodsynopsis) = dbk:methodsynopsis * + + dbk:msgset (dbk:msgset) = dbk:msgset * + + dbk:note (dbk:note) = dbk:note * + + dbk:productionset (dbk:productionset) = dbk:productionset * + + dbk:programlisting (dbk:programlisting) = dbk:programlisting * + + dbk:programlistingco (dbk:programlistingco) = dbk:programlistingco * + + dbk:screen (dbk:screen) = dbk:screen * + + dbk:screenco (dbk:screenco) = dbk:screenco * + + dbk:synopsis (dbk:synopsis) = dbk:synopsis * + + dbk:table (dbk:table) = dbk:table * + + dbk:task (dbk:task) = dbk:task * + + dbk:tip (dbk:tip) = dbk:tip * + + dbk:warning (dbk:warning) = dbk:warning * + +[argeodbk:techDocInlines] +mixin + + dbk:accel (dbk:accel) = dbk:accel * + + dbk:application (dbk:application) = dbk:application * + + dbk:classname (dbk:classname) = dbk:classname * + + dbk:command (dbk:command) = dbk:command * + + dbk:computeroutput (dbk:computeroutput) = dbk:computeroutput * + + dbk:database (dbk:database) = dbk:database * + + dbk:envar (dbk:envar) = dbk:envar * + + dbk:errorcode (dbk:errorcode) = dbk:errorcode * + + dbk:errorname (dbk:errorname) = dbk:errorname * + + dbk:errortext (dbk:errortext) = dbk:errortext * + + dbk:errortype (dbk:errortype) = dbk:errortype * + + dbk:exceptionname (dbk:exceptionname) = dbk:exceptionname * + + dbk:filename (dbk:filename) = dbk:filename * + + dbk:function (dbk:function) = dbk:function * + + dbk:guibutton (dbk:guibutton) = dbk:guibutton * + + dbk:guiicon (dbk:guiicon) = dbk:guiicon * + + dbk:guilabel (dbk:guilabel) = dbk:guilabel * + + dbk:guimenu (dbk:guimenu) = dbk:guimenu * + + dbk:guimenuitem (dbk:guimenuitem) = dbk:guimenuitem * + + dbk:guisubmenu (dbk:guisubmenu) = dbk:guisubmenu * + + dbk:hardware (dbk:hardware) = dbk:hardware * + + dbk:initializer (dbk:initializer) = dbk:initializer * + + dbk:inlineequation (dbk:inlineequation) = dbk:inlineequation * + + dbk:interfacename (dbk:interfacename) = dbk:interfacename * + + dbk:keycap (dbk:keycap) = dbk:keycap * + + dbk:keycode (dbk:keycode) = dbk:keycode * + + dbk:keycombo (dbk:keycombo) = dbk:keycombo * + + dbk:keysym (dbk:keysym) = dbk:keysym * + + dbk:menuchoice (dbk:menuchoice) = dbk:menuchoice * + + dbk:methodname (dbk:methodname) = dbk:methodname * + + dbk:modifier (dbk:modifier) = dbk:modifier * + + dbk:mousebutton (dbk:mousebutton) = dbk:mousebutton * + + dbk:nonterminal (dbk:nonterminal) = dbk:nonterminal * + + dbk:ooclass (dbk:ooclass) = dbk:ooclass * + + dbk:ooexception (dbk:ooexception) = dbk:ooexception * + + dbk:oointerface (dbk:oointerface) = dbk:oointerface * + + dbk:option (dbk:option) = dbk:option * + + dbk:optional (dbk:optional) = dbk:optional * + + dbk:package (dbk:package) = dbk:package * + + dbk:parameter (dbk:parameter) = dbk:parameter * + + dbk:productname (dbk:productname) = dbk:productname * + + dbk:productnumber (dbk:productnumber) = dbk:productnumber * + + dbk:prompt (dbk:prompt) = dbk:prompt * + + dbk:property (dbk:property) = dbk:property * + + dbk:returnvalue (dbk:returnvalue) = dbk:returnvalue * + + dbk:shortcut (dbk:shortcut) = dbk:shortcut * + + dbk:systemitem (dbk:systemitem) = dbk:systemitem * + + dbk:termdef (dbk:termdef) = dbk:termdef * + + dbk:trademark (dbk:trademark) = dbk:trademark * + + dbk:type (dbk:type) = dbk:type * + + dbk:userinput (dbk:userinput) = dbk:userinput * + + dbk:varname (dbk:varname) = dbk:varname * + +[argeodbk:publishingElements] +mixin + + dbk:address (dbk:address) = dbk:address * + + dbk:blockquote (dbk:blockquote) = dbk:blockquote * + + dbk:epigraph (dbk:epigraph) = dbk:epigraph * + + dbk:sidebar (dbk:sidebar) = dbk:sidebar * + +[argeodbk:ubiquitousInlines] +mixin + + dbk:alt (dbk:alt) = dbk:alt * + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:biblioref (dbk:biblioref) = dbk:biblioref * + + dbk:inlinemediaobject (dbk:inlinemediaobject) = dbk:inlinemediaobject * + + dbk:link (dbk:link) = dbk:link * + + dbk:olink (dbk:olink) = dbk:olink * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:subscript (dbk:subscript) = dbk:subscript * + + dbk:superscript (dbk:superscript) = dbk:superscript * + + dbk:xref (dbk:xref) = dbk:xref * + +[argeodbk:abstractSection] +mixin + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bibliography (dbk:bibliography) = dbk:bibliography * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:glossary (dbk:glossary) = dbk:glossary * + + dbk:index (dbk:index) = dbk:index * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + + dbk:toc (dbk:toc) = dbk:toc * + - label (String) + - status (String) + +[argeodbk:bibliographyInlines] +mixin + + dbk:author (dbk:author) = dbk:author * + + dbk:citation (dbk:citation) = dbk:citation * + + dbk:citebiblioid (dbk:citebiblioid) = dbk:citebiblioid * + + dbk:citerefentry (dbk:citerefentry) = dbk:citerefentry * + + dbk:citetitle (dbk:citetitle) = dbk:citetitle * + + dbk:editor (dbk:editor) = dbk:editor * + + dbk:jobtitle (dbk:jobtitle) = dbk:jobtitle * + + dbk:org (dbk:org) = dbk:org * + + dbk:orgname (dbk:orgname) = dbk:orgname * + + dbk:person (dbk:person) = dbk:person * + + dbk:personname (dbk:personname) = dbk:personname * + +[argeodbk:publishingInlines] +mixin + + dbk:abbrev (dbk:abbrev) = dbk:abbrev * + + dbk:acronym (dbk:acronym) = dbk:acronym * + + dbk:coref (dbk:coref) = dbk:coref * + + dbk:date (dbk:date) = dbk:date * + + dbk:emphasis (dbk:emphasis) = dbk:emphasis * + + dbk:firstterm (dbk:firstterm) = dbk:firstterm * + + dbk:footnote (dbk:footnote) = dbk:footnote * + + dbk:footnoteref (dbk:footnoteref) = dbk:footnoteref * + + dbk:foreignphrase (dbk:foreignphrase) = dbk:foreignphrase * + + dbk:glossterm (dbk:glossterm) = dbk:glossterm * + + dbk:quote (dbk:quote) = dbk:quote * + + dbk:wordasword (dbk:wordasword) = dbk:wordasword * + +[argeodbk:base] +abstract +orderable + - annotations (String) + - arch (String) + - audience (String) + - condition (String) + - conformance (String) + - dir (String) + - os (String) + - remap (String) + - revision (String) + - revisionflag (String) + - role (String) + - security (String) + - userlevel (String) + - vendor (String) + - version (String) + - wordsize (String) + - xreflabel (String) + +[dbk:abbrev] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + + dbk:trademark (dbk:trademark) = dbk:trademark * + +[dbk:abstract] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:paragraphElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + +[dbk:accel] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:acknowledgements] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + - label (String) + - status (String) + +[dbk:acronym] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + + dbk:trademark (dbk:trademark) = dbk:trademark * + +[dbk:address] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + + dbk:city (dbk:city) = dbk:city * + + dbk:country (dbk:country) = dbk:country * + + dbk:email (dbk:email) = dbk:email * + + dbk:fax (dbk:fax) = dbk:fax * + + dbk:otheraddr (dbk:otheraddr) = dbk:otheraddr * + + dbk:personname (dbk:personname) = dbk:personname * + + dbk:phone (dbk:phone) = dbk:phone * + + dbk:pob (dbk:pob) = dbk:pob * + + dbk:postcode (dbk:postcode) = dbk:postcode * + + dbk:state (dbk:state) = dbk:state * + + dbk:street (dbk:street) = dbk:street * + + dbk:uri (dbk:uri) = dbk:uri * + - continuation (String) + - language (String) + - linenumbering (String) + - startinglinenumber (String) + - xml:space (String) + +[dbk:affiliation] > argeodbk:base, argeodbk:linkingAttributes + + dbk:address (dbk:address) = dbk:address * + + dbk:jobtitle (dbk:jobtitle) = dbk:jobtitle * + + dbk:org (dbk:org) = dbk:org + + dbk:orgdiv (dbk:orgdiv) = dbk:orgdiv * + + dbk:orgname (dbk:orgname) = dbk:orgname + + dbk:shortaffil (dbk:shortaffil) = dbk:shortaffil + +[dbk:alt] > argeodbk:base + + dbk:inlinemediaobject (dbk:inlinemediaobject) = dbk:inlinemediaobject * + + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext * + +[dbk:anchor] > argeodbk:base + +[dbk:annotation] > argeodbk:base, argeodbk:indexingInlines, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + - annotates (String) + +[dbk:answer] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:label (dbk:label) = dbk:label + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + +[dbk:appendix] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:refentry (dbk:refentry) = dbk:refentry * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:sect1 (dbk:sect1) = dbk:sect1 * + + dbk:section (dbk:section) = dbk:section * + + dbk:simplesect (dbk:simplesect) = dbk:simplesect * + + dbk:simplesect (dbk:simplesect) = dbk:simplesect * + +[dbk:application] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + - class (String) + +[dbk:arc] > argeodbk:base + - xlink:from (String) + - xlink:to (String) + +[dbk:area] > argeodbk:base + + dbk:alt (dbk:alt) = dbk:alt + - coords (String) + - label (String) + - linkends (String) + - otherunits (String) + - units (String) + +[dbk:areaset] > argeodbk:base + + dbk:area (dbk:area) = dbk:area * + - label (String) + - linkends (String) + - otherunits (String) + - units (String) + +[dbk:areaspec] > argeodbk:base, argeodbk:linkingAttributes + + dbk:area (dbk:area) = dbk:area * + + dbk:areaset (dbk:areaset) = dbk:areaset * + - otherunits (String) + - units (String) + +[dbk:arg] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + + dbk:arg (dbk:arg) = dbk:arg * + + dbk:group (dbk:group) = dbk:group * + + dbk:option (dbk:option) = dbk:option * + + dbk:sbr (dbk:sbr) = dbk:sbr * + + dbk:synopfragmentref (dbk:synopfragmentref) = dbk:synopfragmentref * + - choice (String) + - rep (String) + +[dbk:article] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:acknowledgements (dbk:acknowledgements) = dbk:acknowledgements * + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:appendix (dbk:appendix) = dbk:appendix * + + dbk:colophon (dbk:colophon) = dbk:colophon * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:refentry (dbk:refentry) = dbk:refentry * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:sect1 (dbk:sect1) = dbk:sect1 * + + dbk:section (dbk:section) = dbk:section * + + dbk:simplesect (dbk:simplesect) = dbk:simplesect * + + dbk:simplesect (dbk:simplesect) = dbk:simplesect * + - class (String) + +[dbk:artpagenums] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:attribution] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + + dbk:citation (dbk:citation) = dbk:citation * + + dbk:citetitle (dbk:citetitle) = dbk:citetitle * + + dbk:person (dbk:person) = dbk:person * + + dbk:personname (dbk:personname) = dbk:personname * + +[dbk:audiodata] > argeodbk:base + + dbk:info (dbk:info) = dbk:info + - entityref (String) + - fileref (String) + - format (String) + +[dbk:audioobject] > argeodbk:base, argeodbk:linkingAttributes + + dbk:audiodata (dbk:audiodata) = dbk:audiodata + + dbk:info (dbk:info) = dbk:info + +[dbk:author] > argeodbk:base, argeodbk:linkingAttributes + + dbk:address (dbk:address) = dbk:address * + + dbk:affiliation (dbk:affiliation) = dbk:affiliation * + + dbk:contrib (dbk:contrib) = dbk:contrib * + + dbk:email (dbk:email) = dbk:email * + + dbk:orgdiv (dbk:orgdiv) = dbk:orgdiv * + + dbk:orgname (dbk:orgname) = dbk:orgname + + dbk:personblurb (dbk:personblurb) = dbk:personblurb * + + dbk:personname (dbk:personname) = dbk:personname + + dbk:uri (dbk:uri) = dbk:uri * + +[dbk:authorgroup] > argeodbk:base, argeodbk:linkingAttributes + + dbk:author (dbk:author) = dbk:author * + + dbk:editor (dbk:editor) = dbk:editor * + + dbk:othercredit (dbk:othercredit) = dbk:othercredit * + +[dbk:authorinitials] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:bibliocoverage] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + - otherspatial (String) + - othertemporal (String) + - spatial (String) + - temporal (String) + +[dbk:bibliodiv] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:biblioentry (dbk:biblioentry) = dbk:biblioentry * + + dbk:bibliomixed (dbk:bibliomixed) = dbk:bibliomixed * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + - label (String) + - status (String) + +[dbk:biblioentry] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:publishingInlines + + dbk:abstract (dbk:abstract) = dbk:abstract * + + dbk:address (dbk:address) = dbk:address * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:artpagenums (dbk:artpagenums) = dbk:artpagenums * + + dbk:author (dbk:author) = dbk:author * + + dbk:authorgroup (dbk:authorgroup) = dbk:authorgroup * + + dbk:authorinitials (dbk:authorinitials) = dbk:authorinitials * + + dbk:bibliocoverage (dbk:bibliocoverage) = dbk:bibliocoverage * + + dbk:biblioid (dbk:biblioid) = dbk:biblioid * + + dbk:bibliomisc (dbk:bibliomisc) = dbk:bibliomisc * + + dbk:bibliomset (dbk:bibliomset) = dbk:bibliomset * + + dbk:bibliorelation (dbk:bibliorelation) = dbk:bibliorelation * + + dbk:biblioset (dbk:biblioset) = dbk:biblioset * + + dbk:bibliosource (dbk:bibliosource) = dbk:bibliosource * + + dbk:citebiblioid (dbk:citebiblioid) = dbk:citebiblioid * + + dbk:citerefentry (dbk:citerefentry) = dbk:citerefentry * + + dbk:citetitle (dbk:citetitle) = dbk:citetitle * + + dbk:collab (dbk:collab) = dbk:collab * + + dbk:confgroup (dbk:confgroup) = dbk:confgroup * + + dbk:contractnum (dbk:contractnum) = dbk:contractnum * + + dbk:contractsponsor (dbk:contractsponsor) = dbk:contractsponsor * + + dbk:copyright (dbk:copyright) = dbk:copyright * + + dbk:cover (dbk:cover) = dbk:cover * + + dbk:edition (dbk:edition) = dbk:edition * + + dbk:editor (dbk:editor) = dbk:editor * + + dbk:extendedlink (dbk:extendedlink) = dbk:extendedlink * + + dbk:issuenum (dbk:issuenum) = dbk:issuenum * + + dbk:itermset (dbk:itermset) = dbk:itermset * + + dbk:keywordset (dbk:keywordset) = dbk:keywordset * + + dbk:legalnotice (dbk:legalnotice) = dbk:legalnotice * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:org (dbk:org) = dbk:org * + + dbk:orgname (dbk:orgname) = dbk:orgname * + + dbk:othercredit (dbk:othercredit) = dbk:othercredit * + + dbk:pagenums (dbk:pagenums) = dbk:pagenums * + + dbk:person (dbk:person) = dbk:person * + + dbk:personblurb (dbk:personblurb) = dbk:personblurb * + + dbk:personname (dbk:personname) = dbk:personname * + + dbk:phrase (dbk:phrase) = dbk:phrase * + + dbk:printhistory (dbk:printhistory) = dbk:printhistory * + + dbk:productname (dbk:productname) = dbk:productname * + + dbk:productnumber (dbk:productnumber) = dbk:productnumber * + + dbk:pubdate (dbk:pubdate) = dbk:pubdate * + + dbk:publisher (dbk:publisher) = dbk:publisher * + + dbk:publishername (dbk:publishername) = dbk:publishername * + + dbk:releaseinfo (dbk:releaseinfo) = dbk:releaseinfo * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:seriesvolnums (dbk:seriesvolnums) = dbk:seriesvolnums * + + dbk:subjectset (dbk:subjectset) = dbk:subjectset * + + dbk:subscript (dbk:subscript) = dbk:subscript * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + + dbk:superscript (dbk:superscript) = dbk:superscript * + + dbk:title (dbk:title) = dbk:title * + + dbk:titleabbrev (dbk:titleabbrev) = dbk:titleabbrev * + + dbk:volumenum (dbk:volumenum) = dbk:volumenum * + +[dbk:bibliography] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bibliodiv (dbk:bibliodiv) = dbk:bibliodiv * + + dbk:biblioentry (dbk:biblioentry) = dbk:biblioentry * + + dbk:bibliomixed (dbk:bibliomixed) = dbk:bibliomixed * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + - label (String) + - status (String) + +[dbk:biblioid] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + - class (String) + - otherclass (String) + +[dbk:bibliolist] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:biblioentry (dbk:biblioentry) = dbk:biblioentry * + + dbk:bibliomixed (dbk:bibliomixed) = dbk:bibliomixed * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + +[dbk:bibliomisc] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:bibliomixed] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:publishingInlines + + dbk:abstract (dbk:abstract) = dbk:abstract * + + dbk:address (dbk:address) = dbk:address * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:artpagenums (dbk:artpagenums) = dbk:artpagenums * + + dbk:author (dbk:author) = dbk:author * + + dbk:authorgroup (dbk:authorgroup) = dbk:authorgroup * + + dbk:authorinitials (dbk:authorinitials) = dbk:authorinitials * + + dbk:bibliocoverage (dbk:bibliocoverage) = dbk:bibliocoverage * + + dbk:biblioid (dbk:biblioid) = dbk:biblioid * + + dbk:bibliomisc (dbk:bibliomisc) = dbk:bibliomisc * + + dbk:bibliomset (dbk:bibliomset) = dbk:bibliomset * + + dbk:bibliorelation (dbk:bibliorelation) = dbk:bibliorelation * + + dbk:biblioset (dbk:biblioset) = dbk:biblioset * + + dbk:bibliosource (dbk:bibliosource) = dbk:bibliosource * + + dbk:citebiblioid (dbk:citebiblioid) = dbk:citebiblioid * + + dbk:citerefentry (dbk:citerefentry) = dbk:citerefentry * + + dbk:citetitle (dbk:citetitle) = dbk:citetitle * + + dbk:collab (dbk:collab) = dbk:collab * + + dbk:confgroup (dbk:confgroup) = dbk:confgroup * + + dbk:contractnum (dbk:contractnum) = dbk:contractnum * + + dbk:contractsponsor (dbk:contractsponsor) = dbk:contractsponsor * + + dbk:copyright (dbk:copyright) = dbk:copyright * + + dbk:cover (dbk:cover) = dbk:cover * + + dbk:edition (dbk:edition) = dbk:edition * + + dbk:editor (dbk:editor) = dbk:editor * + + dbk:extendedlink (dbk:extendedlink) = dbk:extendedlink * + + dbk:issuenum (dbk:issuenum) = dbk:issuenum * + + dbk:itermset (dbk:itermset) = dbk:itermset * + + dbk:keywordset (dbk:keywordset) = dbk:keywordset * + + dbk:legalnotice (dbk:legalnotice) = dbk:legalnotice * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:org (dbk:org) = dbk:org * + + dbk:orgname (dbk:orgname) = dbk:orgname * + + dbk:othercredit (dbk:othercredit) = dbk:othercredit * + + dbk:pagenums (dbk:pagenums) = dbk:pagenums * + + dbk:person (dbk:person) = dbk:person * + + dbk:personblurb (dbk:personblurb) = dbk:personblurb * + + dbk:personname (dbk:personname) = dbk:personname * + + dbk:phrase (dbk:phrase) = dbk:phrase * + + dbk:printhistory (dbk:printhistory) = dbk:printhistory * + + dbk:productname (dbk:productname) = dbk:productname * + + dbk:productnumber (dbk:productnumber) = dbk:productnumber * + + dbk:pubdate (dbk:pubdate) = dbk:pubdate * + + dbk:publisher (dbk:publisher) = dbk:publisher * + + dbk:publishername (dbk:publishername) = dbk:publishername * + + dbk:releaseinfo (dbk:releaseinfo) = dbk:releaseinfo * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:seriesvolnums (dbk:seriesvolnums) = dbk:seriesvolnums * + + dbk:subjectset (dbk:subjectset) = dbk:subjectset * + + dbk:subscript (dbk:subscript) = dbk:subscript * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + + dbk:superscript (dbk:superscript) = dbk:superscript * + + dbk:title (dbk:title) = dbk:title * + + dbk:titleabbrev (dbk:titleabbrev) = dbk:titleabbrev * + + dbk:volumenum (dbk:volumenum) = dbk:volumenum * + + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext * + +[dbk:bibliomset] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:publishingInlines, argeodbk:ubiquitousInlines + + dbk:abstract (dbk:abstract) = dbk:abstract * + + dbk:address (dbk:address) = dbk:address * + + dbk:artpagenums (dbk:artpagenums) = dbk:artpagenums * + + dbk:author (dbk:author) = dbk:author * + + dbk:authorgroup (dbk:authorgroup) = dbk:authorgroup * + + dbk:authorinitials (dbk:authorinitials) = dbk:authorinitials * + + dbk:bibliocoverage (dbk:bibliocoverage) = dbk:bibliocoverage * + + dbk:biblioid (dbk:biblioid) = dbk:biblioid * + + dbk:bibliomisc (dbk:bibliomisc) = dbk:bibliomisc * + + dbk:bibliomset (dbk:bibliomset) = dbk:bibliomset * + + dbk:bibliorelation (dbk:bibliorelation) = dbk:bibliorelation * + + dbk:biblioset (dbk:biblioset) = dbk:biblioset * + + dbk:bibliosource (dbk:bibliosource) = dbk:bibliosource * + + dbk:citebiblioid (dbk:citebiblioid) = dbk:citebiblioid * + + dbk:citerefentry (dbk:citerefentry) = dbk:citerefentry * + + dbk:citetitle (dbk:citetitle) = dbk:citetitle * + + dbk:collab (dbk:collab) = dbk:collab * + + dbk:confgroup (dbk:confgroup) = dbk:confgroup * + + dbk:contractnum (dbk:contractnum) = dbk:contractnum * + + dbk:contractsponsor (dbk:contractsponsor) = dbk:contractsponsor * + + dbk:copyright (dbk:copyright) = dbk:copyright * + + dbk:cover (dbk:cover) = dbk:cover * + + dbk:edition (dbk:edition) = dbk:edition * + + dbk:editor (dbk:editor) = dbk:editor * + + dbk:extendedlink (dbk:extendedlink) = dbk:extendedlink * + + dbk:issuenum (dbk:issuenum) = dbk:issuenum * + + dbk:itermset (dbk:itermset) = dbk:itermset * + + dbk:keywordset (dbk:keywordset) = dbk:keywordset * + + dbk:legalnotice (dbk:legalnotice) = dbk:legalnotice * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:org (dbk:org) = dbk:org * + + dbk:orgname (dbk:orgname) = dbk:orgname * + + dbk:othercredit (dbk:othercredit) = dbk:othercredit * + + dbk:pagenums (dbk:pagenums) = dbk:pagenums * + + dbk:person (dbk:person) = dbk:person * + + dbk:personblurb (dbk:personblurb) = dbk:personblurb * + + dbk:personname (dbk:personname) = dbk:personname * + + dbk:printhistory (dbk:printhistory) = dbk:printhistory * + + dbk:productname (dbk:productname) = dbk:productname * + + dbk:productnumber (dbk:productnumber) = dbk:productnumber * + + dbk:pubdate (dbk:pubdate) = dbk:pubdate * + + dbk:publisher (dbk:publisher) = dbk:publisher * + + dbk:publishername (dbk:publishername) = dbk:publishername * + + dbk:releaseinfo (dbk:releaseinfo) = dbk:releaseinfo * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:seriesvolnums (dbk:seriesvolnums) = dbk:seriesvolnums * + + dbk:subjectset (dbk:subjectset) = dbk:subjectset * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + + dbk:title (dbk:title) = dbk:title * + + dbk:titleabbrev (dbk:titleabbrev) = dbk:titleabbrev * + + dbk:volumenum (dbk:volumenum) = dbk:volumenum * + - relation (String) + +[dbk:biblioref] > argeodbk:base, argeodbk:linkingAttributes + - begin (String) + - end (String) + - endterm (Reference) + - units (String) + - xrefstyle (String) + +[dbk:bibliorelation] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + - class (String) + - otherclass (String) + - othertype (String) + - type (String) + +[dbk:biblioset] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:publishingInlines + + dbk:abstract (dbk:abstract) = dbk:abstract * + + dbk:address (dbk:address) = dbk:address * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:artpagenums (dbk:artpagenums) = dbk:artpagenums * + + dbk:author (dbk:author) = dbk:author * + + dbk:authorgroup (dbk:authorgroup) = dbk:authorgroup * + + dbk:authorinitials (dbk:authorinitials) = dbk:authorinitials * + + dbk:bibliocoverage (dbk:bibliocoverage) = dbk:bibliocoverage * + + dbk:biblioid (dbk:biblioid) = dbk:biblioid * + + dbk:bibliomisc (dbk:bibliomisc) = dbk:bibliomisc * + + dbk:bibliomset (dbk:bibliomset) = dbk:bibliomset * + + dbk:bibliorelation (dbk:bibliorelation) = dbk:bibliorelation * + + dbk:biblioset (dbk:biblioset) = dbk:biblioset * + + dbk:bibliosource (dbk:bibliosource) = dbk:bibliosource * + + dbk:citebiblioid (dbk:citebiblioid) = dbk:citebiblioid * + + dbk:citerefentry (dbk:citerefentry) = dbk:citerefentry * + + dbk:citetitle (dbk:citetitle) = dbk:citetitle * + + dbk:collab (dbk:collab) = dbk:collab * + + dbk:confgroup (dbk:confgroup) = dbk:confgroup * + + dbk:contractnum (dbk:contractnum) = dbk:contractnum * + + dbk:contractsponsor (dbk:contractsponsor) = dbk:contractsponsor * + + dbk:copyright (dbk:copyright) = dbk:copyright * + + dbk:cover (dbk:cover) = dbk:cover * + + dbk:edition (dbk:edition) = dbk:edition * + + dbk:editor (dbk:editor) = dbk:editor * + + dbk:extendedlink (dbk:extendedlink) = dbk:extendedlink * + + dbk:issuenum (dbk:issuenum) = dbk:issuenum * + + dbk:itermset (dbk:itermset) = dbk:itermset * + + dbk:keywordset (dbk:keywordset) = dbk:keywordset * + + dbk:legalnotice (dbk:legalnotice) = dbk:legalnotice * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:org (dbk:org) = dbk:org * + + dbk:orgname (dbk:orgname) = dbk:orgname * + + dbk:othercredit (dbk:othercredit) = dbk:othercredit * + + dbk:pagenums (dbk:pagenums) = dbk:pagenums * + + dbk:person (dbk:person) = dbk:person * + + dbk:personblurb (dbk:personblurb) = dbk:personblurb * + + dbk:personname (dbk:personname) = dbk:personname * + + dbk:phrase (dbk:phrase) = dbk:phrase * + + dbk:printhistory (dbk:printhistory) = dbk:printhistory * + + dbk:productname (dbk:productname) = dbk:productname * + + dbk:productnumber (dbk:productnumber) = dbk:productnumber * + + dbk:pubdate (dbk:pubdate) = dbk:pubdate * + + dbk:publisher (dbk:publisher) = dbk:publisher * + + dbk:publishername (dbk:publishername) = dbk:publishername * + + dbk:releaseinfo (dbk:releaseinfo) = dbk:releaseinfo * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:seriesvolnums (dbk:seriesvolnums) = dbk:seriesvolnums * + + dbk:subjectset (dbk:subjectset) = dbk:subjectset * + + dbk:subscript (dbk:subscript) = dbk:subscript * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + + dbk:superscript (dbk:superscript) = dbk:superscript * + + dbk:title (dbk:title) = dbk:title * + + dbk:titleabbrev (dbk:titleabbrev) = dbk:titleabbrev * + + dbk:volumenum (dbk:volumenum) = dbk:volumenum * + - relation (String) + +[dbk:bibliosource] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + - class (String) + - otherclass (String) + +[dbk:blockquote] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:attribution (dbk:attribution) = dbk:attribution + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + +[dbk:book] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled + + dbk:acknowledgements (dbk:acknowledgements) = dbk:acknowledgements * + + dbk:appendix (dbk:appendix) = dbk:appendix * + + dbk:article (dbk:article) = dbk:article * + + dbk:bibliography (dbk:bibliography) = dbk:bibliography * + + dbk:chapter (dbk:chapter) = dbk:chapter * + + dbk:colophon (dbk:colophon) = dbk:colophon * + + dbk:dedication (dbk:dedication) = dbk:dedication * + + dbk:glossary (dbk:glossary) = dbk:glossary * + + dbk:index (dbk:index) = dbk:index * + + dbk:part (dbk:part) = dbk:part * + + dbk:preface (dbk:preface) = dbk:preface * + + dbk:reference (dbk:reference) = dbk:reference * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + + dbk:toc (dbk:toc) = dbk:toc * + - label (String) + - status (String) + +[dbk:bridgehead] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + - otherrenderas (String) + - renderas (String) + +[dbk:callout] > argeodbk:base, argeodbk:indexingInlines, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + - arearefs (String) + +[dbk:calloutlist] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:callout (dbk:callout) = dbk:callout * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + +[dbk:caption] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext * + - class (String) + - lang (String) + - onclick (String) + - ondblclick (String) + - onkeydown (String) + - onkeypress (String) + - onkeyup (String) + - onmousedown (String) + - onmousemove (String) + - onmouseout (String) + - onmouseover (String) + - onmouseup (String) + - style (String) + - title (String) + +[dbk:caution] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + +[dbk:chapter] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:refentry (dbk:refentry) = dbk:refentry * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:sect1 (dbk:sect1) = dbk:sect1 * + + dbk:section (dbk:section) = dbk:section * + + dbk:simplesect (dbk:simplesect) = dbk:simplesect * + + dbk:simplesect (dbk:simplesect) = dbk:simplesect * + +[dbk:citation] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + +[dbk:citebiblioid] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + - class (String) + - otherclass (String) + +[dbk:citerefentry] > argeodbk:base, argeodbk:linkingAttributes + + dbk:manvolnum (dbk:manvolnum) = dbk:manvolnum + + dbk:refentrytitle (dbk:refentrytitle) = dbk:refentrytitle + +[dbk:citetitle] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + - pubwork (String) + +[dbk:city] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:classname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:classsynopsis] > argeodbk:base, argeodbk:linkingAttributes + + dbk:classsynopsisinfo (dbk:classsynopsisinfo) = dbk:classsynopsisinfo * + + dbk:constructorsynopsis (dbk:constructorsynopsis) = dbk:constructorsynopsis * + + dbk:destructorsynopsis (dbk:destructorsynopsis) = dbk:destructorsynopsis * + + dbk:fieldsynopsis (dbk:fieldsynopsis) = dbk:fieldsynopsis * + + dbk:methodsynopsis (dbk:methodsynopsis) = dbk:methodsynopsis * + + dbk:ooclass (dbk:ooclass) = dbk:ooclass * + + dbk:ooexception (dbk:ooexception) = dbk:ooexception * + + dbk:oointerface (dbk:oointerface) = dbk:oointerface * + - class (String) + - language (String) + +[dbk:classsynopsisinfo] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + + dbk:co (dbk:co) = dbk:co * + + dbk:info (dbk:info) = dbk:info * + + dbk:lineannotation (dbk:lineannotation) = dbk:lineannotation * + + dbk:textobject (dbk:textobject) = dbk:textobject * + - continuation (String) + - language (String) + - linenumbering (String) + - startinglinenumber (String) + - xml:space (String) + +[dbk:cmdsynopsis] > argeodbk:base, argeodbk:linkingAttributes + + dbk:arg (dbk:arg) = dbk:arg * + + dbk:command (dbk:command) = dbk:command * + + dbk:group (dbk:group) = dbk:group * + + dbk:info (dbk:info) = dbk:info + + dbk:sbr (dbk:sbr) = dbk:sbr * + + dbk:synopfragment (dbk:synopfragment) = dbk:synopfragment * + - cmdlength (String) + - label (String) + - sepchar (String) + +[dbk:co] > argeodbk:base + - label (String) + - linkends (String) + +[dbk:code] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + + dbk:classname (dbk:classname) = dbk:classname * + + dbk:exceptionname (dbk:exceptionname) = dbk:exceptionname * + + dbk:function (dbk:function) = dbk:function * + + dbk:initializer (dbk:initializer) = dbk:initializer * + + dbk:interfacename (dbk:interfacename) = dbk:interfacename * + + dbk:methodname (dbk:methodname) = dbk:methodname * + + dbk:modifier (dbk:modifier) = dbk:modifier * + + dbk:ooclass (dbk:ooclass) = dbk:ooclass * + + dbk:ooexception (dbk:ooexception) = dbk:ooexception * + + dbk:oointerface (dbk:oointerface) = dbk:oointerface * + + dbk:parameter (dbk:parameter) = dbk:parameter * + + dbk:returnvalue (dbk:returnvalue) = dbk:returnvalue * + + dbk:type (dbk:type) = dbk:type * + + dbk:varname (dbk:varname) = dbk:varname * + - language (String) + +[dbk:col] > nt:base + - align (String) + - annotations (String) + - arch (String) + - audience (String) + - char (String) + - charoff (String) + - class (String) + - condition (String) + - conformance (String) + - dir (String) + - lang (String) + - onclick (String) + - ondblclick (String) + - onkeydown (String) + - onkeypress (String) + - onkeyup (String) + - onmousedown (String) + - onmousemove (String) + - onmouseout (String) + - onmouseover (String) + - onmouseup (String) + - os (String) + - remap (String) + - revision (String) + - revisionflag (String) + - security (String) + - span (String) + - style (String) + - title (String) + - userlevel (String) + - valign (String) + - vendor (String) + - version (String) + - width (String) + - wordsize (String) + - xreflabel (String) + - xml:base (String) + - xml:id (String) + - xml:lang (String) + +[dbk:colgroup] > nt:base + + dbk:col (dbk:col) = dbk:col * + - align (String) + - annotations (String) + - arch (String) + - audience (String) + - char (String) + - charoff (String) + - class (String) + - condition (String) + - conformance (String) + - dir (String) + - lang (String) + - onclick (String) + - ondblclick (String) + - onkeydown (String) + - onkeypress (String) + - onkeyup (String) + - onmousedown (String) + - onmousemove (String) + - onmouseout (String) + - onmouseover (String) + - onmouseup (String) + - os (String) + - remap (String) + - revision (String) + - revisionflag (String) + - security (String) + - span (String) + - style (String) + - title (String) + - userlevel (String) + - valign (String) + - vendor (String) + - version (String) + - width (String) + - wordsize (String) + - xreflabel (String) + - xml:base (String) + - xml:id (String) + - xml:lang (String) + +[dbk:collab] > argeodbk:base, argeodbk:linkingAttributes + + dbk:affiliation (dbk:affiliation) = dbk:affiliation * + + dbk:org (dbk:org) = dbk:org * + + dbk:orgname (dbk:orgname) = dbk:orgname * + + dbk:person (dbk:person) = dbk:person * + + dbk:personname (dbk:personname) = dbk:personname * + +[dbk:colophon] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + - label (String) + - status (String) + +[dbk:colspec] > argeodbk:base, argeodbk:linkingAttributes + - align (String) + - char (String) + - charoff (String) + - colname (String) + - colnum (String) + - colsep (String) + - colwidth (String) + - rowsep (String) + +[dbk:command] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:computeroutput] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:ubiquitousInlines + + dbk:co (dbk:co) = dbk:co * + + dbk:command (dbk:command) = dbk:command * + + dbk:computeroutput (dbk:computeroutput) = dbk:computeroutput * + + dbk:envar (dbk:envar) = dbk:envar * + + dbk:filename (dbk:filename) = dbk:filename * + + dbk:nonterminal (dbk:nonterminal) = dbk:nonterminal * + + dbk:option (dbk:option) = dbk:option * + + dbk:optional (dbk:optional) = dbk:optional * + + dbk:package (dbk:package) = dbk:package * + + dbk:parameter (dbk:parameter) = dbk:parameter * + + dbk:prompt (dbk:prompt) = dbk:prompt * + + dbk:property (dbk:property) = dbk:property * + + dbk:replaceable (dbk:replaceable) = dbk:replaceable * + + dbk:systemitem (dbk:systemitem) = dbk:systemitem * + + dbk:termdef (dbk:termdef) = dbk:termdef * + + dbk:userinput (dbk:userinput) = dbk:userinput * + + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext * + +[dbk:confdates] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:confgroup] > argeodbk:base, argeodbk:linkingAttributes + + dbk:address (dbk:address) = dbk:address * + + dbk:confdates (dbk:confdates) = dbk:confdates * + + dbk:confnum (dbk:confnum) = dbk:confnum * + + dbk:confsponsor (dbk:confsponsor) = dbk:confsponsor * + + dbk:conftitle (dbk:conftitle) = dbk:conftitle * + +[dbk:confnum] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:confsponsor] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:conftitle] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:constant] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + - class (String) + +[dbk:constraint] > argeodbk:base, argeodbk:linkingAttributes + +[dbk:constraintdef] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + +[dbk:constructorsynopsis] > argeodbk:base, argeodbk:linkingAttributes + + dbk:exceptionname (dbk:exceptionname) = dbk:exceptionname * + + dbk:methodname (dbk:methodname) = dbk:methodname + + dbk:methodparam (dbk:methodparam) = dbk:methodparam * + + dbk:modifier (dbk:modifier) = dbk:modifier * + + dbk:void (dbk:void) = dbk:void + - language (String) + +[dbk:contractnum] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:contractsponsor] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:contrib] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:copyright] > argeodbk:base, argeodbk:linkingAttributes + + dbk:holder (dbk:holder) = dbk:holder * + + dbk:year (dbk:year) = dbk:year * + +[dbk:coref] > argeodbk:base, argeodbk:linkingAttributes + - label (String) + +[dbk:country] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:cover] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:classsynopsis (dbk:classsynopsis) = dbk:classsynopsis * + + dbk:cmdsynopsis (dbk:cmdsynopsis) = dbk:cmdsynopsis * + + dbk:constraintdef (dbk:constraintdef) = dbk:constraintdef * + + dbk:constructorsynopsis (dbk:constructorsynopsis) = dbk:constructorsynopsis * + + dbk:destructorsynopsis (dbk:destructorsynopsis) = dbk:destructorsynopsis * + + dbk:fieldsynopsis (dbk:fieldsynopsis) = dbk:fieldsynopsis * + + dbk:funcsynopsis (dbk:funcsynopsis) = dbk:funcsynopsis * + + dbk:informalequation (dbk:informalequation) = dbk:informalequation * + + dbk:informalexample (dbk:informalexample) = dbk:informalexample * + + dbk:informalfigure (dbk:informalfigure) = dbk:informalfigure * + + dbk:informaltable (dbk:informaltable) = dbk:informaltable * + + dbk:literallayout (dbk:literallayout) = dbk:literallayout * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:methodsynopsis (dbk:methodsynopsis) = dbk:methodsynopsis * + + dbk:msgset (dbk:msgset) = dbk:msgset * + + dbk:productionset (dbk:productionset) = dbk:productionset * + + dbk:programlisting (dbk:programlisting) = dbk:programlisting * + + dbk:programlistingco (dbk:programlistingco) = dbk:programlistingco * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screen (dbk:screen) = dbk:screen * + + dbk:screenco (dbk:screenco) = dbk:screenco * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:synopsis (dbk:synopsis) = dbk:synopsis * + + dbk:task (dbk:task) = dbk:task * + +[dbk:database] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + - class (String) + +[dbk:date] > argeodbk:base, argeodbk:linkingAttributes + + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext * + +[dbk:dedication] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + - label (String) + - status (String) + +[dbk:destructorsynopsis] > argeodbk:base, argeodbk:linkingAttributes + + dbk:exceptionname (dbk:exceptionname) = dbk:exceptionname * + + dbk:methodname (dbk:methodname) = dbk:methodname + + dbk:methodparam (dbk:methodparam) = dbk:methodparam * + + dbk:modifier (dbk:modifier) = dbk:modifier * + + dbk:void (dbk:void) = dbk:void + - language (String) + +[dbk:edition] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:editor] > argeodbk:base, argeodbk:linkingAttributes + + dbk:address (dbk:address) = dbk:address * + + dbk:affiliation (dbk:affiliation) = dbk:affiliation * + + dbk:contrib (dbk:contrib) = dbk:contrib * + + dbk:email (dbk:email) = dbk:email * + + dbk:orgdiv (dbk:orgdiv) = dbk:orgdiv * + + dbk:orgname (dbk:orgname) = dbk:orgname + + dbk:personblurb (dbk:personblurb) = dbk:personblurb * + + dbk:personname (dbk:personname) = dbk:personname + + dbk:uri (dbk:uri) = dbk:uri * + +[dbk:email] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:emphasis] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + +[dbk:entry] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:markupInlines, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:publishingInlines, argeodbk:techDocElements, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + - align (String) + - char (String) + - charoff (String) + - colname (String) + - colsep (String) + - morerows (String) + - nameend (String) + - namest (String) + - rotate (String) + - rowsep (String) + - spanname (String) + - valign (String) + +[dbk:entrytbl] > argeodbk:base, argeodbk:linkingAttributes + + dbk:colspec (dbk:colspec) = dbk:colspec * + + dbk:spanspec (dbk:spanspec) = dbk:spanspec * + + dbk:tbody (dbk:tbody) = dbk:tbody + + dbk:thead (dbk:thead) = dbk:thead + - align (String) + - char (String) + - charoff (String) + - colname (String) + - cols (String) + - colsep (String) + - nameend (String) + - namest (String) + - rowsep (String) + - spanname (String) + - tgroupstyle (String) + +[dbk:envar] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:epigraph] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:paragraphElements + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:attribution (dbk:attribution) = dbk:attribution + + dbk:info (dbk:info) = dbk:info + + dbk:literallayout (dbk:literallayout) = dbk:literallayout * + +[dbk:equation] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled + + dbk:alt (dbk:alt) = dbk:alt + + dbk:caption (dbk:caption) = dbk:caption + + dbk:mathphrase (dbk:mathphrase) = dbk:mathphrase * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + - floatstyle (String) + - label (String) + - pgwide (String) + +[dbk:errorcode] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:errorname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:errortext] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:errortype] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:example] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:caption (dbk:caption) = dbk:caption + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + - floatstyle (String) + - label (String) + - pgwide (String) + - width (String) + +[dbk:exceptionname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:extendedlink] > argeodbk:base + + dbk:arc (dbk:arc) = dbk:arc * + + dbk:locator (dbk:locator) = dbk:locator * + +[dbk:fax] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:fieldsynopsis] > argeodbk:base, argeodbk:linkingAttributes + + dbk:initializer (dbk:initializer) = dbk:initializer + + dbk:modifier (dbk:modifier) = dbk:modifier * + + dbk:type (dbk:type) = dbk:type + + dbk:varname (dbk:varname) = dbk:varname + - language (String) + +[dbk:figure] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:caption (dbk:caption) = dbk:caption + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + - floatstyle (String) + - label (String) + - pgwide (String) + +[dbk:filename] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + - class (String) + - path (String) + +[dbk:firstname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:firstterm] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + - baseform (String) + +[dbk:footnote] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + - label (String) + +[dbk:footnoteref] > argeodbk:base, argeodbk:linkingAttributes + - label (String) + +[dbk:foreignphrase] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:publishingInlines + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:application (dbk:application) = dbk:application * + + dbk:biblioref (dbk:biblioref) = dbk:biblioref * + + dbk:database (dbk:database) = dbk:database * + + dbk:hardware (dbk:hardware) = dbk:hardware * + + dbk:inlinemediaobject (dbk:inlinemediaobject) = dbk:inlinemediaobject * + + dbk:link (dbk:link) = dbk:link * + + dbk:olink (dbk:olink) = dbk:olink * + + dbk:phrase (dbk:phrase) = dbk:phrase * + + dbk:productname (dbk:productname) = dbk:productname * + + dbk:productnumber (dbk:productnumber) = dbk:productnumber * + + dbk:subscript (dbk:subscript) = dbk:subscript * + + dbk:superscript (dbk:superscript) = dbk:superscript * + + dbk:trademark (dbk:trademark) = dbk:trademark * + + dbk:xref (dbk:xref) = dbk:xref * + + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext * + +[dbk:formalpara] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:titled + + dbk:para (dbk:para) = dbk:para + +[dbk:funcdef] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + + dbk:function (dbk:function) = dbk:function * + + dbk:type (dbk:type) = dbk:type * + +[dbk:funcparams] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:funcprototype] > argeodbk:base, argeodbk:linkingAttributes + + dbk:funcdef (dbk:funcdef) = dbk:funcdef + + dbk:modifier (dbk:modifier) = dbk:modifier * + + dbk:paramdef (dbk:paramdef) = dbk:paramdef * + + dbk:varargs (dbk:varargs) = dbk:varargs + + dbk:varargs (dbk:varargs) = dbk:varargs + + dbk:void (dbk:void) = dbk:void + +[dbk:funcsynopsis] > argeodbk:base, argeodbk:linkingAttributes + + dbk:funcprototype (dbk:funcprototype) = dbk:funcprototype * + + dbk:funcsynopsisinfo (dbk:funcsynopsisinfo) = dbk:funcsynopsisinfo * + + dbk:info (dbk:info) = dbk:info + - language (String) + +[dbk:funcsynopsisinfo] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + + dbk:co (dbk:co) = dbk:co * + + dbk:info (dbk:info) = dbk:info * + + dbk:lineannotation (dbk:lineannotation) = dbk:lineannotation * + + dbk:textobject (dbk:textobject) = dbk:textobject * + - continuation (String) + - language (String) + - linenumbering (String) + - startinglinenumber (String) + - xml:space (String) + +[dbk:function] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:glossary] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bibliography (dbk:bibliography) = dbk:bibliography + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:glossdiv (dbk:glossdiv) = dbk:glossdiv * + + dbk:glossentry (dbk:glossentry) = dbk:glossentry * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + - label (String) + - status (String) + +[dbk:glossdef] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:glossseealso (dbk:glossseealso) = dbk:glossseealso * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + - subject (String) + +[dbk:glossdiv] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:glossentry (dbk:glossentry) = dbk:glossentry * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + - label (String) + - status (String) + +[dbk:glossentry] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes + + dbk:abbrev (dbk:abbrev) = dbk:abbrev + + dbk:acronym (dbk:acronym) = dbk:acronym + + dbk:glossdef (dbk:glossdef) = dbk:glossdef * + + dbk:glosssee (dbk:glosssee) = dbk:glosssee + + dbk:glossterm (dbk:glossterm) = dbk:glossterm + - sortas (String) + +[dbk:glosslist] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:glossentry (dbk:glossentry) = dbk:glossentry * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + +[dbk:glosssee] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + - otherterm (Reference) + +[dbk:glossseealso] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + - otherterm (Reference) + +[dbk:glossterm] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + - baseform (String) + +[dbk:group] > argeodbk:base, argeodbk:linkingAttributes + + dbk:arg (dbk:arg) = dbk:arg * + + dbk:group (dbk:group) = dbk:group * + + dbk:option (dbk:option) = dbk:option * + + dbk:replaceable (dbk:replaceable) = dbk:replaceable * + + dbk:sbr (dbk:sbr) = dbk:sbr * + + dbk:synopfragmentref (dbk:synopfragmentref) = dbk:synopfragmentref * + - choice (String) + - rep (String) + +[dbk:guibutton] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + + dbk:accel (dbk:accel) = dbk:accel * + +[dbk:guiicon] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + + dbk:accel (dbk:accel) = dbk:accel * + +[dbk:guilabel] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + + dbk:accel (dbk:accel) = dbk:accel * + +[dbk:guimenu] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + + dbk:accel (dbk:accel) = dbk:accel * + +[dbk:guimenuitem] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + + dbk:accel (dbk:accel) = dbk:accel * + +[dbk:guisubmenu] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + + dbk:accel (dbk:accel) = dbk:accel * + +[dbk:hardware] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:holder] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:honorific] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:imagedata] > argeodbk:base + + dbk:info (dbk:info) = dbk:info + - align (String) + - contentdepth (String) + - contentwidth (String) + - depth (String) + - entityref (String) + - fileref (String) + - format (String) + - scale (String) + - scalefit (String) + - valign (String) + - width (String) + +[dbk:imageobject] > argeodbk:base, argeodbk:linkingAttributes + + dbk:imagedata (dbk:imagedata) = dbk:imagedata + + dbk:info (dbk:info) = dbk:info + +[dbk:imageobjectco] > argeodbk:base, argeodbk:linkingAttributes + + dbk:areaspec (dbk:areaspec) = dbk:areaspec + + dbk:calloutlist (dbk:calloutlist) = dbk:calloutlist * + + dbk:imageobject (dbk:imageobject) = dbk:imageobject * + + dbk:info (dbk:info) = dbk:info + +[dbk:important] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + +[dbk:index] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:indexdiv (dbk:indexdiv) = dbk:indexdiv * + + dbk:indexentry (dbk:indexentry) = dbk:indexentry * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + - label (String) + - status (String) + - type (String) + +[dbk:indexdiv] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:indexentry (dbk:indexentry) = dbk:indexentry * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + - label (String) + - status (String) + +[dbk:indexentry] > argeodbk:base, argeodbk:linkingAttributes + + dbk:primaryie (dbk:primaryie) = dbk:primaryie + + dbk:secondaryie (dbk:secondaryie) = dbk:secondaryie * + + dbk:seealsoie (dbk:seealsoie) = dbk:seealsoie * + + dbk:seeie (dbk:seeie) = dbk:seeie * + + dbk:tertiaryie (dbk:tertiaryie) = dbk:tertiaryie * + +[dbk:indexterm] > argeodbk:base, argeodbk:linkingAttributes + + dbk:primary (dbk:primary) = dbk:primary + + dbk:secondary (dbk:secondary) = dbk:secondary + + dbk:see (dbk:see) = dbk:see + + dbk:seealso (dbk:seealso) = dbk:seealso * + + dbk:tertiary (dbk:tertiary) = dbk:tertiary + - class (String) + - pagenum (String) + - scope (String) + - significance (String) + - startref (Reference) + - type (String) + - zone (String) + +[dbk:info] > argeodbk:base + + dbk:abstract (dbk:abstract) = dbk:abstract * + + dbk:address (dbk:address) = dbk:address * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:artpagenums (dbk:artpagenums) = dbk:artpagenums * + + dbk:author (dbk:author) = dbk:author * + + dbk:authorgroup (dbk:authorgroup) = dbk:authorgroup * + + dbk:authorinitials (dbk:authorinitials) = dbk:authorinitials * + + dbk:bibliocoverage (dbk:bibliocoverage) = dbk:bibliocoverage * + + dbk:biblioid (dbk:biblioid) = dbk:biblioid * + + dbk:bibliomisc (dbk:bibliomisc) = dbk:bibliomisc * + + dbk:bibliomset (dbk:bibliomset) = dbk:bibliomset * + + dbk:bibliorelation (dbk:bibliorelation) = dbk:bibliorelation * + + dbk:biblioset (dbk:biblioset) = dbk:biblioset * + + dbk:bibliosource (dbk:bibliosource) = dbk:bibliosource * + + dbk:collab (dbk:collab) = dbk:collab * + + dbk:confgroup (dbk:confgroup) = dbk:confgroup * + + dbk:contractnum (dbk:contractnum) = dbk:contractnum * + + dbk:contractsponsor (dbk:contractsponsor) = dbk:contractsponsor * + + dbk:copyright (dbk:copyright) = dbk:copyright * + + dbk:cover (dbk:cover) = dbk:cover * + + dbk:date (dbk:date) = dbk:date * + + dbk:edition (dbk:edition) = dbk:edition * + + dbk:editor (dbk:editor) = dbk:editor * + + dbk:extendedlink (dbk:extendedlink) = dbk:extendedlink * + + dbk:issuenum (dbk:issuenum) = dbk:issuenum * + + dbk:itermset (dbk:itermset) = dbk:itermset * + + dbk:keywordset (dbk:keywordset) = dbk:keywordset * + + dbk:legalnotice (dbk:legalnotice) = dbk:legalnotice * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:org (dbk:org) = dbk:org * + + dbk:orgname (dbk:orgname) = dbk:orgname * + + dbk:othercredit (dbk:othercredit) = dbk:othercredit * + + dbk:pagenums (dbk:pagenums) = dbk:pagenums * + + dbk:printhistory (dbk:printhistory) = dbk:printhistory * + + dbk:productname (dbk:productname) = dbk:productname * + + dbk:productnumber (dbk:productnumber) = dbk:productnumber * + + dbk:pubdate (dbk:pubdate) = dbk:pubdate * + + dbk:publisher (dbk:publisher) = dbk:publisher * + + dbk:publishername (dbk:publishername) = dbk:publishername * + + dbk:releaseinfo (dbk:releaseinfo) = dbk:releaseinfo * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:seriesvolnums (dbk:seriesvolnums) = dbk:seriesvolnums * + + dbk:subjectset (dbk:subjectset) = dbk:subjectset * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + + dbk:title (dbk:title) = dbk:title * + + dbk:titleabbrev (dbk:titleabbrev) = dbk:titleabbrev * + + dbk:volumenum (dbk:volumenum) = dbk:volumenum * + + * (nt:base) = nt:unstructured * + +[dbk:informalequation] > argeodbk:base, argeodbk:linkingAttributes + + dbk:alt (dbk:alt) = dbk:alt + + dbk:caption (dbk:caption) = dbk:caption + + dbk:info (dbk:info) = dbk:info + + dbk:mathphrase (dbk:mathphrase) = dbk:mathphrase * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + +[dbk:informalexample] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:caption (dbk:caption) = dbk:caption + + dbk:info (dbk:info) = dbk:info + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + - floatstyle (String) + - width (String) + +[dbk:informalfigure] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:caption (dbk:caption) = dbk:caption + + dbk:info (dbk:info) = dbk:info + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + - floatstyle (String) + - label (String) + - pgwide (String) + +[dbk:informaltable] > argeodbk:base, argeodbk:linkingAttributes + + dbk:col (dbk:col) = dbk:col * + + dbk:colgroup (dbk:colgroup) = dbk:colgroup * + + dbk:info (dbk:info) = dbk:info + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:tbody (dbk:tbody) = dbk:tbody * + + dbk:textobject (dbk:textobject) = dbk:textobject * + + dbk:tfoot (dbk:tfoot) = dbk:tfoot + + dbk:tgroup (dbk:tgroup) = dbk:tgroup * + + dbk:thead (dbk:thead) = dbk:thead + + dbk:tr (dbk:tr) = dbk:tr * + - border (String) + - cellpadding (String) + - cellspacing (String) + - class (String) + - colsep (String) + - floatstyle (String) + - frame (String) + - lang (String) + - onclick (String) + - ondblclick (String) + - onkeydown (String) + - onkeypress (String) + - onkeyup (String) + - onmousedown (String) + - onmousemove (String) + - onmouseout (String) + - onmouseover (String) + - onmouseup (String) + - orient (String) + - pgwide (String) + - rowheader (String) + - rowsep (String) + - rules (String) + - style (String) + - summary (String) + - tabstyle (String) + - title (String) + - width (String) + +[dbk:initializer] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:inlineequation] > argeodbk:base, argeodbk:linkingAttributes + + dbk:alt (dbk:alt) = dbk:alt + + dbk:inlinemediaobject (dbk:inlinemediaobject) = dbk:inlinemediaobject * + + dbk:mathphrase (dbk:mathphrase) = dbk:mathphrase * + +[dbk:inlinemediaobject] > argeodbk:base, argeodbk:linkingAttributes + + dbk:alt (dbk:alt) = dbk:alt + + dbk:audioobject (dbk:audioobject) = dbk:audioobject * + + dbk:imageobject (dbk:imageobject) = dbk:imageobject * + + dbk:imageobjectco (dbk:imageobjectco) = dbk:imageobjectco * + + dbk:info (dbk:info) = dbk:info + + dbk:textobject (dbk:textobject) = dbk:textobject * + + dbk:videoobject (dbk:videoobject) = dbk:videoobject * + +[dbk:interfacename] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:issuenum] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:itemizedlist] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:listitem (dbk:listitem) = dbk:listitem * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + - mark (String) + - spacing (String) + +[dbk:itermset] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes + +[dbk:jobtitle] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:keycap] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + - function (String) + - otherfunction (String) + +[dbk:keycode] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:keycombo] > argeodbk:base, argeodbk:linkingAttributes + + dbk:keycap (dbk:keycap) = dbk:keycap * + + dbk:keycombo (dbk:keycombo) = dbk:keycombo * + + dbk:keysym (dbk:keysym) = dbk:keysym * + + dbk:mousebutton (dbk:mousebutton) = dbk:mousebutton * + - action (String) + - otheraction (String) + +[dbk:keysym] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:keyword] > argeodbk:base, argeodbk:linkingAttributes + + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext * + +[dbk:keywordset] > argeodbk:base, argeodbk:linkingAttributes + + dbk:keyword (dbk:keyword) = dbk:keyword * + +[dbk:label] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:legalnotice] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + +[dbk:lhs] > argeodbk:base, argeodbk:linkingAttributes + + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext * + +[dbk:lineage] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:lineannotation] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:link] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + - endterm (Reference) + - xrefstyle (String) + +[dbk:listitem] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + - override (String) + +[dbk:literal] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:literallayout] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + + dbk:co (dbk:co) = dbk:co * + + dbk:info (dbk:info) = dbk:info * + + dbk:lineannotation (dbk:lineannotation) = dbk:lineannotation * + + dbk:textobject (dbk:textobject) = dbk:textobject * + - class (String) + - continuation (String) + - language (String) + - linenumbering (String) + - startinglinenumber (String) + - xml:space (String) + +[dbk:locator] > argeodbk:base + - xlink:label (String) + +[dbk:manvolnum] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:markup] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:mathphrase] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + + dbk:emphasis (dbk:emphasis) = dbk:emphasis * + +[dbk:mediaobject] > argeodbk:base, argeodbk:linkingAttributes + + dbk:alt (dbk:alt) = dbk:alt + + dbk:audioobject (dbk:audioobject) = dbk:audioobject * + + dbk:caption (dbk:caption) = dbk:caption + + dbk:imageobject (dbk:imageobject) = dbk:imageobject * + + dbk:imageobjectco (dbk:imageobjectco) = dbk:imageobjectco * + + dbk:info (dbk:info) = dbk:info + + dbk:textobject (dbk:textobject) = dbk:textobject * + + dbk:videoobject (dbk:videoobject) = dbk:videoobject * + +[dbk:member] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + +[dbk:menuchoice] > argeodbk:base, argeodbk:linkingAttributes + + dbk:guibutton (dbk:guibutton) = dbk:guibutton * + + dbk:guiicon (dbk:guiicon) = dbk:guiicon * + + dbk:guilabel (dbk:guilabel) = dbk:guilabel * + + dbk:guimenu (dbk:guimenu) = dbk:guimenu * + + dbk:guimenuitem (dbk:guimenuitem) = dbk:guimenuitem * + + dbk:guisubmenu (dbk:guisubmenu) = dbk:guisubmenu * + + dbk:shortcut (dbk:shortcut) = dbk:shortcut + +[dbk:methodname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:methodparam] > argeodbk:base, argeodbk:linkingAttributes + + dbk:funcparams (dbk:funcparams) = dbk:funcparams + + dbk:initializer (dbk:initializer) = dbk:initializer + + dbk:modifier (dbk:modifier) = dbk:modifier * + + dbk:modifier (dbk:modifier) = dbk:modifier * + + dbk:parameter (dbk:parameter) = dbk:parameter + + dbk:type (dbk:type) = dbk:type * + - choice (String) + - rep (String) + +[dbk:methodsynopsis] > argeodbk:base, argeodbk:linkingAttributes + + dbk:exceptionname (dbk:exceptionname) = dbk:exceptionname * + + dbk:methodname (dbk:methodname) = dbk:methodname + + dbk:methodparam (dbk:methodparam) = dbk:methodparam * + + dbk:modifier (dbk:modifier) = dbk:modifier * + + dbk:type (dbk:type) = dbk:type + + dbk:void (dbk:void) = dbk:void + - language (String) + +[dbk:modifier] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + - xml:space (String) + +[dbk:mousebutton] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:msg] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled + + dbk:msgmain (dbk:msgmain) = dbk:msgmain + + dbk:msgrel (dbk:msgrel) = dbk:msgrel * + + dbk:msgsub (dbk:msgsub) = dbk:msgsub * + +[dbk:msgaud] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:msgentry] > argeodbk:base, argeodbk:linkingAttributes + + dbk:msg (dbk:msg) = dbk:msg * + + dbk:msgexplan (dbk:msgexplan) = dbk:msgexplan * + + dbk:msginfo (dbk:msginfo) = dbk:msginfo + +[dbk:msgexplan] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + +[dbk:msginfo] > argeodbk:base, argeodbk:linkingAttributes + + dbk:msgaud (dbk:msgaud) = dbk:msgaud * + + dbk:msglevel (dbk:msglevel) = dbk:msglevel * + + dbk:msgorig (dbk:msgorig) = dbk:msgorig * + +[dbk:msglevel] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:msgmain] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled + + dbk:msgtext (dbk:msgtext) = dbk:msgtext + +[dbk:msgorig] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:msgrel] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled + + dbk:msgtext (dbk:msgtext) = dbk:msgtext + +[dbk:msgset] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled + + dbk:msgentry (dbk:msgentry) = dbk:msgentry * + + dbk:simplemsgentry (dbk:simplemsgentry) = dbk:simplemsgentry * + +[dbk:msgsub] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled + + dbk:msgtext (dbk:msgtext) = dbk:msgtext + +[dbk:msgtext] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + +[dbk:nonterminal] > argeodbk:base, argeodbk:linkingAttributes + + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext * + - def (String) + +[dbk:note] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + +[dbk:olink] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + - localinfo (String) + - targetdoc (String) + - targetptr (String) + - type (String) + - xrefstyle (String) + +[dbk:ooclass] > argeodbk:base, argeodbk:linkingAttributes + + dbk:classname (dbk:classname) = dbk:classname + + dbk:modifier (dbk:modifier) = dbk:modifier * + + dbk:package (dbk:package) = dbk:package * + +[dbk:ooexception] > argeodbk:base, argeodbk:linkingAttributes + + dbk:exceptionname (dbk:exceptionname) = dbk:exceptionname + + dbk:modifier (dbk:modifier) = dbk:modifier * + + dbk:package (dbk:package) = dbk:package * + +[dbk:oointerface] > argeodbk:base, argeodbk:linkingAttributes + + dbk:interfacename (dbk:interfacename) = dbk:interfacename + + dbk:modifier (dbk:modifier) = dbk:modifier * + + dbk:package (dbk:package) = dbk:package * + +[dbk:option] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:optional] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:orderedlist] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:listitem (dbk:listitem) = dbk:listitem * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + - continuation (String) + - inheritnum (String) + - numeration (String) + - spacing (String) + - startingnumber (String) + +[dbk:org] > argeodbk:base, argeodbk:linkingAttributes + + dbk:address (dbk:address) = dbk:address * + + dbk:affiliation (dbk:affiliation) = dbk:affiliation * + + dbk:email (dbk:email) = dbk:email * + + dbk:orgdiv (dbk:orgdiv) = dbk:orgdiv * + + dbk:orgname (dbk:orgname) = dbk:orgname + + dbk:uri (dbk:uri) = dbk:uri * + +[dbk:orgdiv] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + +[dbk:orgname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + - class (String) + - otherclass (String) + +[dbk:otheraddr] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:othercredit] > argeodbk:base, argeodbk:linkingAttributes + + dbk:address (dbk:address) = dbk:address * + + dbk:affiliation (dbk:affiliation) = dbk:affiliation * + + dbk:contrib (dbk:contrib) = dbk:contrib * + + dbk:email (dbk:email) = dbk:email * + + dbk:orgdiv (dbk:orgdiv) = dbk:orgdiv * + + dbk:orgname (dbk:orgname) = dbk:orgname + + dbk:personblurb (dbk:personblurb) = dbk:personblurb * + + dbk:personname (dbk:personname) = dbk:personname + + dbk:uri (dbk:uri) = dbk:uri * + - class (String) + - otherclass (String) + +[dbk:othername] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:package] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:pagenums] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:para] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:markupInlines, argeodbk:publishingElements, argeodbk:publishingInlines, argeodbk:techDocElements, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:info (dbk:info) = dbk:info * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + +[dbk:paramdef] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + + dbk:funcparams (dbk:funcparams) = dbk:funcparams * + + dbk:initializer (dbk:initializer) = dbk:initializer * + + dbk:parameter (dbk:parameter) = dbk:parameter * + + dbk:type (dbk:type) = dbk:type * + - choice (String) + +[dbk:parameter] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + - class (String) + +[dbk:part] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled + + dbk:acknowledgements (dbk:acknowledgements) = dbk:acknowledgements * + + dbk:appendix (dbk:appendix) = dbk:appendix * + + dbk:article (dbk:article) = dbk:article * + + dbk:bibliography (dbk:bibliography) = dbk:bibliography * + + dbk:chapter (dbk:chapter) = dbk:chapter * + + dbk:colophon (dbk:colophon) = dbk:colophon * + + dbk:dedication (dbk:dedication) = dbk:dedication * + + dbk:glossary (dbk:glossary) = dbk:glossary * + + dbk:index (dbk:index) = dbk:index * + + dbk:partintro (dbk:partintro) = dbk:partintro + + dbk:preface (dbk:preface) = dbk:preface * + + dbk:refentry (dbk:refentry) = dbk:refentry * + + dbk:reference (dbk:reference) = dbk:reference * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + + dbk:toc (dbk:toc) = dbk:toc * + - label (String) + - status (String) + +[dbk:partintro] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:refentry (dbk:refentry) = dbk:refentry * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:sect1 (dbk:sect1) = dbk:sect1 * + + dbk:section (dbk:section) = dbk:section * + + dbk:simplesect (dbk:simplesect) = dbk:simplesect * + + dbk:simplesect (dbk:simplesect) = dbk:simplesect * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + - label (String) + - status (String) + +[dbk:person] > argeodbk:base, argeodbk:linkingAttributes + + dbk:address (dbk:address) = dbk:address * + + dbk:affiliation (dbk:affiliation) = dbk:affiliation * + + dbk:email (dbk:email) = dbk:email * + + dbk:personblurb (dbk:personblurb) = dbk:personblurb * + + dbk:personname (dbk:personname) = dbk:personname + + dbk:uri (dbk:uri) = dbk:uri * + +[dbk:personblurb] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:paragraphElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + +[dbk:personname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + + dbk:firstname (dbk:firstname) = dbk:firstname * + + dbk:honorific (dbk:honorific) = dbk:honorific * + + dbk:lineage (dbk:lineage) = dbk:lineage * + + dbk:othername (dbk:othername) = dbk:othername * + + dbk:surname (dbk:surname) = dbk:surname * + +[dbk:phone] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:phrase] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + +[dbk:pob] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:postcode] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:preface] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:refentry (dbk:refentry) = dbk:refentry * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:sect1 (dbk:sect1) = dbk:sect1 * + + dbk:section (dbk:section) = dbk:section * + + dbk:simplesect (dbk:simplesect) = dbk:simplesect * + + dbk:simplesect (dbk:simplesect) = dbk:simplesect * + +[dbk:primary] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + - sortas (String) + +[dbk:primaryie] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + - linkends (String) + +[dbk:printhistory] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:paragraphElements + + dbk:anchor (dbk:anchor) = dbk:anchor * + +[dbk:procedure] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:step (dbk:step) = dbk:step * + +[dbk:production] > argeodbk:base, argeodbk:linkingAttributes + + dbk:constraint (dbk:constraint) = dbk:constraint * + + dbk:lhs (dbk:lhs) = dbk:lhs + + dbk:rhs (dbk:rhs) = dbk:rhs + +[dbk:productionrecap] > argeodbk:base, argeodbk:linkingAttributes + +[dbk:productionset] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled + + dbk:production (dbk:production) = dbk:production * + + dbk:productionrecap (dbk:productionrecap) = dbk:productionrecap * + +[dbk:productname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + - class (String) + +[dbk:productnumber] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:programlisting] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + + dbk:co (dbk:co) = dbk:co * + + dbk:info (dbk:info) = dbk:info * + + dbk:lineannotation (dbk:lineannotation) = dbk:lineannotation * + + dbk:textobject (dbk:textobject) = dbk:textobject * + - continuation (String) + - language (String) + - linenumbering (String) + - startinglinenumber (String) + - width (String) + - xml:space (String) + +[dbk:programlistingco] > argeodbk:base, argeodbk:linkingAttributes + + dbk:areaspec (dbk:areaspec) = dbk:areaspec + + dbk:calloutlist (dbk:calloutlist) = dbk:calloutlist * + + dbk:info (dbk:info) = dbk:info + + dbk:programlisting (dbk:programlisting) = dbk:programlisting + +[dbk:prompt] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + + dbk:co (dbk:co) = dbk:co * + +[dbk:property] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:pubdate] > argeodbk:base, argeodbk:linkingAttributes + + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext * + +[dbk:publisher] > argeodbk:base, argeodbk:linkingAttributes + + dbk:address (dbk:address) = dbk:address * + + dbk:publishername (dbk:publishername) = dbk:publishername + +[dbk:publishername] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:qandadiv] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:qandadiv (dbk:qandadiv) = dbk:qandadiv * + + dbk:qandaentry (dbk:qandaentry) = dbk:qandaentry * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + +[dbk:qandaentry] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled + + dbk:answer (dbk:answer) = dbk:answer * + + dbk:question (dbk:question) = dbk:question + +[dbk:qandaset] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:qandadiv (dbk:qandadiv) = dbk:qandadiv * + + dbk:qandaentry (dbk:qandaentry) = dbk:qandaentry * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + - defaultlabel (String) + +[dbk:question] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:label (dbk:label) = dbk:label + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + +[dbk:quote] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + +[dbk:refclass] > argeodbk:base, argeodbk:linkingAttributes + + dbk:application (dbk:application) = dbk:application * + + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext * + +[dbk:refdescriptor] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + +[dbk:refentry] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes + + dbk:info (dbk:info) = dbk:info + + dbk:refmeta (dbk:refmeta) = dbk:refmeta + + dbk:refnamediv (dbk:refnamediv) = dbk:refnamediv * + + dbk:refsect1 (dbk:refsect1) = dbk:refsect1 * + + dbk:refsection (dbk:refsection) = dbk:refsection * + + dbk:refsynopsisdiv (dbk:refsynopsisdiv) = dbk:refsynopsisdiv + - label (String) + - status (String) + +[dbk:refentrytitle] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + +[dbk:reference] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled + + dbk:partintro (dbk:partintro) = dbk:partintro + + dbk:refentry (dbk:refentry) = dbk:refentry * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + - label (String) + - status (String) + +[dbk:refmeta] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes + + dbk:manvolnum (dbk:manvolnum) = dbk:manvolnum + + dbk:refentrytitle (dbk:refentrytitle) = dbk:refentrytitle + + dbk:refmiscinfo (dbk:refmiscinfo) = dbk:refmiscinfo * + +[dbk:refmiscinfo] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + - class (String) + - otherclass (String) + +[dbk:refname] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + +[dbk:refnamediv] > argeodbk:base, argeodbk:linkingAttributes + + dbk:refclass (dbk:refclass) = dbk:refclass * + + dbk:refdescriptor (dbk:refdescriptor) = dbk:refdescriptor + + dbk:refname (dbk:refname) = dbk:refname * + + dbk:refpurpose (dbk:refpurpose) = dbk:refpurpose + +[dbk:refpurpose] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + +[dbk:refsect1] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:refsect2 (dbk:refsect2) = dbk:refsect2 * + + dbk:refsect2 (dbk:refsect2) = dbk:refsect2 * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + - label (String) + - status (String) + +[dbk:refsect2] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:refsect3 (dbk:refsect3) = dbk:refsect3 * + + dbk:refsect3 (dbk:refsect3) = dbk:refsect3 * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + - label (String) + - status (String) + +[dbk:refsect3] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + - label (String) + - status (String) + +[dbk:refsection] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:refsection (dbk:refsection) = dbk:refsection * + + dbk:refsection (dbk:refsection) = dbk:refsection * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + - label (String) + - status (String) + +[dbk:refsynopsisdiv] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:refsect2 (dbk:refsect2) = dbk:refsect2 * + + dbk:refsection (dbk:refsection) = dbk:refsection * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + +[dbk:releaseinfo] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:remark] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:replaceable] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + + dbk:co (dbk:co) = dbk:co * + - class (String) + +[dbk:returnvalue] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:revdescription] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + +[dbk:revhistory] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled + + dbk:revision (dbk:revision) = dbk:revision * + +[dbk:revision] > argeodbk:base, argeodbk:linkingAttributes + + dbk:author (dbk:author) = dbk:author * + + dbk:authorinitials (dbk:authorinitials) = dbk:authorinitials * + + dbk:date (dbk:date) = dbk:date + + dbk:revdescription (dbk:revdescription) = dbk:revdescription + + dbk:revnumber (dbk:revnumber) = dbk:revnumber + + dbk:revremark (dbk:revremark) = dbk:revremark + +[dbk:revnumber] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:revremark] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:rhs] > argeodbk:base, argeodbk:linkingAttributes + + dbk:lineannotation (dbk:lineannotation) = dbk:lineannotation * + + dbk:nonterminal (dbk:nonterminal) = dbk:nonterminal * + + dbk:sbr (dbk:sbr) = dbk:sbr * + + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext * + +[dbk:row] > argeodbk:base, argeodbk:linkingAttributes + + dbk:entry (dbk:entry) = dbk:entry * + + dbk:entrytbl (dbk:entrytbl) = dbk:entrytbl * + - rowsep (String) + - valign (String) + +[dbk:sbr] > argeodbk:base + +[dbk:screen] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + + dbk:co (dbk:co) = dbk:co * + + dbk:info (dbk:info) = dbk:info * + + dbk:lineannotation (dbk:lineannotation) = dbk:lineannotation * + + dbk:textobject (dbk:textobject) = dbk:textobject * + - continuation (String) + - language (String) + - linenumbering (String) + - startinglinenumber (String) + - width (String) + - xml:space (String) + +[dbk:screenco] > argeodbk:base, argeodbk:linkingAttributes + + dbk:areaspec (dbk:areaspec) = dbk:areaspec + + dbk:calloutlist (dbk:calloutlist) = dbk:calloutlist * + + dbk:info (dbk:info) = dbk:info + + dbk:screen (dbk:screen) = dbk:screen + +[dbk:screenshot] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + +[dbk:secondary] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + - sortas (String) + +[dbk:secondaryie] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + - linkends (String) + +[dbk:sect1] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:sect2 (dbk:sect2) = dbk:sect2 * + + dbk:simplesect (dbk:simplesect) = dbk:simplesect * + + dbk:simplesect (dbk:simplesect) = dbk:simplesect * + +[dbk:sect2] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:sect3 (dbk:sect3) = dbk:sect3 * + + dbk:simplesect (dbk:simplesect) = dbk:simplesect * + + dbk:simplesect (dbk:simplesect) = dbk:simplesect * + +[dbk:sect3] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:sect4 (dbk:sect4) = dbk:sect4 * + + dbk:simplesect (dbk:simplesect) = dbk:simplesect * + + dbk:simplesect (dbk:simplesect) = dbk:simplesect * + +[dbk:sect4] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:sect5 (dbk:sect5) = dbk:sect5 * + + dbk:simplesect (dbk:simplesect) = dbk:simplesect * + + dbk:simplesect (dbk:simplesect) = dbk:simplesect * + +[dbk:sect5] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:simplesect (dbk:simplesect) = dbk:simplesect * + + dbk:simplesect (dbk:simplesect) = dbk:simplesect * + +[dbk:section] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:refentry (dbk:refentry) = dbk:refentry * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:section (dbk:section) = dbk:section * + + dbk:simplesect (dbk:simplesect) = dbk:simplesect * + + dbk:simplesect (dbk:simplesect) = dbk:simplesect * + +[dbk:see] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + +[dbk:seealso] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + +[dbk:seealsoie] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + - linkends (String) + +[dbk:seeie] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + +[dbk:seg] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + +[dbk:seglistitem] > argeodbk:base, argeodbk:linkingAttributes + + dbk:seg (dbk:seg) = dbk:seg * + +[dbk:segmentedlist] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled + + dbk:seglistitem (dbk:seglistitem) = dbk:seglistitem * + + dbk:segtitle (dbk:segtitle) = dbk:segtitle * + +[dbk:segtitle] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + +[dbk:seriesvolnums] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:set] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled + + dbk:book (dbk:book) = dbk:book * + + dbk:set (dbk:set) = dbk:set * + + dbk:setindex (dbk:setindex) = dbk:setindex + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + + dbk:toc (dbk:toc) = dbk:toc + - label (String) + - status (String) + +[dbk:setindex] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:indexdiv (dbk:indexdiv) = dbk:indexdiv * + + dbk:indexentry (dbk:indexentry) = dbk:indexentry * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + - label (String) + - status (String) + - type (String) + +[dbk:shortaffil] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:shortcut] > argeodbk:base, argeodbk:linkingAttributes + + dbk:keycap (dbk:keycap) = dbk:keycap * + + dbk:keycombo (dbk:keycombo) = dbk:keycombo * + + dbk:keysym (dbk:keysym) = dbk:keysym * + + dbk:mousebutton (dbk:mousebutton) = dbk:mousebutton * + - action (String) + - otheraction (String) + +[dbk:sidebar] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + +[dbk:simpara] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + + dbk:info (dbk:info) = dbk:info * + +[dbk:simplelist] > argeodbk:base, argeodbk:linkingAttributes + + dbk:member (dbk:member) = dbk:member * + - columns (String) + - type (String) + +[dbk:simplemsgentry] > argeodbk:base, argeodbk:linkingAttributes + + dbk:msgexplan (dbk:msgexplan) = dbk:msgexplan * + + dbk:msgtext (dbk:msgtext) = dbk:msgtext + - msgaud (String) + - msglevel (String) + - msgorig (String) + +[dbk:simplesect] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + - label (String) + - status (String) + +[dbk:spanspec] > argeodbk:base, argeodbk:linkingAttributes + - align (String) + - char (String) + - charoff (String) + - colsep (String) + - nameend (String) + - namest (String) + - rowsep (String) + - spanname (String) + +[dbk:state] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:step] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:stepalternatives (dbk:stepalternatives) = dbk:stepalternatives + + dbk:substeps (dbk:substeps) = dbk:substeps + - performance (String) + +[dbk:stepalternatives] > argeodbk:base, argeodbk:linkingAttributes + + dbk:info (dbk:info) = dbk:info + + dbk:step (dbk:step) = dbk:step * + - performance (String) + +[dbk:street] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:subject] > argeodbk:base, argeodbk:linkingAttributes + + dbk:subjectterm (dbk:subjectterm) = dbk:subjectterm * + - weight (String) + +[dbk:subjectset] > argeodbk:base, argeodbk:linkingAttributes + + dbk:subject (dbk:subject) = dbk:subject * + - scheme (String) + +[dbk:subjectterm] > argeodbk:base, argeodbk:linkingAttributes + + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext * + +[dbk:subscript] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:substeps] > argeodbk:base, argeodbk:linkingAttributes + + dbk:step (dbk:step) = dbk:step * + - performance (String) + +[dbk:subtitle] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + +[dbk:superscript] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:surname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:symbol] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + - class (String) + +[dbk:synopfragment] > argeodbk:base, argeodbk:linkingAttributes + + dbk:arg (dbk:arg) = dbk:arg * + + dbk:group (dbk:group) = dbk:group * + +[dbk:synopfragmentref] > argeodbk:base, argeodbk:linkingAttributes + + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext * + +[dbk:synopsis] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + + dbk:co (dbk:co) = dbk:co * + + dbk:info (dbk:info) = dbk:info * + + dbk:lineannotation (dbk:lineannotation) = dbk:lineannotation * + + dbk:textobject (dbk:textobject) = dbk:textobject * + - continuation (String) + - label (String) + - language (String) + - linenumbering (String) + - startinglinenumber (String) + - xml:space (String) + +[dbk:systemitem] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + + dbk:co (dbk:co) = dbk:co * + - class (String) + +[dbk:table] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:titled + + dbk:caption (dbk:caption) = dbk:caption + + dbk:col (dbk:col) = dbk:col * + + dbk:colgroup (dbk:colgroup) = dbk:colgroup * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:tbody (dbk:tbody) = dbk:tbody * + + dbk:textobject (dbk:textobject) = dbk:textobject * + + dbk:tfoot (dbk:tfoot) = dbk:tfoot + + dbk:tgroup (dbk:tgroup) = dbk:tgroup * + + dbk:thead (dbk:thead) = dbk:thead + + dbk:tr (dbk:tr) = dbk:tr * + - border (String) + - cellpadding (String) + - cellspacing (String) + - class (String) + - colsep (String) + - floatstyle (String) + - frame (String) + - label (String) + - lang (String) + - onclick (String) + - ondblclick (String) + - onkeydown (String) + - onkeypress (String) + - onkeyup (String) + - onmousedown (String) + - onmousemove (String) + - onmouseout (String) + - onmouseover (String) + - onmouseup (String) + - orient (String) + - pgwide (String) + - rowheader (String) + - rowsep (String) + - rules (String) + - shortentry (String) + - style (String) + - summary (String) + - tabstyle (String) + - title (String) + - tocentry (String) + - width (String) + +[dbk:tag] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + - class (String) + - namespace (String) + +[dbk:task] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled + + dbk:example (dbk:example) = dbk:example * + + dbk:procedure (dbk:procedure) = dbk:procedure + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + + dbk:taskprerequisites (dbk:taskprerequisites) = dbk:taskprerequisites + + dbk:taskrelated (dbk:taskrelated) = dbk:taskrelated + + dbk:tasksummary (dbk:tasksummary) = dbk:tasksummary + +[dbk:taskprerequisites] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + +[dbk:taskrelated] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + +[dbk:tasksummary] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + +[dbk:tbody] > argeodbk:base, argeodbk:linkingAttributes + + dbk:row (dbk:row) = dbk:row * + + dbk:tr (dbk:tr) = dbk:tr * + - align (String) + - char (String) + - charoff (String) + - class (String) + - lang (String) + - onclick (String) + - ondblclick (String) + - onkeydown (String) + - onkeypress (String) + - onkeyup (String) + - onmousedown (String) + - onmousemove (String) + - onmouseout (String) + - onmouseover (String) + - onmouseup (String) + - style (String) + - title (String) + - valign (String) + +[dbk:td] > argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:listElements, argeodbk:markupInlines, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:publishingInlines, argeodbk:techDocElements, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + - abbr (String) + - align (String) + - annotations (String) + - arch (String) + - audience (String) + - axis (String) + - char (String) + - charoff (String) + - class (String) + - colspan (String) + - condition (String) + - conformance (String) + - dir (String) + - headers (String) + - lang (String) + - onclick (String) + - ondblclick (String) + - onkeydown (String) + - onkeypress (String) + - onkeyup (String) + - onmousedown (String) + - onmousemove (String) + - onmouseout (String) + - onmouseover (String) + - onmouseup (String) + - os (String) + - remap (String) + - revision (String) + - revisionflag (String) + - rowspan (String) + - scope (String) + - security (String) + - style (String) + - title (String) + - userlevel (String) + - valign (String) + - vendor (String) + - version (String) + - wordsize (String) + - xreflabel (String) + - xml:base (String) + - xml:id (String) + - xml:lang (String) + +[dbk:term] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + +[dbk:termdef] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + - baseform (String) + - sortas (String) + +[dbk:tertiary] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + - sortas (String) + +[dbk:tertiaryie] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + - linkends (String) + +[dbk:textdata] > argeodbk:base + + dbk:info (dbk:info) = dbk:info + - encoding (String) + - entityref (String) + - fileref (String) + - format (String) + +[dbk:textobject] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:info (dbk:info) = dbk:info + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:phrase (dbk:phrase) = dbk:phrase + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:textdata (dbk:textdata) = dbk:textdata + +[dbk:tfoot] > argeodbk:base, argeodbk:linkingAttributes + + dbk:colspec (dbk:colspec) = dbk:colspec * + + dbk:row (dbk:row) = dbk:row * + + dbk:tr (dbk:tr) = dbk:tr * + - align (String) + - char (String) + - charoff (String) + - class (String) + - lang (String) + - onclick (String) + - ondblclick (String) + - onkeydown (String) + - onkeypress (String) + - onkeyup (String) + - onmousedown (String) + - onmousemove (String) + - onmouseout (String) + - onmouseover (String) + - onmouseup (String) + - style (String) + - title (String) + - valign (String) + +[dbk:tgroup] > argeodbk:base, argeodbk:linkingAttributes + + dbk:colspec (dbk:colspec) = dbk:colspec * + + dbk:spanspec (dbk:spanspec) = dbk:spanspec * + + dbk:tbody (dbk:tbody) = dbk:tbody + + dbk:tfoot (dbk:tfoot) = dbk:tfoot + + dbk:thead (dbk:thead) = dbk:thead + - align (String) + - char (String) + - charoff (String) + - cols (String) + - colsep (String) + - rowsep (String) + - tgroupstyle (String) + +[dbk:th] > argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:listElements, argeodbk:markupInlines, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:publishingInlines, argeodbk:techDocElements, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + - abbr (String) + - align (String) + - annotations (String) + - arch (String) + - audience (String) + - axis (String) + - char (String) + - charoff (String) + - class (String) + - colspan (String) + - condition (String) + - conformance (String) + - dir (String) + - headers (String) + - lang (String) + - onclick (String) + - ondblclick (String) + - onkeydown (String) + - onkeypress (String) + - onkeyup (String) + - onmousedown (String) + - onmousemove (String) + - onmouseout (String) + - onmouseover (String) + - onmouseup (String) + - os (String) + - remap (String) + - revision (String) + - revisionflag (String) + - rowspan (String) + - scope (String) + - security (String) + - style (String) + - title (String) + - userlevel (String) + - valign (String) + - vendor (String) + - version (String) + - wordsize (String) + - xreflabel (String) + - xml:base (String) + - xml:id (String) + - xml:lang (String) + +[dbk:thead] > argeodbk:base, argeodbk:linkingAttributes + + dbk:colspec (dbk:colspec) = dbk:colspec * + + dbk:row (dbk:row) = dbk:row * + + dbk:tr (dbk:tr) = dbk:tr * + - align (String) + - char (String) + - charoff (String) + - class (String) + - lang (String) + - onclick (String) + - ondblclick (String) + - onkeydown (String) + - onkeypress (String) + - onkeyup (String) + - onmousedown (String) + - onmousemove (String) + - onmouseout (String) + - onmouseover (String) + - onmouseup (String) + - style (String) + - title (String) + - valign (String) + +[dbk:tip] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + +[dbk:title] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + +[dbk:titleabbrev] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + +[dbk:toc] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:tocdiv (dbk:tocdiv) = dbk:tocdiv * + + dbk:tocentry (dbk:tocentry) = dbk:tocentry * + +[dbk:tocdiv] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + + dbk:tocdiv (dbk:tocdiv) = dbk:tocdiv * + + dbk:tocentry (dbk:tocentry) = dbk:tocentry * + - pagenum (String) + +[dbk:tocentry] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + - pagenum (String) + +[dbk:token] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:tr] > nt:base + + dbk:td (dbk:td) = dbk:td * + + dbk:th (dbk:th) = dbk:th * + - align (String) + - annotations (String) + - arch (String) + - audience (String) + - char (String) + - charoff (String) + - class (String) + - condition (String) + - conformance (String) + - dir (String) + - lang (String) + - onclick (String) + - ondblclick (String) + - onkeydown (String) + - onkeypress (String) + - onkeyup (String) + - onmousedown (String) + - onmousemove (String) + - onmouseout (String) + - onmouseover (String) + - onmouseup (String) + - os (String) + - remap (String) + - revision (String) + - revisionflag (String) + - security (String) + - style (String) + - title (String) + - userlevel (String) + - valign (String) + - vendor (String) + - version (String) + - wordsize (String) + - xreflabel (String) + - xml:base (String) + - xml:id (String) + - xml:lang (String) + +[dbk:trademark] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + - class (String) + +[dbk:type] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:uri] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + - type (String) + +[dbk:userinput] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:ubiquitousInlines + + dbk:accel (dbk:accel) = dbk:accel * + + dbk:co (dbk:co) = dbk:co * + + dbk:command (dbk:command) = dbk:command * + + dbk:computeroutput (dbk:computeroutput) = dbk:computeroutput * + + dbk:envar (dbk:envar) = dbk:envar * + + dbk:filename (dbk:filename) = dbk:filename * + + dbk:guibutton (dbk:guibutton) = dbk:guibutton * + + dbk:guiicon (dbk:guiicon) = dbk:guiicon * + + dbk:guilabel (dbk:guilabel) = dbk:guilabel * + + dbk:guimenu (dbk:guimenu) = dbk:guimenu * + + dbk:guimenuitem (dbk:guimenuitem) = dbk:guimenuitem * + + dbk:guisubmenu (dbk:guisubmenu) = dbk:guisubmenu * + + dbk:keycap (dbk:keycap) = dbk:keycap * + + dbk:keycode (dbk:keycode) = dbk:keycode * + + dbk:keycombo (dbk:keycombo) = dbk:keycombo * + + dbk:keysym (dbk:keysym) = dbk:keysym * + + dbk:menuchoice (dbk:menuchoice) = dbk:menuchoice * + + dbk:mousebutton (dbk:mousebutton) = dbk:mousebutton * + + dbk:nonterminal (dbk:nonterminal) = dbk:nonterminal * + + dbk:option (dbk:option) = dbk:option * + + dbk:optional (dbk:optional) = dbk:optional * + + dbk:package (dbk:package) = dbk:package * + + dbk:parameter (dbk:parameter) = dbk:parameter * + + dbk:prompt (dbk:prompt) = dbk:prompt * + + dbk:property (dbk:property) = dbk:property * + + dbk:replaceable (dbk:replaceable) = dbk:replaceable * + + dbk:shortcut (dbk:shortcut) = dbk:shortcut * + + dbk:systemitem (dbk:systemitem) = dbk:systemitem * + + dbk:termdef (dbk:termdef) = dbk:termdef * + + dbk:userinput (dbk:userinput) = dbk:userinput * + + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext * + +[dbk:varargs] > argeodbk:base, argeodbk:linkingAttributes + +[dbk:variablelist] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + + dbk:varlistentry (dbk:varlistentry) = dbk:varlistentry * + - spacing (String) + - termlength (String) + +[dbk:varlistentry] > argeodbk:base, argeodbk:linkingAttributes + + dbk:listitem (dbk:listitem) = dbk:listitem + + dbk:term (dbk:term) = dbk:term * + +[dbk:varname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:videodata] > argeodbk:base + + dbk:info (dbk:info) = dbk:info + - align (String) + - contentdepth (String) + - contentwidth (String) + - depth (String) + - entityref (String) + - fileref (String) + - format (String) + - scale (String) + - scalefit (String) + - valign (String) + - width (String) + +[dbk:videoobject] > argeodbk:base, argeodbk:linkingAttributes + + dbk:info (dbk:info) = dbk:info + + dbk:videodata (dbk:videodata) = dbk:videodata + +[dbk:void] > argeodbk:base, argeodbk:linkingAttributes + +[dbk:volumenum] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:warning] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:revhistory (dbk:revhistory) = dbk:revhistory * + + dbk:screenshot (dbk:screenshot) = dbk:screenshot * + +[dbk:wordasword] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:xref] > argeodbk:base, argeodbk:linkingAttributes + - endterm (Reference) + - xrefstyle (String) + +[dbk:year] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +//[xs:anyType] > nt:base +// + * (nt:base) +// + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext * +// - * (undefined) + + diff --git a/org.argeo.app.core/src/org/argeo/docbook/docbook.cnd b/org.argeo.app.core/src/org/argeo/docbook/docbook.cnd new file mode 100644 index 0000000..5514e64 --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/docbook/docbook.cnd @@ -0,0 +1,527 @@ + + + + +[argeodbk:titled] +mixin + + dbk:info (dbk:info) = dbk:info * + + dbk:title (dbk:title) = dbk:title * + +[argeodbk:linkingAttributes] +mixin + - linkend (String) + - xlink:actuate (String) + - xlink:arcrole (String) + - xlink:href (String) + - xlink:role (String) + - xlink:show (String) + - xlink:title (String) + - xlink:type (String) + +[argeodbk:freeText] +mixin + + dbk:phrase (dbk:phrase) = dbk:phrase * + + dbk:replaceable (dbk:replaceable) = dbk:replaceable * + + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext * + +[argeodbk:markupInlines] +mixin + +[argeodbk:listElements] +mixin + + dbk:itemizedlist (dbk:itemizedlist) = dbk:itemizedlist * + + dbk:orderedlist (dbk:orderedlist) = dbk:orderedlist * + + dbk:simplelist (dbk:simplelist) = dbk:simplelist * + +[argeodbk:paragraphElements] +mixin + + dbk:para (dbk:para) = dbk:para * + +[argeodbk:indexingInlines] +mixin + +[argeodbk:techDocElements] +mixin + + dbk:table (dbk:table) = dbk:table * + +[argeodbk:techDocInlines] +mixin + +[argeodbk:publishingElements] +mixin + +[argeodbk:ubiquitousInlines] +mixin + + dbk:alt (dbk:alt) = dbk:alt * + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:biblioref (dbk:biblioref) = dbk:biblioref * + + dbk:inlinemediaobject (dbk:inlinemediaobject) = dbk:inlinemediaobject * + + dbk:link (dbk:link) = dbk:link * + + dbk:olink (dbk:olink) = dbk:olink * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:subscript (dbk:subscript) = dbk:subscript * + + dbk:superscript (dbk:superscript) = dbk:superscript * + + dbk:xref (dbk:xref) = dbk:xref * + +[argeodbk:abstractSection] +mixin + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:remark (dbk:remark) = dbk:remark * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + - label (String) + - status (String) + +[argeodbk:bibliographyInlines] +mixin + + dbk:author (dbk:author) = dbk:author * + + dbk:editor (dbk:editor) = dbk:editor * + + dbk:orgname (dbk:orgname) = dbk:orgname * + + dbk:personname (dbk:personname) = dbk:personname * + +[argeodbk:publishingInlines] +mixin + + dbk:emphasis (dbk:emphasis) = dbk:emphasis * + +[argeodbk:base] +abstract +orderable + - annotations (String) + - arch (String) + - audience (String) + - condition (String) + - conformance (String) + - dir (String) + - os (String) + - remap (String) + - revision (String) + - revisionflag (String) + - role (String) + - security (String) + - userlevel (String) + - vendor (String) + - version (String) + - wordsize (String) + - xreflabel (String) + +[dbk:alt] > argeodbk:base + + dbk:inlinemediaobject (dbk:inlinemediaobject) = dbk:inlinemediaobject * + + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext * + +[dbk:anchor] > argeodbk:base + +[dbk:annotation] > argeodbk:base, argeodbk:indexingInlines, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + - annotates (String) + +[dbk:article] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:section (dbk:section) = dbk:section * + - class (String) + +[dbk:audiodata] > argeodbk:base + + dbk:info (dbk:info) = dbk:info + - entityref (String) + - fileref (String) + - format (String) + +[dbk:audioobject] > argeodbk:base, argeodbk:linkingAttributes + + dbk:audiodata (dbk:audiodata) = dbk:audiodata + + dbk:info (dbk:info) = dbk:info + +[dbk:author] > argeodbk:base, argeodbk:linkingAttributes + + dbk:orgdiv (dbk:orgdiv) = dbk:orgdiv * + + dbk:orgname (dbk:orgname) = dbk:orgname + + dbk:personblurb (dbk:personblurb) = dbk:personblurb * + + dbk:personname (dbk:personname) = dbk:personname + +[dbk:biblioref] > argeodbk:base, argeodbk:linkingAttributes + - begin (String) + - end (String) + - endterm (Reference) + - units (String) + - xrefstyle (String) + +[dbk:book] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled + + dbk:article (dbk:article) = dbk:article * + + dbk:chapter (dbk:chapter) = dbk:chapter * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + - label (String) + - status (String) + +[dbk:caption] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext * + - class (String) + - lang (String) + - onclick (String) + - ondblclick (String) + - onkeydown (String) + - onkeypress (String) + - onkeyup (String) + - onmousedown (String) + - onmousemove (String) + - onmouseout (String) + - onmouseover (String) + - onmouseup (String) + - style (String) + - title (String) + +[dbk:chapter] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:section (dbk:section) = dbk:section * + +[dbk:colspec] > argeodbk:base, argeodbk:linkingAttributes + - align (String) + - char (String) + - charoff (String) + - colname (String) + - colnum (String) + - colsep (String) + - colwidth (String) + - rowsep (String) + +[dbk:editor] > argeodbk:base, argeodbk:linkingAttributes + + dbk:orgdiv (dbk:orgdiv) = dbk:orgdiv * + + dbk:orgname (dbk:orgname) = dbk:orgname + + dbk:personblurb (dbk:personblurb) = dbk:personblurb * + + dbk:personname (dbk:personname) = dbk:personname + +[dbk:emphasis] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + +[dbk:entry] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:markupInlines, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:publishingInlines, argeodbk:techDocElements, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + - align (String) + - char (String) + - charoff (String) + - colname (String) + - colsep (String) + - morerows (String) + - nameend (String) + - namest (String) + - rotate (String) + - rowsep (String) + - spanname (String) + - valign (String) + +[dbk:entrytbl] > argeodbk:base, argeodbk:linkingAttributes + + dbk:colspec (dbk:colspec) = dbk:colspec * + + dbk:spanspec (dbk:spanspec) = dbk:spanspec * + + dbk:tbody (dbk:tbody) = dbk:tbody + + dbk:thead (dbk:thead) = dbk:thead + - align (String) + - char (String) + - charoff (String) + - colname (String) + - cols (String) + - colsep (String) + - nameend (String) + - namest (String) + - rowsep (String) + - spanname (String) + - tgroupstyle (String) + +[dbk:imagedata] > argeodbk:base + + dbk:info (dbk:info) = dbk:info + - align (String) + - contentdepth (String) + - contentwidth (String) + - depth (String) + - entityref (String) + - fileref (String) + - format (String) + - scale (String) + - scalefit (String) + - valign (String) + - width (String) + +[dbk:imageobject] > argeodbk:base, argeodbk:linkingAttributes + + dbk:imagedata (dbk:imagedata) = dbk:imagedata + + dbk:info (dbk:info) = dbk:info + +[dbk:info] > argeodbk:base + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:author (dbk:author) = dbk:author * + + dbk:editor (dbk:editor) = dbk:editor * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:orgname (dbk:orgname) = dbk:orgname * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + + dbk:title (dbk:title) = dbk:title * + + * (nt:base) = nt:unstructured * + +[dbk:inlinemediaobject] > argeodbk:base, argeodbk:linkingAttributes + + dbk:alt (dbk:alt) = dbk:alt + + dbk:audioobject (dbk:audioobject) = dbk:audioobject * + + dbk:imageobject (dbk:imageobject) = dbk:imageobject * + + dbk:info (dbk:info) = dbk:info + + dbk:textobject (dbk:textobject) = dbk:textobject * + + dbk:videoobject (dbk:videoobject) = dbk:videoobject * + +[dbk:itemizedlist] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:listitem (dbk:listitem) = dbk:listitem * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + - mark (String) + - spacing (String) + +[dbk:link] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + - endterm (Reference) + - xrefstyle (String) + +[dbk:listitem] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + - override (String) + +[dbk:mediaobject] > argeodbk:base, argeodbk:linkingAttributes + + dbk:alt (dbk:alt) = dbk:alt + + dbk:audioobject (dbk:audioobject) = dbk:audioobject * + + dbk:caption (dbk:caption) = dbk:caption + + dbk:imageobject (dbk:imageobject) = dbk:imageobject * + + dbk:info (dbk:info) = dbk:info + + dbk:textobject (dbk:textobject) = dbk:textobject * + + dbk:videoobject (dbk:videoobject) = dbk:videoobject * + +[dbk:olink] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + - localinfo (String) + - targetdoc (String) + - targetptr (String) + - type (String) + - xrefstyle (String) + +[dbk:orderedlist] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:listitem (dbk:listitem) = dbk:listitem * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:remark (dbk:remark) = dbk:remark * + - continuation (String) + - inheritnum (String) + - numeration (String) + - spacing (String) + - startingnumber (String) + +[dbk:orgdiv] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + +[dbk:orgname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + - class (String) + - otherclass (String) + +[dbk:para] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:markupInlines, argeodbk:publishingElements, argeodbk:publishingInlines, argeodbk:techDocElements, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + + dbk:info (dbk:info) = dbk:info * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + +[dbk:personblurb] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:paragraphElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + +[dbk:personname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:phrase] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + +[dbk:remark] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:replaceable] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + - class (String) + +[dbk:row] > argeodbk:base, argeodbk:linkingAttributes + + dbk:entry (dbk:entry) = dbk:entry * + + dbk:entrytbl (dbk:entrytbl) = dbk:entrytbl * + - rowsep (String) + - valign (String) + +[dbk:section] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:section (dbk:section) = dbk:section * + +[dbk:set] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled + + dbk:book (dbk:book) = dbk:book * + + dbk:set (dbk:set) = dbk:set * + + dbk:subtitle (dbk:subtitle) = dbk:subtitle * + - label (String) + - status (String) + +[dbk:simplelist] > argeodbk:base, argeodbk:linkingAttributes + - columns (String) + - type (String) + +[dbk:spanspec] > argeodbk:base, argeodbk:linkingAttributes + - align (String) + - char (String) + - charoff (String) + - colsep (String) + - nameend (String) + - namest (String) + - rowsep (String) + - spanname (String) + +[dbk:subscript] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:subtitle] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + +[dbk:superscript] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines + +[dbk:table] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:titled + + dbk:caption (dbk:caption) = dbk:caption + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:tbody (dbk:tbody) = dbk:tbody * + + dbk:textobject (dbk:textobject) = dbk:textobject * + + dbk:tfoot (dbk:tfoot) = dbk:tfoot + + dbk:tgroup (dbk:tgroup) = dbk:tgroup * + + dbk:thead (dbk:thead) = dbk:thead + - border (String) + - cellpadding (String) + - cellspacing (String) + - class (String) + - colsep (String) + - floatstyle (String) + - frame (String) + - label (String) + - lang (String) + - onclick (String) + - ondblclick (String) + - onkeydown (String) + - onkeypress (String) + - onkeyup (String) + - onmousedown (String) + - onmousemove (String) + - onmouseout (String) + - onmouseover (String) + - onmouseup (String) + - orient (String) + - pgwide (String) + - rowheader (String) + - rowsep (String) + - rules (String) + - shortentry (String) + - style (String) + - summary (String) + - tabstyle (String) + - title (String) + - tocentry (String) + - width (String) + +[dbk:tbody] > argeodbk:base, argeodbk:linkingAttributes + + dbk:row (dbk:row) = dbk:row * + - align (String) + - char (String) + - charoff (String) + - class (String) + - lang (String) + - onclick (String) + - ondblclick (String) + - onkeydown (String) + - onkeypress (String) + - onkeyup (String) + - onmousedown (String) + - onmousemove (String) + - onmouseout (String) + - onmouseover (String) + - onmouseup (String) + - style (String) + - title (String) + - valign (String) + +[dbk:textobject] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements + + dbk:anchor (dbk:anchor) = dbk:anchor * + + dbk:annotation (dbk:annotation) = dbk:annotation * + + dbk:info (dbk:info) = dbk:info + + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject * + + dbk:phrase (dbk:phrase) = dbk:phrase + + dbk:remark (dbk:remark) = dbk:remark * + +[dbk:tfoot] > argeodbk:base, argeodbk:linkingAttributes + + dbk:colspec (dbk:colspec) = dbk:colspec * + + dbk:row (dbk:row) = dbk:row * + - align (String) + - char (String) + - charoff (String) + - class (String) + - lang (String) + - onclick (String) + - ondblclick (String) + - onkeydown (String) + - onkeypress (String) + - onkeyup (String) + - onmousedown (String) + - onmousemove (String) + - onmouseout (String) + - onmouseover (String) + - onmouseup (String) + - style (String) + - title (String) + - valign (String) + +[dbk:tgroup] > argeodbk:base, argeodbk:linkingAttributes + + dbk:colspec (dbk:colspec) = dbk:colspec * + + dbk:spanspec (dbk:spanspec) = dbk:spanspec * + + dbk:tbody (dbk:tbody) = dbk:tbody + + dbk:tfoot (dbk:tfoot) = dbk:tfoot + + dbk:thead (dbk:thead) = dbk:thead + - align (String) + - char (String) + - charoff (String) + - cols (String) + - colsep (String) + - rowsep (String) + - tgroupstyle (String) + +[dbk:thead] > argeodbk:base, argeodbk:linkingAttributes + + dbk:colspec (dbk:colspec) = dbk:colspec * + + dbk:row (dbk:row) = dbk:row * + - align (String) + - char (String) + - charoff (String) + - class (String) + - lang (String) + - onclick (String) + - ondblclick (String) + - onkeydown (String) + - onkeypress (String) + - onkeyup (String) + - onmousedown (String) + - onmousemove (String) + - onmouseout (String) + - onmouseover (String) + - onmouseup (String) + - style (String) + - title (String) + - valign (String) + +[dbk:title] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines + +[dbk:videodata] > argeodbk:base + + dbk:info (dbk:info) = dbk:info + - align (String) + - contentdepth (String) + - contentwidth (String) + - depth (String) + - entityref (String) + - fileref (String) + - format (String) + - scale (String) + - scalefit (String) + - valign (String) + - width (String) + +[dbk:videoobject] > argeodbk:base, argeodbk:linkingAttributes + + dbk:info (dbk:info) = dbk:info + + dbk:videodata (dbk:videodata) = dbk:videodata + +[dbk:xref] > argeodbk:base, argeodbk:linkingAttributes + - endterm (Reference) + - xrefstyle (String) + + diff --git a/org.argeo.app.core/src/org/argeo/entity/core/JcrEntityDefinition.java b/org.argeo.app.core/src/org/argeo/entity/core/JcrEntityDefinition.java new file mode 100644 index 0000000..d6d1246 --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/entity/core/JcrEntityDefinition.java @@ -0,0 +1,73 @@ +package org.argeo.entity.core; + +import java.util.Map; + +import javax.jcr.Node; +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.Session; + +import org.argeo.cms.jcr.CmsJcrUtils; +import org.argeo.entity.EntityConstants; +import org.argeo.entity.EntityDefinition; +import org.argeo.jcr.Jcr; +import org.osgi.framework.BundleContext; + +/** An entity definition based on a JCR data structure. */ +public class JcrEntityDefinition implements EntityDefinition { + private Repository repository; + + private String type; + private String defaultEditorId; + + public void init(BundleContext bundleContext, Map properties) throws RepositoryException { + Session adminSession = CmsJcrUtils.openDataAdminSession(repository, null); + try { + type = properties.get(EntityConstants.TYPE); + if (type == null) + throw new IllegalArgumentException("Entity type property " + EntityConstants.TYPE + " must be set."); + defaultEditorId = properties.get(EntityConstants.DEFAULT_EDITOR_ID); +// String definitionPath = EntityNames.ENTITY_DEFINITIONS_PATH + '/' + type; +// if (!adminSession.itemExists(definitionPath)) { +// Node entityDefinition = JcrUtils.mkdirs(adminSession, definitionPath, EntityTypes.ENTITY_DEFINITION); +//// entityDefinition.addMixin(EntityTypes.ENTITY_DEFINITION); +// adminSession.save(); +// } + initJcr(adminSession); + } finally { + Jcr.logout(adminSession); + } + } + + /** To be overridden in order to perform additional initialisations. */ + protected void initJcr(Session adminSession) throws RepositoryException { + + } + + public void destroy(BundleContext bundleContext, Map properties) throws RepositoryException { + + } + + @Override + public String getEditorId(Node entity) { + return defaultEditorId; + } + + @Override + public String getType() { + return type; + } + + protected Repository getRepository() { + return repository; + } + + public void setRepository(Repository repository) { + this.repository = repository; + } + + public String toString() { + return "Entity Definition " + getType(); + } + +} diff --git a/org.argeo.app.core/src/org/argeo/geo/GeoJsonUtils.java b/org.argeo.app.core/src/org/argeo/geo/GeoJsonUtils.java new file mode 100644 index 0000000..0d58480 --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/geo/GeoJsonUtils.java @@ -0,0 +1,24 @@ +package org.argeo.geo; + +import java.util.Map; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; + +/** Geo data utilities. */ +public class GeoJsonUtils { + + /** Add these properties to all features. */ + public static void addProperties(JsonNode tree, Map map) { + for (JsonNode feature : tree.get("features")) { + ObjectNode properties = (ObjectNode) feature.get("properties"); + for (String key : map.keySet()) { + properties.put(key, map.get(key)); + } + } + } + + /** Singleton. */ + private GeoJsonUtils() { + } +} diff --git a/org.argeo.app.core/src/org/argeo/geo/GeoToSvg.java b/org.argeo.app.core/src/org/argeo/geo/GeoToSvg.java new file mode 100644 index 0000000..4d593f2 --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/geo/GeoToSvg.java @@ -0,0 +1,69 @@ +package org.argeo.geo; + +import java.io.IOException; +import java.io.InputStream; +import java.io.Writer; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** Converts a geographical feature to an SVG. */ +public class GeoToSvg { + public void convertGeoJsonToSvg(Path source, Path target) { + ObjectMapper objectMapper = new ObjectMapper(); + try (InputStream in = Files.newInputStream(source); + Writer out = Files.newBufferedWriter(target, StandardCharsets.UTF_8)) { + JsonNode tree = objectMapper.readTree(in); + JsonNode coord = tree.get("features").get(0).get("geometry").get("coordinates"); + double ratio = 100; + double minX = Double.POSITIVE_INFINITY; + double maxX = Double.NEGATIVE_INFINITY; + double minY = Double.POSITIVE_INFINITY; + double maxY = Double.NEGATIVE_INFINITY; + List shapes = new ArrayList<>(); + for (JsonNode shape : coord) { + StringBuffer sb = new StringBuffer(); + sb.append(" maxY) + maxY = y; + double lng = latlng.get(1).asDouble(); + double x = lng * ratio; + if (x < minX) + minX = x; + if (x > maxX) + maxX = x; + sb.append(y + "," + x + " "); + } + sb.append("\">"); + sb.append("\n"); + shapes.add(sb.toString()); + } + + double width = maxX - minX; + double height = maxY - minY; + out.write("\n"); + for (String shape : shapes) { + out.write(shape); + out.write("\n"); + } + out.write(""); + } catch (IOException e) { + throw new RuntimeException("Cannot convert " + source + " to " + target, e); + } + } + +} diff --git a/org.argeo.app.core/src/org/argeo/suite/RankedObject.java b/org.argeo.app.core/src/org/argeo/suite/RankedObject.java new file mode 100644 index 0000000..b3ba37d --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/suite/RankedObject.java @@ -0,0 +1,97 @@ +package org.argeo.suite; + +import java.util.Map; + +import org.argeo.api.cms.CmsLog; + +/** + * A container for an object whose relevance can be ranked. Typically used in an + * OSGi context with the service.ranking property. + */ +public class RankedObject { + private final static CmsLog log = CmsLog.getLog(RankedObject.class); + + private final static String SERVICE_RANKING = "service.ranking"; +// private final static String SERVICE_ID = "service.id"; + + private T object; + private Map properties; + private final Long rank; + + public RankedObject(T object, Map properties) { + this(object, properties, extractRanking(properties)); + } + + public RankedObject(T object, Map properties, Long rank) { + super(); + this.object = object; + this.properties = properties; + this.rank = rank; + } + + private static Long extractRanking(Map properties) { + if (properties == null) + return 0l; + if (properties.containsKey(SERVICE_RANKING)) + return Long.valueOf(properties.get(SERVICE_RANKING).toString()); +// else if (properties.containsKey(SERVICE_ID)) +// return (Long) properties.get(SERVICE_ID); + else + return 0l; + } + + public T get() { + return object; + } + + public Map getProperties() { + return properties; + } + + public Long getRank() { + return rank; + } + + @Override + public int hashCode() { + return object.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof RankedObject)) + return false; + RankedObject other = (RankedObject) obj; + return rank.equals(other.rank) && object.equals(other.object); + } + + @Override + public String toString() { + return object.getClass().getName() + " with rank " + rank; + } + + public static RankedObject putIfHigherRank(Map> map, K key, T object, + Map properties) { + RankedObject rankedObject = new RankedObject<>(object, properties); + if (!map.containsKey(key)) { + map.put(key, rankedObject); + if (log.isTraceEnabled()) + log.trace( + "Added " + key + " as " + object.getClass().getName() + " with rank " + rankedObject.getRank()); + return rankedObject; + } else { + RankedObject current = map.get(key); + if (current.getRank() <= rankedObject.getRank()) { + map.put(key, rankedObject); + if (log.isTraceEnabled()) + log.trace("Replaced " + key + " by " + object.getClass().getName() + " with rank " + + rankedObject.getRank()); + return rankedObject; + } else { + return current; + } + } + + } + +} diff --git a/org.argeo.app.core/src/org/argeo/suite/RankingKey.java b/org.argeo.app.core/src/org/argeo/suite/RankingKey.java new file mode 100644 index 0000000..e099195 --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/suite/RankingKey.java @@ -0,0 +1,160 @@ +package org.argeo.suite; + +import java.util.Map; + +/** + * Key used to classify and filter available components (typically provided by + * OSGi services). + */ +@Deprecated +public class RankingKey implements Comparable { + public final static String SERVICE_PID = "service.pid"; + public final static String SERVICE_ID = "service.id"; + public final static String SERVICE_RANKING = "service.ranking"; + public final static String DATA_TYPE = "data.type"; + + private String pid; + private Integer ranking = 0; + private Long id = 0l; + private String dataType; + private String dataPath; + + public RankingKey(String pid, Integer ranking, Long id, String dataType, String dataPath) { + super(); + this.pid = pid; + this.ranking = ranking; + this.id = id; + this.dataType = dataType; + this.dataPath = dataPath; + } + + public RankingKey(Map properties) { + this.pid = properties.containsKey(SERVICE_PID) ? properties.get(SERVICE_PID).toString() : null; + this.ranking = properties.containsKey(SERVICE_RANKING) + ? Integer.parseInt(properties.get(SERVICE_RANKING).toString()) + : 0; + this.id = properties.containsKey(SERVICE_ID) ? (Long) properties.get(SERVICE_ID) : null; + + // Argeo specific + this.dataType = properties.containsKey(DATA_TYPE) ? properties.get(DATA_TYPE).toString() : null; + } + + @Override + public int hashCode() { + Integer result = 0; + if (pid != null) + result = +pid.hashCode(); + if (ranking != null) + result = +ranking; + if (dataType != null) + result = +dataType.hashCode(); + return result; + } + + @Override + protected Object clone() throws CloneNotSupportedException { + return new RankingKey(pid, ranking, id, dataType, dataPath); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(""); + if (pid != null) + sb.append(pid); + if (ranking != null && ranking != 0) + sb.append(' ').append(ranking); + if (dataType != null) + sb.append(' ').append(dataType); + return sb.toString(); + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof RankingKey)) + return false; + RankingKey other = (RankingKey) obj; + return equalsOrBothNull(pid, other.pid) && equalsOrBothNull(ranking, other.ranking) + && equalsOrBothNull(id, other.id) && equalsOrBothNull(dataType, other.dataType) + && equalsOrBothNull(dataPath, other.dataPath); + } + + @Override + public int compareTo(RankingKey o) { + if (pid != null && o.pid != null) { + if (pid.equals(o.pid)) { + if (ranking.equals(o.ranking)) + if (id != null && o.id != null) + return id.compareTo(o.id); + else + return 0; + else + return ranking.compareTo(o.ranking); + } else { + return pid.compareTo(o.pid); + } + + } else { + if (dataType != null && o.dataType != null) { + if (dataType.equals(o.dataType)) { + // TODO factorise + if (ranking.equals(o.ranking)) + if (id != null && o.id != null) + return id.compareTo(o.id); + else + return 0; + else + return ranking.compareTo(o.ranking); + } else { + return dataPath.compareTo(o.dataType); + } + } + } + return -1; + } + + public String getPid() { + return pid; + } + + public Integer getRanking() { + return ranking; + } + + public Long getId() { + return id; + } + + public String getDataType() { + return dataType; + } + + public String getDataPath() { + return dataPath; + } + + public static RankingKey minPid(String pid) { + return new RankingKey(pid, Integer.MIN_VALUE, null, null, null); + } + + public static RankingKey maxPid(String pid) { + return new RankingKey(pid, Integer.MAX_VALUE, null, null, null); + } + + public static RankingKey minDataType(String dataType) { + return new RankingKey(null, Integer.MIN_VALUE, null, dataType, null); + } + + public static RankingKey maxDataType(String dataType) { + return new RankingKey(null, Integer.MAX_VALUE, null, dataType, null); + } + + private static boolean equalsOrBothNull(Object o1, Object o2) { + if (o1 == null && o2 == null) + return true; + if (o1 == null && o2 != null) + return false; + if (o1 != null && o2 == null) + return false; + return o2.equals(o1); + } +} diff --git a/org.argeo.app.core/src/org/argeo/suite/SuiteRole.java b/org.argeo.app.core/src/org/argeo/suite/SuiteRole.java new file mode 100644 index 0000000..7f3af76 --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/suite/SuiteRole.java @@ -0,0 +1,19 @@ +package org.argeo.suite; + +import org.argeo.api.cms.CmsConstants; +import org.argeo.util.naming.Distinguished; +import org.argeo.util.naming.LdapAttrs; + +/** Office specific roles used in the code */ +public enum SuiteRole implements Distinguished { + coworker, manager; + + public String getRolePrefix() { + return "org.argeo.suite"; + } + + public String dn() { + return new StringBuilder(LdapAttrs.cn.name()).append("=").append(getRolePrefix()).append(".").append(name()) + .append(",").append(CmsConstants.ROLES_BASEDN).toString(); + } +} diff --git a/org.argeo.app.core/src/org/argeo/suite/SuiteUtils.java b/org.argeo.app.core/src/org/argeo/suite/SuiteUtils.java new file mode 100644 index 0000000..e6d4960 --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/suite/SuiteUtils.java @@ -0,0 +1,122 @@ +package org.argeo.suite; + +import java.util.HashSet; +import java.util.Set; + +import javax.jcr.Node; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.nodetype.NodeType; +import javax.jcr.security.Privilege; +import javax.naming.ldap.LdapName; +import javax.security.auth.x500.X500Principal; + +import org.argeo.api.cms.CmsSession; +import org.argeo.api.cms.CmsConstants; +import org.argeo.entity.EntityType; +import org.argeo.jackrabbit.security.JackrabbitSecurityUtils; +import org.argeo.jcr.JcrException; +import org.argeo.jcr.JcrUtils; +import org.argeo.util.naming.LdapAttrs; + +/** Utilities around the Argeo Suite APIs. */ +public class SuiteUtils { + + public static String getUserNodePath(LdapName userDn) { + String uid = userDn.getRdn(userDn.size() - 1).getValue().toString(); + return EntityType.user.basePath() + '/' + uid; + } + + public static Node getOrCreateUserNode(Session adminSession, LdapName userDn) { + try { + Node usersBase = adminSession.getNode(EntityType.user.basePath()); + String uid = userDn.getRdn(userDn.size() - 1).getValue().toString(); + 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(LdapAttrs.distinguishedName.property(), userDn.toString()); + userNode.setProperty(LdapAttrs.uid.property(), uid); + 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); + } else { + userNode = usersBase.getNode(uid); + } + 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()) + '/' + 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 { + LdapName userDn = cmsSession.getUserDn(); +// String uid = userDn.get(userDn.size() - 1); + Node userNode = getOrCreateUserNode(adminSession, userDn); +// if (!usersBase.hasNode(uid)) { +// userNode = usersBase.addNode(uid, NodeType.NT_UNSTRUCTURED); +// userNode.addMixin(EntityType.user.get()); +// userNode.addMixin(NodeType.MIX_CREATED); +// usersBase.setProperty(LdapAttrs.uid.property(), uid); +// usersBase.setProperty(LdapAttrs.distinguishedName.property(), userDn.toString()); +// adminSession.save(); +// } else { +// userNode = usersBase.getNode(uid); +// } + String cmsSessionUuid = cmsSession.getUuid().toString(); + Node cmsSessionNode; + if (!userNode.hasNode(cmsSessionUuid)) { + cmsSessionNode = userNode.addNode(cmsSessionUuid, NodeType.NT_UNSTRUCTURED); + cmsSessionNode.addMixin(NodeType.MIX_CREATED); + adminSession.save(); + JcrUtils.addPrivilege(adminSession, cmsSessionNode.getPath(), cmsSession.getUserRole(), + Privilege.JCR_ALL); + } else { + cmsSessionNode = userNode.getNode(cmsSessionUuid); + } + return cmsSessionNode; + } catch (RepositoryException e) { + throw new JcrException("Cannot create session dir for " + cmsSession, e); + } + } + + /** Singleton. */ + private SuiteUtils() { + + } + + public static Set extractRoles(String[] semiColArr) { + Set res = new HashSet<>(); + // TODO factorize and make it more robust + final String rolesPrefix = "roles:=\""; + // first one is layer id + for (int i = 1; i < semiColArr.length; i++) { + if (semiColArr[i].startsWith(rolesPrefix)) { + String rolesStr = semiColArr[i].substring(rolesPrefix.length()); + // remove last " + rolesStr = rolesStr.substring(0, rolesStr.lastIndexOf('\"')); + // TODO support AND (&) as well + String[] roles = rolesStr.split("\\|");// OR (|) + for (String role : roles) { + res.add(role.trim()); + } + } + } + return res; + } + +} diff --git a/org.argeo.app.core/src/org/argeo/suite/core/CustomMaintenanceService.java b/org.argeo.app.core/src/org/argeo/suite/core/CustomMaintenanceService.java new file mode 100644 index 0000000..4cd05cf --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/suite/core/CustomMaintenanceService.java @@ -0,0 +1,73 @@ +package org.argeo.suite.core; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + +import javax.jcr.ImportUUIDBehavior; +import javax.jcr.ItemExistsException; +import javax.jcr.Node; +import javax.jcr.RepositoryException; + +import org.argeo.api.cms.CmsLog; +import org.argeo.entity.EntityType; +import org.argeo.jcr.JcrUtils; +import org.argeo.maintenance.AbstractMaintenanceService; + +/** Base for custom initialisations. */ +public abstract class CustomMaintenanceService extends AbstractMaintenanceService { + private final static CmsLog log = CmsLog.getLog(AbstractMaintenanceService.class); + + protected List getTypologies() { + return new ArrayList<>(); + } + + protected String getTypologiesLoadBase() { + return "/sys/terms"; + } + + protected void loadTypologies(Node customBaseNode) throws RepositoryException, IOException { + List typologies = getTypologies(); + if (!typologies.isEmpty()) { + Node termsBase = JcrUtils.getOrAdd(customBaseNode, EntityType.terms.name(), EntityType.typologies.get()); + for (String terms : typologies) { + loadTerms(termsBase, terms); + } + // TODO do not save here, so that upper layers can decide when to save + termsBase.getSession().save(); + } + } + + protected void loadTerms(Node termsBase, String name) throws IOException, RepositoryException { + try { +// if (termsBase.hasNode(name)) +// return; + + String termsLoadPath = getTypologiesLoadBase() + '/' + name + ".xml"; + URL termsUrl = getClass().getClassLoader().getResource(termsLoadPath); + if (termsUrl == null) + throw new IllegalArgumentException("Terms '" + name + "' not found."); + try (InputStream in = termsUrl.openStream()) { + termsBase.getSession().importXML(termsBase.getPath(), in, + ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING); + } catch (ItemExistsException e) { + log.warn("Terms " + name + " exists with another UUID, removing it..."); + termsBase.getNode(name).remove(); + try (InputStream in = termsUrl.openStream()) { + termsBase.getSession().importXML(termsBase.getPath(), in, + ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING); + } + } + if (log.isDebugEnabled()) + log.debug("Terms '" + name + "' loaded."); + // TODO do not save here, so that upper layers can decide when to save + termsBase.getSession().save(); + } catch (RepositoryException | IOException e) { + log.error("Cannot load terms '" + name + "': " + e.getMessage()); + throw e; + } + } + +} diff --git a/org.argeo.app.core/src/org/argeo/suite/core/SuiteMaintenanceService.java b/org.argeo.app.core/src/org/argeo/suite/core/SuiteMaintenanceService.java new file mode 100644 index 0000000..ab2043f --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/suite/core/SuiteMaintenanceService.java @@ -0,0 +1,39 @@ +package org.argeo.suite.core; + +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.entity.EntityType; +import org.argeo.jcr.JcrUtils; +import org.argeo.maintenance.AbstractMaintenanceService; + +/** Initialises 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.core/src/org/argeo/suite/core/SuiteTerm.java b/org.argeo.app.core/src/org/argeo/suite/core/SuiteTerm.java new file mode 100644 index 0000000..227b567 --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/suite/core/SuiteTerm.java @@ -0,0 +1,62 @@ +package org.argeo.suite.core; + +import java.util.ArrayList; +import java.util.List; + +import org.argeo.entity.Term; + +/** + * A single term. Helper to optimise {@link SuiteTermsManager} implementation. + */ +class SuiteTerm implements Term { + private final String name; + private final String relativePath; + private final SuiteTypology typology; + private final String id; + + private final SuiteTerm parentTerm; + private final List subTerms = new ArrayList<>(); + + SuiteTerm(SuiteTypology typology, String relativePath, SuiteTerm parentTerm) { + this.typology = typology; + this.parentTerm = parentTerm; + this.relativePath = relativePath; + int index = relativePath.lastIndexOf('/'); + if (index > 0) { + this.name = relativePath.substring(index + 1); + } else { + this.name = relativePath; + } + id = typology.getName() + '/' + relativePath; + } + + @Override + public String getId() { + return id; + } + + @Override + public String getName() { + return name; + } + + public String getRelativePath() { + return relativePath; + } + + @Override + public SuiteTypology getTypology() { + return typology; + } + + @Override + public List getSubTerms() { + return subTerms; + } + + @Override + public SuiteTerm getParentTerm() { + return parentTerm; + } + +} diff --git a/org.argeo.app.core/src/org/argeo/suite/core/SuiteTermsManager.java b/org.argeo.app.core/src/org/argeo/suite/core/SuiteTermsManager.java new file mode 100644 index 0000000..41126c3 --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/suite/core/SuiteTermsManager.java @@ -0,0 +1,103 @@ +package org.argeo.suite.core; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.jcr.Node; +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.Session; + +import org.argeo.api.cms.CmsConstants; +import org.argeo.cms.jcr.CmsJcrUtils; +import org.argeo.entity.EntityNames; +import org.argeo.entity.EntityType; +import org.argeo.entity.Term; +import org.argeo.entity.TermsManager; +import org.argeo.jcr.Jcr; +import org.argeo.jcr.JcrException; + +/** Argeo Suite implementation of terms manager. */ +public class SuiteTermsManager implements TermsManager { + private final Map terms = new HashMap<>(); + private final Map typologies = new HashMap<>(); + + // JCR + private Repository repository; + private Session adminSession; + + public void init() { + adminSession = CmsJcrUtils.openDataAdminSession(repository, CmsConstants.SYS_WORKSPACE); + } + + @Override + public List listAllTerms(String typology) { + List res = new ArrayList<>(); + SuiteTypology t = getTypology(typology); + for (SuiteTerm term : t.getAllTerms()) { + res.add(term); + } + return res; + } + + @Override + public SuiteTerm getTerm(String termId) { + return terms.get(termId); + } + + @Override + public SuiteTypology getTypology(String typology) { + SuiteTypology t = typologies.get(typology); + if (t == null) { + Node termsNode = Jcr.getNode(adminSession, "SELECT * FROM [{0}] WHERE NAME()=\"{1}\"", + EntityType.terms.get(), typology); + if (termsNode == null) + throw new IllegalArgumentException("Typology " + typology + " not found."); + t = loadTypology(termsNode); + } + return t; + } + + SuiteTypology loadTypology(Node termsNode) { + try { + SuiteTypology typology = new SuiteTypology(termsNode); + for (Node termNode : Jcr.iterate(termsNode.getNodes())) { + if (termNode.isNodeType(EntityType.term.get())) { + SuiteTerm term = loadTerm(typology, termNode, null); + if (!term.getSubTerms().isEmpty()) + typology.markNotFlat(); + typology.getSubTerms().add(term); + } + } + typologies.put(typology.getName(), typology); + return typology; + } catch (RepositoryException e) { + throw new JcrException("Cannot load typology from " + termsNode, e); + } + } + + SuiteTerm loadTerm(SuiteTypology typology, Node termNode, SuiteTerm parentTerm) throws RepositoryException { + String name = termNode.getProperty(EntityNames.NAME).getString(); + String relativePath = parentTerm == null ? name : parentTerm.getRelativePath() + '/' + name; + SuiteTerm term = new SuiteTerm(typology, relativePath, parentTerm); + terms.put(term.getId(), term); + for (Node subTermNode : Jcr.iterate(termNode.getNodes())) { + if (termNode.isNodeType(EntityType.term.get())) { + SuiteTerm subTerm = loadTerm(typology, subTermNode, term); + term.getSubTerms().add(subTerm); + } + } + return term; + } + + public void destroy() { + Jcr.logout(adminSession); + } + + public void setRepository(Repository repository) { + this.repository = repository; + } + +} diff --git a/org.argeo.app.core/src/org/argeo/suite/core/SuiteTypology.java b/org.argeo.app.core/src/org/argeo/suite/core/SuiteTypology.java new file mode 100644 index 0000000..d9d6673 --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/suite/core/SuiteTypology.java @@ -0,0 +1,95 @@ +package org.argeo.suite.core; + +import java.util.ArrayList; +import java.util.List; + +import javax.jcr.Node; + +import org.argeo.entity.Term; +import org.argeo.entity.Typology; +import org.argeo.jcr.Jcr; + +/** A typology. Helper to optimise {@link SuiteTermsManager} implementation. */ +class SuiteTypology implements Typology { + private final String name; + private final Node node; + private boolean isFlat = true; + + private final List subTerms = new ArrayList<>(); + + public SuiteTypology(Node node) { + this.node = node; + this.name = Jcr.getName(this.node); + } + + @Override + public String getId() { + return name; + } + + public String getName() { + return name; + } + + public Node getNode() { + return node; + } + + void markNotFlat() { + if (isFlat) + isFlat = false; + } + + @Override + public boolean isFlat() { + return isFlat; + } + + @Override + public List getSubTerms() { + return subTerms; + } + + public List getAllTerms() { + if (isFlat) + return subTerms; + else { + List terms = new ArrayList<>(); + for (SuiteTerm subTerm : subTerms) { + terms.add(subTerm); + collectSubTerms(terms, subTerm); + } + return terms; + } + } + + public Term findTermByName(String name) { + List collected = new ArrayList<>(); + for (SuiteTerm subTerm : subTerms) { + collectTermsByName(subTerm, name, collected); + } + if (collected.isEmpty()) + return null; + if (collected.size() == 1) + return collected.get(0); + throw new IllegalArgumentException( + "There are " + collected.size() + " terms with name " + name + " in typology " + getId()); + } + + private void collectTermsByName(SuiteTerm term, String name, List collected) { + if (term.getName().equals(name)) { + collected.add(term); + } + for (SuiteTerm subTerm : term.getSubTerms()) { + collectTermsByName(subTerm, name, collected); + } + } + + private void collectSubTerms(List terms, SuiteTerm term) { + for (SuiteTerm subTerm : term.getSubTerms()) { + terms.add(subTerm); + collectSubTerms(terms, subTerm); + } + } + +} diff --git a/org.argeo.app.core/src/org/argeo/suite/library/DocxExtractor.java b/org.argeo.app.core/src/org/argeo/suite/library/DocxExtractor.java new file mode 100644 index 0000000..53e73f3 --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/suite/library/DocxExtractor.java @@ -0,0 +1,355 @@ +package org.argeo.suite.library; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.argeo.util.DigestUtils; +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; +import org.xml.sax.helpers.DefaultHandler; + +/** Parses a .docx document, trying its best to extract text and table data. */ +public class DocxExtractor { + final static String T = "t"; + final static String TC = "tc"; + final static String TR = "tr"; + final static String TBL = "tbl"; + final static String P = "p"; + static boolean debug = false; + + final static String PROOF_ERR = "proofErr"; + final static String TYPE = "type"; + final static String SPELL_START = "spellStart"; + final static String SPELL_END = "spellEnd"; + + protected List tables = new ArrayList<>(); + protected List text = new ArrayList<>(); + protected Map media = new TreeMap<>(); + private Set mediaDigests = new HashSet<>(); + + protected void processTextItem(List lines, String str) { + lines.add(str); + } + + protected boolean skipMedia(String digest) { + return false; + } + + class DocxHandler extends DefaultHandler { + + private StringBuilder buffer = new StringBuilder(); + private Tbl currentTbl = null; + + boolean inSpellErr = false; + boolean inParagraph = false; + + @Override + public void startElement(String uri, String name, String qName, Attributes attributes) throws SAXException { + // System.out.println(localName + " " + qName + " " + uri.hashCode()); + if (P.equals(name)) { + if (debug && currentTbl == null) + System.out.println("# START PARA"); + inParagraph = true; + } else if (PROOF_ERR.equals(name)) { + String type = attributes.getValue(uri, TYPE); + if (SPELL_START.equals(type)) + inSpellErr = true; + else if (SPELL_END.equals(type)) + inSpellErr = false; + + } else if (TBL.equals(name)) { + if (currentTbl != null) { + Tbl childTbl = new Tbl(); + childTbl.parentTbl = currentTbl; + currentTbl = childTbl; + // throw new IllegalStateException("Already an active table"); + } else { + currentTbl = new Tbl(); + } + } + } + + @Override + public void endElement(String uri, String name, String qName) throws SAXException { + if (name.equals(T)) { +// if (inSpellErr) { +// // do not reset the buffer +// return; +// } + + if (currentTbl != null) { + currentTbl.appendText(buffer.toString()); + } else { + String str = buffer.toString(); + // replace NO-BREAK SPACE by regular space. + str = str.replace('\u00A0', ' '); + str = str.strip(); + if (!"".equals(str)) { + processTextItem(text, str); + } + } + } else if (name.equals(P)) { + if (debug && currentTbl == null) + System.out.println("# END PARA"); + if (currentTbl != null) { + currentTbl.currentRow.current.text.append('\n'); + } else { + + } + inParagraph = false; + } else if (name.equals(TC)) { + if (currentTbl != null) + currentTbl.closeColumn(); + } else if (name.equals(TR)) { + if (currentTbl != null) + currentTbl.closeRow(); + } else if (name.equals(TBL)) { + if (currentTbl != null) { + tables.add(currentTbl); + if (currentTbl.parentTbl != null) + currentTbl = currentTbl.parentTbl; + else + currentTbl = null; + } else { + throw new IllegalStateException("Closing a table while none was open."); + } + } + // reset the buffer + buffer.setLength(0); + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + buffer.append(ch, start, length); + } + + } + + public static class Tbl { + Tbl parentTbl = null; + Tr currentRow = new Tr(); + List
rows = new ArrayList<>(); + + void appendText(String str) { + currentRow.current.text.append(str); + } + + void closeColumn() { + currentRow.columns.add(currentRow.current); + currentRow.current = new Tc(); + } + + void closeRow() { + rows.add(currentRow); + currentRow = new Tr(); + } + + public List
getRows() { + return rows; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + for (Tr tr : rows) { + String txt = tr.toString(); + sb.append(txt).append('\n'); + } + return sb.toString(); + } + } + + public static class Tr { + Tc current = new Tc(); + List columns = new ArrayList<>(); + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + for (Tc tc : columns) { + sb.append("\"").append(tc.toString()).append("\"").append(','); + } + return sb.toString(); + } + + public List getColumns() { + return columns; + } + + } + + public static class Tc { + StringBuilder text = new StringBuilder(); + + @Override + public String toString() { + return text.toString().trim(); + } + + } + + protected void parse(Reader in) { + try { + SAXParserFactory spf = SAXParserFactory.newInstance(); + spf.setNamespaceAware(true); + SAXParser saxParser = spf.newSAXParser(); + XMLReader xmlReader = saxParser.getXMLReader(); + xmlReader.setContentHandler(new DocxHandler()); + xmlReader.parse(new InputSource(in)); + } catch (ParserConfigurationException | SAXException | IOException e) { + throw new RuntimeException("Cannot parse document", e); + } + } + + public List getText() { + return text; + } + + public List getTables() { + return tables; + } + + public Map getMedia() { + return media; + } + + public void load(ZipInputStream zIn) { + try { + ZipEntry entry = null; + while ((entry = zIn.getNextEntry()) != null) { + if ("word/document.xml".equals(entry.getName())) { + try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { + byte[] buffer = new byte[2048]; + int len = 0; + while ((len = zIn.read(buffer)) > 0) { + out.write(buffer, 0, len); + } + try (Reader reader = new InputStreamReader(new ByteArrayInputStream(out.toByteArray()), + StandardCharsets.UTF_8)) { + parse(reader); + } + } + } else if (entry.getName().startsWith("word/media")) { + String fileName = entry.getName().substring(entry.getName().lastIndexOf('/') + 1); + int dotIndex = fileName.lastIndexOf('.'); + String ext = fileName.substring(dotIndex + 1).toLowerCase(); + // we ignore .jfif + if ("jpeg".equals(ext)) + ext = "jpg"; + fileName = fileName.substring(0, dotIndex) + "." + ext; + switch (ext) { + case "png": + case "jpg": + case "gif": + case "bmp": + case "tiff": + try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { + byte[] buffer = new byte[2048]; + int len = 0; + while ((len = zIn.read(buffer)) > 0) { + out.write(buffer, 0, len); + } + byte[] bytes = out.toByteArray(); + String digest = DigestUtils.digest(DigestUtils.MD5, bytes); + if (skipMedia(digest)) + break; + if (!mediaDigests.contains(digest)) { + media.put(fileName, bytes); + mediaDigests.add(digest); + } + } + break; + default: + break; + } + } else { + // System.out.println(entry.getName()); + } + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + // throw new IllegalArgumentException("No document.xml found"); + + } + +// public static Reader extractDocumentXml(ZipInputStream zIn) throws IOException { +// ZipEntry entry = null; +// while ((entry = zIn.getNextEntry()) != null) { +// if ("word/document.xml".equals(entry.getName())) { +// try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { +// byte[] buffer = new byte[2048]; +// int len = 0; +// while ((len = zIn.read(buffer)) > 0) { +// out.write(buffer, 0, len); +// } +// return new InputStreamReader(new ByteArrayInputStream(out.toByteArray()), StandardCharsets.UTF_8); +// } +// } else { +// System.out.println(entry.getName()); +// } +// } +// throw new IllegalArgumentException("No document.xml found"); +// } + +// protected static ZipInputStream openAsZip(String file) throws IOException { +// ZipInputStream zIn; +// Path path = Paths.get(file); +// zIn = new ZipInputStream(Files.newInputStream(path)); +// return zIn; +// } + + public static void main(String[] args) throws IOException { + if (args.length == 0) + throw new IllegalArgumentException("Provide a file path"); + Path p = Paths.get(args[0]); + + DocxExtractor importer = new DocxExtractor(); + try (ZipInputStream zIn = new ZipInputStream(Files.newInputStream(p))) { + importer.load(zIn); + } + // display + System.out.println("## TEXT"); + for (int i = 0; i < importer.text.size(); i++) { + String str = importer.text.get(i); + System.out.println(str); + } + + System.out.println("\n"); + + for (int i = 0; i < importer.tables.size(); i++) { + Tbl tbl = importer.tables.get(i); + System.out.println("## TABLE " + i); + System.out.println(tbl); + } + + System.out.println("## MEDIA"); + for (String fileName : importer.media.keySet()) { + int sizeKb = importer.media.get(fileName).length / 1024; + System.out.println(fileName + " " + sizeKb + " kB"); + } + } + +} diff --git a/org.argeo.app.core/src/org/argeo/suite/util/XPathUtils.java b/org.argeo.app.core/src/org/argeo/suite/util/XPathUtils.java new file mode 100644 index 0000000..df56d3f --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/suite/util/XPathUtils.java @@ -0,0 +1,176 @@ +package org.argeo.suite.util; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Calendar; + +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.query.Query; +import javax.jcr.query.QueryManager; + +import org.apache.jackrabbit.util.ISO9075; +import org.argeo.api.cms.CmsLog; + +/** Ease XPath generation for JCR requests */ +public class XPathUtils { + private final static CmsLog log = CmsLog.getLog(XPathUtils.class); + + private final static String QUERY_XPATH = "xpath"; + + public static String descendantFrom(String parentPath) { + if (notEmpty(parentPath)) { + if ("/".equals(parentPath)) + parentPath = ""; + // Hardcoded dependency to Jackrabbit. Remove + String result = "/jcr:root" + ISO9075.encodePath(parentPath); + if (log.isTraceEnabled()) { + String result2 = "/jcr:root" + parentPath; + if (!result2.equals(result)) + log.warn("Encoded Path " + result2 + " --> " + result); + } + return result; + } else + return ""; + } + + public static String localAnd(String... conditions) { + StringBuilder builder = new StringBuilder(); + for (String condition : conditions) { + if (notEmpty(condition)) { + builder.append(" ").append(condition).append(" and "); + } + } + if (builder.length() > 3) + return builder.substring(0, builder.length() - 4); + else + return ""; + } + + public static String xPathNot(String condition) { + if (notEmpty(condition)) + return "not(" + condition + ")"; + else + return ""; + } + + public static String getFreeTextConstraint(String filter) throws RepositoryException { + StringBuilder builder = new StringBuilder(); + if (notEmpty(filter)) { + String[] strs = filter.trim().split(" "); + for (String token : strs) { + builder.append("jcr:contains(.,'*" + encodeXPathStringValue(token) + "*') and "); + } + return builder.substring(0, builder.length() - 4); + } + return ""; + } + + public static String getPropertyContains(String propertyName, String filter) throws RepositoryException { + if (notEmpty(filter)) + return "jcr:contains(@" + propertyName + ",'*" + encodeXPathStringValue(filter) + "*')"; + return ""; + } + + private final static DateFormat jcrRefFormatter = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSS'+02:00'"); + + /** + * @param propertyName + * @param calendar the reference date + * @param lowerOrGreater "<", ">" TODO validate ">=" + * @return + * @throws RepositoryException + */ + public static String getPropertyDateComparaison(String propertyName, Calendar cal, String lowerOrGreater) + throws RepositoryException { + if (cal != null) { + String jcrDateStr = jcrRefFormatter.format(cal.getTime()); + + // jcrDateStr = "2015-08-03T05:00:03:000Z"; + String result = "@" + propertyName + " " + lowerOrGreater + " xs:dateTime('" + jcrDateStr + "')"; + return result; + } + return ""; + } + + public static String getPropertyEquals(String propertyName, String value) { + if (notEmpty(value)) + return "@" + propertyName + "='" + encodeXPathStringValue(value) + "'"; + return ""; + } + + public static String encodeXPathStringValue(String propertyValue) { + // TODO implement safer mechanism to escape invalid characters + // Also check why we have used this regex in ResourceSerrviceImpl l 474 + // String cleanedKey = key.replaceAll("(?:')", "''"); + String result = propertyValue.replaceAll("'", "''"); + return result; + } + + public static void andAppend(StringBuilder builder, String condition) { + if (notEmpty(condition)) { + builder.append(condition); + builder.append(" and "); + } + } + + public static void appendOrderByProperties(StringBuilder builder, boolean ascending, String... propertyNames) { + if (propertyNames.length > 0) { + builder.append(" order by "); + for (String propName : propertyNames) + builder.append("@").append(propName).append(", "); + builder = builder.delete(builder.length() - 2, builder.length()); + if (ascending) + builder.append(" ascending "); + else + builder.append(" descending "); + } + } + + public static void appendAndPropStringCondition(StringBuilder builder, String propertyName, String filter) + throws RepositoryException { + if (notEmpty(filter)) { + andAppend(builder, getPropertyContains(propertyName, filter)); + } + } + + public static void appendAndNotPropStringCondition(StringBuilder builder, String propertyName, String filter) + throws RepositoryException { + if (notEmpty(filter)) { + String cond = getPropertyContains(propertyName, filter); + builder.append(xPathNot(cond)); + builder.append(" and "); + } + } + + public static Query createQuery(Session session, String queryString) throws RepositoryException { + QueryManager queryManager = session.getWorkspace().getQueryManager(); + // Localise JCR properties for XPATH + queryString = localiseJcrItemNames(queryString); + return queryManager.createQuery(queryString, QUERY_XPATH); + } + + private final static String NS_JCR = "\\{http://www.jcp.org/jcr/1.0\\}"; + private final static String NS_NT = "\\{http://www.jcp.org/jcr/nt/1.0\\}"; + private final static String NS_MIX = "\\{http://www.jcp.org/jcr/mix/1.0\\}"; + + /** + * Replace the generic namespace with the local "jcr:", "nt:", "mix:" values. It + * is a workaround that must be later cleaned + */ + public static String localiseJcrItemNames(String name) { + name = name.replaceAll(NS_JCR, "jcr:"); + name = name.replaceAll(NS_NT, "nt:"); + name = name.replaceAll(NS_MIX, "mix:"); + return name; + } + + private static boolean notEmpty(String stringToTest) { + return !(stringToTest == null || "".equals(stringToTest.trim())); + } + + /** Singleton. */ + private XPathUtils() { + + } +} diff --git a/org.argeo.app.core/src/org/argeo/support/geonames/GeonamesAdm.java b/org.argeo.app.core/src/org/argeo/support/geonames/GeonamesAdm.java new file mode 100644 index 0000000..d578272 --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/support/geonames/GeonamesAdm.java @@ -0,0 +1,157 @@ +package org.argeo.support.geonames; + +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +/** A Geonames administrative subdivision. */ +public class GeonamesAdm { + private final Long geonameId; + private final String countryCode; + private final String adminCode1; + private final String admLevel; + private final Integer level; + private final String name; + private final String asciiName; + private final List alternateNames; + private final Double lat; + private final Double lng; + private final LocalDate lastUpdated; + private final ZoneId timeZone; + + private final Long[] upperLevelIds = new Long[5]; + private final List upperLevels = new ArrayList<>(); + + private List row; + + /** Initialise from a row in the main Geonames table. */ + public GeonamesAdm(List row) { + geonameId = Long.parseLong(row.get(0)); + admLevel = row.get(7); + countryCode = row.get(8); + adminCode1 = row.get(10); + if (admLevel.startsWith("ADM")) { + if (admLevel.endsWith("H")) + level = Integer.parseInt(admLevel.substring(3, admLevel.length() - 1)); + else + level = Integer.parseInt(admLevel.substring(3)); + } else if (admLevel.equals("PCLI")) { + level = 0; + } else { + throw new IllegalArgumentException("Unsupported admin level " + admLevel); + } + name = row.get(1); + asciiName = row.get(2); + alternateNames = Arrays.asList(row.get(3).split(",")); + lat = Double.parseDouble(row.get(4)); + lng = Double.parseDouble(row.get(5)); + lastUpdated = LocalDate.parse(row.get(18)); + timeZone = ZoneId.of(row.get(17)); + // upper levels + if (row.get(11) != null && !row.get(11).trim().equals("")) + upperLevelIds[2] = Long.parseLong(row.get(11)); + if (row.get(12) != null && !row.get(12).trim().equals("")) + upperLevelIds[3] = Long.parseLong(row.get(12)); + if (row.get(13) != null && !row.get(13).trim().equals("")) + upperLevelIds[4] = Long.parseLong(row.get(13)); + this.row = row; + } + + public void mapUpperLevels(Map index) { + for (int i = 0; i < level; i++) { + Long geonameId = upperLevelIds[i]; + upperLevels.add(i, index.get(geonameId)); + } + } + + public Long getGeonameId() { + return geonameId; + } + + public Integer getLevel() { + return level; + } + + public String getName() { + return name; + } + + public String getName(Function transform) { + if (transform != null) + return transform.apply(name); + else + return name; + + } + + public String getAsciiName() { + return asciiName; + } + + public List getAlternateNames() { + return alternateNames; + } + + public Double getLat() { + return lat; + } + + public Double getLng() { + return lng; + } + + public String getCountryCode() { + return countryCode; + } + + public String getAdmLevel() { + return admLevel; + } + + public List getRow() { + return row; + } + + public LocalDate getLastUpdated() { + return lastUpdated; + } + + public ZoneId getTimeZone() { + return timeZone; + } + + public String getAdminCode1() { + return adminCode1; + } + + public Long[] getUpperLevelIds() { + return upperLevelIds; + } + + public List getUpperLevels() { + return upperLevels; + } + + @Override + public int hashCode() { + return geonameId.intValue(); + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof GeonamesAdm)) + return false; + GeonamesAdm other = (GeonamesAdm) obj; + return geonameId.equals(other.geonameId); + } + + @Override + public String toString() { + return name + " (ADM" + level + " " + geonameId + ")"; + } + +} diff --git a/org.argeo.app.core/src/org/argeo/support/geonames/ImportGeonamesAdmin.java b/org.argeo.app.core/src/org/argeo/support/geonames/ImportGeonamesAdmin.java new file mode 100644 index 0000000..9af5987 --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/support/geonames/ImportGeonamesAdmin.java @@ -0,0 +1,93 @@ +package org.argeo.support.geonames; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.argeo.util.CsvParser; +import org.argeo.util.CsvWriter; + +/** Import GeoNames administrative division from the main table. */ +public class ImportGeonamesAdmin { + // private Log log = LogFactory.getLog(ImportGeonamesAdmin.class); + private Map geonamesAdms = new HashMap<>(); + + /** Loads the data. */ + public void parse(InputStream in) { + Map countryGeonameIds = new HashMap<>(); + Map admin1GeonameIds = new HashMap<>(); + CsvParser csvParser = new CsvParser() { + + @Override + protected void processLine(Integer lineNumber, List header, List tokens) { + if (!"A".equals(tokens.get(6))) + return; + GeonamesAdm geonamesAdm = new GeonamesAdm(tokens); + geonamesAdms.put(geonamesAdm.getGeonameId(), geonamesAdm); + if (geonamesAdm.getAdmLevel().equals("PCLI")) + countryGeonameIds.put(geonamesAdm.getCountryCode(), geonamesAdm.getGeonameId()); + if (geonamesAdm.getAdmLevel().equals("ADM1")) + admin1GeonameIds.put(geonamesAdm.getAdminCode1(), geonamesAdm.getGeonameId()); + } + }; + csvParser.setSeparator('\t'); + csvParser.setNoHeader(true); + csvParser.parse(in, StandardCharsets.UTF_8); + + // fill upper levels + for (GeonamesAdm adm : geonamesAdms.values()) { + adm.getUpperLevelIds()[0] = countryGeonameIds.get(adm.getCountryCode()); + if (adm.getLevel() > 0) + adm.getUpperLevelIds()[1] = admin1GeonameIds.get(adm.getAdminCode1()); + adm.mapUpperLevels(geonamesAdms); + } + + } + + public Map getGeonamesAdms() { + return geonamesAdms; + } + + /** + * Copies only the Geonames of feature class 'A' (administrative subdivisions). + */ + public static void filterGeonamesAdm(InputStream in, OutputStream out) { + CsvWriter csvWriter = new CsvWriter(out, StandardCharsets.UTF_8); + csvWriter.setSeparator('\t'); + CsvParser csvParser = new CsvParser() { + + @Override + protected void processLine(Integer lineNumber, List header, List tokens) { + if (tokens.size() < 7 || !"A".equals(tokens.get(6))) + return; + csvWriter.writeLine(tokens); + } + }; + csvParser.setSeparator('\t'); + csvParser.setNoHeader(true); + csvParser.parse(in, StandardCharsets.UTF_8); + } + + public static void main(String[] args) throws IOException { +// String country = "allCountries"; + String country = "CI"; +// try (InputStream in = Files +// .newInputStream(Paths.get(System.getProperty("user.home") + "/gis/data/geonames/" + country + ".txt")); +// OutputStream out = Files.newOutputStream( +// Paths.get(System.getProperty("user.home") + "/gis/data/geonames/" + country + "-adm.txt"))) { +// ImportGeonamesAdmin.filterGeonamesAdm(in, out); +// } + try (InputStream in = Files.newInputStream( + Paths.get(System.getProperty("user.home") + "/gis/data/geonames/" + country + "-adm.txt"))) { + ImportGeonamesAdmin importGeonamesAdmin = new ImportGeonamesAdmin(); + importGeonamesAdmin.parse(in); + } + } + +} diff --git a/org.argeo.app.core/src/org/argeo/support/odk/BundleResourceOdkForm.java b/org.argeo.app.core/src/org/argeo/support/odk/BundleResourceOdkForm.java new file mode 100644 index 0000000..fc55f35 --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/support/odk/BundleResourceOdkForm.java @@ -0,0 +1,101 @@ +package org.argeo.support.odk; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.Map; + +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.io.IOUtils; +import org.argeo.util.DigestUtils; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; + +/** {@link OdkForm} implementation based on an OSGi {@link Bundle} resource. */ +public class BundleResourceOdkForm implements OdkForm { + private String formId; + private String name; + private String version; + private String description; + private String hash; + private String fileName; + + private byte[] data; + + public void init(Map properties, BundleContext bundleContext) throws IOException { + String location = properties.get("location"); + fileName = FilenameUtils.getName(location); + URL url = bundleContext.getBundle().getResource(location); + data = IOUtils.toByteArray(url.openStream()); + hash = "md5:" + DigestUtils.digest(DigestUtils.MD5, data); + + // TODO get it from the XML + formId = properties.get("formId"); + version = properties.get("version"); + + name = properties.get("name"); + description = properties.get("description"); + } + + @Override + public String getFormId() { + return formId; + } + + @Override + public String getName() { + return name; + } + + @Override + public String getVersion() { + return version; + } + + @Override + public String getDescription() { + return description; + } + + @Override + public String getHash(String hashType) { + return hash; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public InputStream openStream() { + return new ByteArrayInputStream(data); + } + + @Override + public int hashCode() { + assert formId != null; + assert version != null; + return formId.hashCode() + version.hashCode(); + } + + @Override + public boolean equals(Object obj) { + assert formId != null; + assert version != null; + if (!(obj instanceof OdkForm)) + return false; + OdkForm other = (OdkForm) obj; + assert other.getFormId() != null; + assert other.getVersion() != null; + + return other.getFormId().equals(formId) && other.getVersion().equals(version); + } + + @Override + public String toString() { + return "ODK Form " + formId + ", v" + version; + } + +} diff --git a/org.argeo.app.core/src/org/argeo/support/odk/OdkForm.java b/org.argeo.app.core/src/org/argeo/support/odk/OdkForm.java new file mode 100644 index 0000000..7b79a13 --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/support/odk/OdkForm.java @@ -0,0 +1,20 @@ +package org.argeo.support.odk; + +import java.io.InputStream; + +/** Abstraction of a single ODK form. */ +public interface OdkForm { + String getFormId(); + + String getName(); + + String getVersion(); + + String getDescription(); + + String getHash(String hashType); + + String getFileName(); + + InputStream openStream(); +} diff --git a/org.argeo.app.core/src/org/argeo/support/odk/OdkNames.java b/org.argeo.app.core/src/org/argeo/support/odk/OdkNames.java new file mode 100644 index 0000000..fbb2087 --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/support/odk/OdkNames.java @@ -0,0 +1,7 @@ +package org.argeo.support.odk; + +/** Names related to ODK. */ +public interface OdkNames { + + public final static String H_HTML = "h:html"; +} diff --git a/org.argeo.app.core/src/org/argeo/support/odk/OdkUtils.java b/org.argeo.app.core/src/org/argeo/support/odk/OdkUtils.java new file mode 100644 index 0000000..940103f --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/support/odk/OdkUtils.java @@ -0,0 +1,198 @@ +package org.argeo.support.odk; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; + +import javax.jcr.ImportUUIDBehavior; +import javax.jcr.Node; +import javax.jcr.NodeIterator; +import javax.jcr.Property; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.Value; +import javax.jcr.nodetype.NodeType; +import javax.jcr.query.Query; +import javax.jcr.query.QueryResult; +import javax.jcr.query.Row; +import javax.jcr.query.RowIterator; + +import org.argeo.api.cms.CmsLog; +import org.argeo.entity.EntityMimeType; +import org.argeo.entity.EntityType; +import org.argeo.jcr.Jcr; +import org.argeo.jcr.JcrUtils; +import org.argeo.jcr.JcrxApi; +import org.argeo.util.DigestUtils; + +/** Utilities around ODK. */ +public class OdkUtils { + private final static CmsLog log = CmsLog.getLog(OdkUtils.class); + + public static Node loadOdkForm(Node formBase, String name, InputStream in, InputStream... additionalNodes) + throws RepositoryException, IOException { + if (!formBase.isNodeType(EntityType.formSet.get())) + throw new IllegalArgumentException( + "Parent path " + formBase + " must be of type " + EntityType.formSet.get()); + Node form = JcrUtils.getOrAdd(formBase, name, OrxListName.xform.get(), NodeType.MIX_VERSIONABLE); + + String previousCsum = JcrxApi.getChecksum(form, JcrxApi.MD5); + String previousFormId = Jcr.get(form, OrxListName.formID.get()); + String previousFormVersion = Jcr.get(form, OrxListName.version.get()); + + Session s = formBase.getSession(); + s.importXML(form.getPath(), in, ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING); + + for (InputStream additionalIn : additionalNodes) { + s.importXML(form.getPath(), additionalIn, ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING); + } + s.save(); + + // manage instances + // NodeIterator instances = + // form.getNodes("h:html/h:head/xforms:model/xforms:instance"); + NodeIterator instances = form.getNode("h:html/h:head/xforms:model").getNodes("xforms:instance"); + Node primaryInstance = null; + while (instances.hasNext()) { + Node instance = instances.nextNode(); + if (primaryInstance == null) { + primaryInstance = instance; + } else {// secondary instances + String instanceId = instance.getProperty("id").getString(); + URI instanceUri = null; + if (instance.hasProperty("src")) + try { + instanceUri = new URI(instance.getProperty("src").getString()); + } catch (URISyntaxException e) { + throw new IllegalArgumentException("Instance " + instanceId + " has a badly formatted URI", e); + } + if (instanceUri != null) { + if ("jr".equals(instanceUri.getScheme())) { + String uuid; + String mimeType; + String encoding = StandardCharsets.UTF_8.name(); + String type = instanceUri.getHost(); + String path = instanceUri.getPath(); + if ("file".equals(type)) { + if (!path.endsWith(".xml")) + throw new IllegalArgumentException("File uri " + instanceUri + " must end with .xml"); + // Work around bug in ODK Collect not supporting paths + // path = path.substring(0, path.length() - ".xml".length()); + // Node target = file.getSession().getNode(path); + uuid = path.substring(1, path.length() - ".xml".length()); + mimeType = EntityMimeType.XML.getMimeType(); + } else if ("file-csv".equals(type)) { + if (!path.endsWith(".csv")) + throw new IllegalArgumentException("File uri " + instanceUri + " must end with .csv"); + // Work around bug in ODK Collect not supporting paths + // path = path.substring(0, path.length() - ".csv".length()); + // Node target = file.getSession().getNode(path); + uuid = path.substring(1, path.length() - ".csv".length()); + mimeType = EntityMimeType.CSV.getMimeType(); + } else { + throw new IllegalArgumentException("Unsupported instance type " + type); + } + Node manifest = JcrUtils.getOrAdd(form, OrxManifestName.manifest.name(), + OrxManifestName.manifest.get()); + Node file = JcrUtils.getOrAdd(manifest, instanceId); + file.addMixin(NodeType.MIX_MIMETYPE); + file.setProperty(Property.JCR_MIMETYPE, mimeType); + file.setProperty(Property.JCR_ENCODING, encoding); + Node target = file.getSession().getNodeByIdentifier(uuid); + + if (target.isNodeType(NodeType.NT_QUERY)) { + Query query = target.getSession().getWorkspace().getQueryManager().getQuery(target); + query.setLimit(10); + QueryResult queryResult = query.execute(); + RowIterator rit = queryResult.getRows(); + while (rit.hasNext()) { + Row row = rit.nextRow(); + for (Value value : row.getValues()) { + System.out.print(value.getString()); + System.out.print(','); + } + System.out.print('\n'); + } + + } + + if (target.isNodeType(NodeType.MIX_REFERENCEABLE)) { + file.setProperty(Property.JCR_ID, target); + if (file.hasProperty(Property.JCR_PATH)) + file.getProperty(Property.JCR_PATH).remove(); + } else { + file.setProperty(Property.JCR_PATH, target.getPath()); + if (file.hasProperty(Property.JCR_ID)) + file.getProperty(Property.JCR_ID).remove(); + } + } + } + } + } + + if (primaryInstance == null) + throw new IllegalArgumentException("No primary instance found in " + form); + if (!primaryInstance.hasNodes()) + throw new IllegalArgumentException("No data found in primary instance of " + form); + NodeIterator primaryInstanceChildren = primaryInstance.getNodes(); + Node data = primaryInstanceChildren.nextNode(); + if (primaryInstanceChildren.hasNext()) + throw new IllegalArgumentException("More than one data found in primary instance of " + form); + String formId = data.getProperty("id").getString(); + if (previousFormId != null && !formId.equals(previousFormId)) + log.warn("Form id of " + form + " changed from " + previousFormId + " to " + formId); + form.setProperty(OrxListName.formID.get(), formId); + String formVersion = data.getProperty("version").getString(); + + if (previousCsum == null)// save before checksuming + s.save(); + String newCsum; + try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { + s.exportDocumentView(form.getPath() + "/" + OdkNames.H_HTML, out, true, false); + newCsum = DigestUtils.digest(DigestUtils.MD5, out.toByteArray()); + } + if (previousCsum == null) { + JcrxApi.addChecksum(form, newCsum); + JcrUtils.updateLastModified(form); + form.setProperty(OrxListName.version.get(), formVersion); + s.save(); + s.getWorkspace().getVersionManager().checkpoint(form.getPath()); + if (log.isDebugEnabled()) + log.debug("New form " + form); + } else { + if (newCsum.equals(previousCsum)) { + // discard + s.refresh(false); + if (log.isDebugEnabled()) + log.debug("Unmodified form " + form); + return form; + } else { + if (formVersion.equals(previousFormVersion)) { + s.refresh(false); + throw new IllegalArgumentException("Form " + form + " has been changed but version " + formVersion + + " has not been changed, discarding changes..."); + } + form.setProperty(OrxListName.version.get(), formVersion); + JcrxApi.addChecksum(form, newCsum); + JcrUtils.updateLastModified(form); + s.save(); + s.getWorkspace().getVersionManager().checkpoint(form.getPath()); + if (log.isDebugEnabled()) { + log.debug("Updated form " + form); + log.debug("Previous csum " + previousCsum); + log.debug("New csum " + newCsum); + } + } + } + return form; + } + + /** Singleton. */ + private OdkUtils() { + + } + +} diff --git a/org.argeo.app.core/src/org/argeo/support/odk/OrxListName.java b/org.argeo.app.core/src/org/argeo/support/odk/OrxListName.java new file mode 100644 index 0000000..0404c90 --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/support/odk/OrxListName.java @@ -0,0 +1,29 @@ +package org.argeo.support.odk; + +import org.argeo.entity.JcrName; + +/** Types related to the http://openrosa.org/xforms/xformsList namespace. */ +public enum OrxListName implements JcrName { + xform, + // names + formID, version; + + @Override + public String getPrefix() { + return prefix(); + } + + public static String prefix() { + return "orxList"; + } + + @Override + public String getNamespace() { + return namespace(); + } + + public static String namespace() { + return "http://openrosa.org/xforms/xformsList"; + } + +} diff --git a/org.argeo.app.core/src/org/argeo/support/odk/OrxManifestName.java b/org.argeo.app.core/src/org/argeo/support/odk/OrxManifestName.java new file mode 100644 index 0000000..c9fcc5d --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/support/odk/OrxManifestName.java @@ -0,0 +1,27 @@ +package org.argeo.support.odk; + +import org.argeo.entity.JcrName; + +/** Types related to the http://openrosa.org/xforms/xformsList namespace. */ +public enum OrxManifestName implements JcrName { + manifest, mediaFile; + + @Override + public String getPrefix() { + return prefix(); + } + + public static String prefix() { + return "orxManifest"; + } + + @Override + public String getNamespace() { + return namespace(); + } + + public static String namespace() { + return "http://openrosa.org/xforms/xformsManifest"; + } + +} diff --git a/org.argeo.app.core/src/org/argeo/support/odk/OrxType.java b/org.argeo.app.core/src/org/argeo/support/odk/OrxType.java new file mode 100644 index 0000000..3b5d601 --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/support/odk/OrxType.java @@ -0,0 +1,27 @@ +package org.argeo.support.odk; + +import org.argeo.entity.JcrName; + +/** Types related to the http://openrosa.org/xforms/xformsList namespace. */ +public enum OrxType implements JcrName { + submission, xml_submission_file; + + @Override + public String getPrefix() { + return prefix(); + } + + public static String prefix() { + return "orx"; + } + + @Override + public String getNamespace() { + return namespace(); + } + + public static String namespace() { + return "http://openrosa.org/xforms"; + } + +} diff --git a/org.argeo.app.core/src/org/argeo/support/odk/odk.cnd b/org.argeo.app.core/src/org/argeo/support/odk/odk.cnd new file mode 100644 index 0000000..d80096d --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/support/odk/odk.cnd @@ -0,0 +1,56 @@ + + + + + + + +[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) + +// OpenRosa web API + +[orxList:xform] > mix:created, mix:lastModified, jcrx:csum, entity:form +- orxList:formID (STRING) +- orxList:version (STRING) ++ h:html (odk:html) = odk:html ++ manifest (orxManifest:manifest) = orxManifest:manifest + +[orxManifest:manifest] ++ * (orxManifest:mediaFile) = orxManifest:mediaFile + +[orxManifest:mediaFile] > nt:address, jcrx:csum + +[orx:submission] > mix:created, entity:formSubmission ++ xml_submission_file (nt:unstructured) = nt:unstructured ++ * (nt:file) * + + diff --git a/org.argeo.app.core/src/org/argeo/support/xforms/FormSubmissionListener.java b/org.argeo.app.core/src/org/argeo/support/xforms/FormSubmissionListener.java new file mode 100644 index 0000000..e23ef36 --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/support/xforms/FormSubmissionListener.java @@ -0,0 +1,10 @@ +package org.argeo.support.xforms; + +import javax.jcr.Node; +import javax.jcr.RepositoryException; + +/** Called when a user has received a new form submission. */ +public interface FormSubmissionListener { + /** Called after a form submission has been stored in the user area. */ + void formSubmissionReceived(Node node) throws RepositoryException; +} diff --git a/org.argeo.app.core/src/org/argeo/support/xforms/xforms.cnd b/org.argeo.app.core/src/org/argeo/support/xforms/xforms.cnd new file mode 100644 index 0000000..c24dbae --- /dev/null +++ b/org.argeo.app.core/src/org/argeo/support/xforms/xforms.cnd @@ -0,0 +1,39 @@ + + +[xforms:model] ++ xforms:instance (xforms:instance) = xforms:instance * ++ xforms:bind (xforms:bind) = xforms:bind * ++ xforms:setvalue (xforms:setvalue) = xforms:setvalue * + +[xforms:instance] > nt:unstructured + +[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/org.argeo.app.servlet.odk/.classpath b/org.argeo.app.servlet.odk/.classpath new file mode 100644 index 0000000..e801ebf --- /dev/null +++ b/org.argeo.app.servlet.odk/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/org.argeo.app.servlet.odk/.gitignore b/org.argeo.app.servlet.odk/.gitignore new file mode 100644 index 0000000..09e3bc9 --- /dev/null +++ b/org.argeo.app.servlet.odk/.gitignore @@ -0,0 +1,2 @@ +/bin/ +/target/ diff --git a/org.argeo.app.servlet.odk/.project b/org.argeo.app.servlet.odk/.project new file mode 100644 index 0000000..d427e5d --- /dev/null +++ b/org.argeo.app.servlet.odk/.project @@ -0,0 +1,33 @@ + + + org.argeo.app.servlet.odk + + + + + + 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.app.servlet.odk/META-INF/.gitignore b/org.argeo.app.servlet.odk/META-INF/.gitignore new file mode 100644 index 0000000..4854a41 --- /dev/null +++ b/org.argeo.app.servlet.odk/META-INF/.gitignore @@ -0,0 +1 @@ +/MANIFEST.MF diff --git a/org.argeo.app.servlet.odk/OSGI-INF/odkFormListServlet.xml b/org.argeo.app.servlet.odk/OSGI-INF/odkFormListServlet.xml new file mode 100644 index 0000000..937b474 --- /dev/null +++ b/org.argeo.app.servlet.odk/OSGI-INF/odkFormListServlet.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/org.argeo.app.servlet.odk/OSGI-INF/odkFormServlet.xml b/org.argeo.app.servlet.odk/OSGI-INF/odkFormServlet.xml new file mode 100644 index 0000000..7f7e4db --- /dev/null +++ b/org.argeo.app.servlet.odk/OSGI-INF/odkFormServlet.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/org.argeo.app.servlet.odk/OSGI-INF/odkManifestServlet.xml b/org.argeo.app.servlet.odk/OSGI-INF/odkManifestServlet.xml new file mode 100644 index 0000000..cfc56ef --- /dev/null +++ b/org.argeo.app.servlet.odk/OSGI-INF/odkManifestServlet.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/org.argeo.app.servlet.odk/OSGI-INF/odkServletContext.xml b/org.argeo.app.servlet.odk/OSGI-INF/odkServletContext.xml new file mode 100644 index 0000000..78b5b66 --- /dev/null +++ b/org.argeo.app.servlet.odk/OSGI-INF/odkServletContext.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/org.argeo.app.servlet.odk/OSGI-INF/odkSubmissionServlet.xml b/org.argeo.app.servlet.odk/OSGI-INF/odkSubmissionServlet.xml new file mode 100644 index 0000000..bce66c4 --- /dev/null +++ b/org.argeo.app.servlet.odk/OSGI-INF/odkSubmissionServlet.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/org.argeo.app.servlet.odk/bnd.bnd b/org.argeo.app.servlet.odk/bnd.bnd new file mode 100644 index 0000000..3de9158 --- /dev/null +++ b/org.argeo.app.servlet.odk/bnd.bnd @@ -0,0 +1,18 @@ +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,\ +OSGI-INF/odkManifestServlet.xml + +Import-Package:\ +org.osgi.service.http.context,\ +javax.jcr.nodetype,\ +* diff --git a/org.argeo.app.servlet.odk/build.properties b/org.argeo.app.servlet.odk/build.properties new file mode 100644 index 0000000..1cdf3dd --- /dev/null +++ b/org.argeo.app.servlet.odk/build.properties @@ -0,0 +1,6 @@ +output.. = bin/ +bin.includes = META-INF/,\ + .,\ + OSGI-INF/,\ + OSGI-INF/odkServletContext.xml +source.. = src/ diff --git a/org.argeo.app.servlet.odk/pom.xml b/org.argeo.app.servlet.odk/pom.xml new file mode 100644 index 0000000..7c9b133 --- /dev/null +++ b/org.argeo.app.servlet.odk/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + + org.argeo.suite + argeo-suite + 2.3-SNAPSHOT + .. + + org.argeo.app.servlet.odk + ODK Servlets + jar + + + org.argeo.suite + org.argeo.app.core + 2.3-SNAPSHOT + + + + + org.argeo.commons + org.argeo.cms.servlet + ${version.argeo-commons} + + + diff --git a/org.argeo.app.servlet.odk/src/org/argeo/support/odk/servlet/OdkFormListServlet.java b/org.argeo.app.servlet.odk/src/org/argeo/support/odk/servlet/OdkFormListServlet.java new file mode 100644 index 0000000..16e525a --- /dev/null +++ b/org.argeo.app.servlet.odk/src/org/argeo/support/odk/servlet/OdkFormListServlet.java @@ -0,0 +1,169 @@ +package org.argeo.support.odk.servlet; + +import java.io.IOException; +import java.io.Writer; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +import javax.jcr.Node; +import javax.jcr.NodeIterator; +import javax.jcr.Property; +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.query.Query; +import javax.jcr.query.QueryResult; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.argeo.api.cms.CmsConstants; +import org.argeo.api.cms.CmsLog; +import org.argeo.cms.auth.RemoteAuthUtils; +import org.argeo.cms.servlet.ServletHttpRequest; +import org.argeo.entity.EntityType; +import org.argeo.jcr.Jcr; +import org.argeo.jcr.JcrxApi; +import org.argeo.support.odk.OdkForm; +import org.argeo.support.odk.OrxListName; +import org.argeo.support.odk.OrxManifestName; + +/** Lists available forms. */ +public class OdkFormListServlet extends HttpServlet { + private static final long serialVersionUID = 2706191315048423321L; + private final static CmsLog log = CmsLog.getLog(OdkFormListServlet.class); + + private Set odkForms = Collections.synchronizedSet(new HashSet<>()); + +// private DateTimeFormatter versionFormatter = DateTimeFormatter.ofPattern("YYYY-MM-dd-HHmm") +// .withZone(ZoneId.from(ZoneOffset.UTC)); + + private Repository repository; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + resp.setContentType("text/xml; charset=utf-8"); + resp.setHeader("X-OpenRosa-Version", "1.0"); + resp.setDateHeader("Date", System.currentTimeMillis()); + + String serverName = req.getServerName(); + int serverPort = req.getServerPort(); + String protocol = serverPort == 443 || req.isSecure() ? "https" : "http"; + + String pathInfo = req.getPathInfo(); + + Session session = RemoteAuthUtils.doAs(() -> Jcr.login(repository, CmsConstants.SYS_WORKSPACE), + new ServletHttpRequest(req)); +// session = NodeUtils.openDataAdminSession(repository, NodeConstants.SYS_WORKSPACE); + Writer writer = resp.getWriter(); + writer.append(""); + writer.append(""); + boolean oldApproach = false; + if (!oldApproach) { + try { + + Query query; + if (pathInfo == null) { +// query = session.getWorkspace().getQueryManager() +// .createQuery("SELECT * FROM [nt:unstructured]", Query.JCR_SQL2); + query = session.getWorkspace().getQueryManager() + .createQuery("SELECT * FROM [" + OrxListName.xform.get() + "]", Query.JCR_SQL2); + } else { + query = session.getWorkspace().getQueryManager() + .createQuery( + "SELECT node FROM [" + OrxListName.xform.get() + + "] AS node WHERE ISDESCENDANTNODE (node, '" + pathInfo + "')", + Query.JCR_SQL2); + } + QueryResult queryResult = query.execute(); + + NodeIterator nit = queryResult.getNodes(); +// log.debug(session.getUserID()); +// log.debug(session.getWorkspace().getName()); +// NodeIterator nit = session.getRootNode().getNodes(); +// while (nit.hasNext()) { +// log.debug(nit.nextNode()); +// } + while (nit.hasNext()) { + StringBuilder sb = new StringBuilder(); + Node node = nit.nextNode(); + if (node.isNodeType(OrxListName.xform.get())) { + sb.append(""); + sb.append("" + node.getProperty(OrxListName.formID.get()).getString() + ""); + sb.append("" + Jcr.getTitle(node) + ""); + sb.append("" + node.getProperty(OrxListName.version.get()).getString() + ""); + sb.append("md5:" + JcrxApi.getChecksum(node, JcrxApi.MD5) + ""); + if (node.hasProperty(Property.JCR_DESCRIPTION)) + sb.append("" + node.getProperty(Property.JCR_DESCRIPTION).getString() + ""); + sb.append("" + protocol + "://" + serverName + + (serverPort == 80 || serverPort == 443 ? "" : ":" + serverPort) + "/api/odk/form" + + node.getPath() + ""); + if (node.hasNode(OrxManifestName.manifest.name())) { + sb.append("" + protocol + "://" + serverName + + (serverPort == 80 || serverPort == 443 ? "" : ":" + serverPort) + + "/api/odk/formManifest" + node.getNode(OrxManifestName.manifest.name()).getPath() + + ""); + } + sb.append(""); + } else if (node.isNodeType(EntityType.formSet.get())) { + sb.append(""); + sb.append("" + node.getPath() + ""); + sb.append("" + node.getProperty(Property.JCR_TITLE).getString() + ""); + sb.append("" + protocol + "://" + serverName + + (serverPort == 80 || serverPort == 443 ? "" : ":" + serverPort) + "/api/odk/formList" + + node.getPath() + ""); + sb.append(""); + } + String str = sb.toString(); + if (!str.equals("")) { + if (log.isDebugEnabled()) + log.debug(str); + writer.append(str); + } + } + } catch (RepositoryException e) { + e.printStackTrace(); + // TODO error message + // resp.sendError(500); + resp.sendError(503); + } finally { + Jcr.logout(session); + } + + } else { + for (OdkForm form : odkForms) { + StringBuilder sb = new StringBuilder(); + sb.append(""); + sb.append("" + form.getFormId() + ""); + sb.append("" + form.getName() + ""); + sb.append("" + form.getVersion() + ""); + sb.append("" + form.getHash(null) + ""); + sb.append("" + form.getDescription() + ""); + sb.append("" + protocol + "://" + serverName + + (serverPort == 80 || serverPort == 443 ? "" : ":" + serverPort) + "/api/odk/form/" + + form.getFileName() + ""); + sb.append(""); + String str = sb.toString(); + if (log.isDebugEnabled()) + log.debug(str); + writer.append(str); + } + } + writer.append(""); + } + + public void addForm(OdkForm odkForm) { + odkForms.add(odkForm); + } + + public void removeForm(OdkForm odkForm) { + odkForms.remove(odkForm); + } + + public void setRepository(Repository repository) { + this.repository = repository; + } + +} diff --git a/org.argeo.app.servlet.odk/src/org/argeo/support/odk/servlet/OdkFormServlet.java b/org.argeo.app.servlet.odk/src/org/argeo/support/odk/servlet/OdkFormServlet.java new file mode 100644 index 0000000..9f84e52 --- /dev/null +++ b/org.argeo.app.servlet.odk/src/org/argeo/support/odk/servlet/OdkFormServlet.java @@ -0,0 +1,84 @@ +package org.argeo.support.odk.servlet; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.io.FilenameUtils; +import org.argeo.cms.auth.RemoteAuthUtils; +import org.argeo.cms.servlet.ServletHttpRequest; +import org.argeo.jcr.Jcr; +import org.argeo.support.odk.OdkForm; +import org.argeo.support.odk.OdkNames; + +/** Retrieves a single form. */ +public class OdkFormServlet extends HttpServlet { + private static final long serialVersionUID = 7838305967987687370L; + + private Repository repository; + private Map odkForms = Collections.synchronizedMap(new HashMap<>()); + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + resp.setContentType("text/xml; charset=utf-8"); + + Session session = RemoteAuthUtils.doAs(() -> Jcr.login(repository, null), new ServletHttpRequest(req)); + + String pathInfo = req.getPathInfo(); + if (pathInfo.startsWith("//")) + pathInfo = pathInfo.substring(1); + + boolean oldApproach = false; + try { + if (!oldApproach) { + String path = URLDecoder.decode(pathInfo, StandardCharsets.UTF_8); + session.exportDocumentView(path + "/" + OdkNames.H_HTML, resp.getOutputStream(), true, false); + } else { + + String fileName = FilenameUtils.getName(pathInfo); + OdkForm form = odkForms.get(fileName); + if (form == null) + throw new IllegalArgumentException("No form named " + fileName + " was found"); + + byte[] buffer = new byte[1024]; + try (InputStream in = form.openStream(); OutputStream out = resp.getOutputStream();) { + int bytesRead; + while ((bytesRead = in.read(buffer)) != -1) + out.write(buffer, 0, bytesRead); + } + } + } catch (RepositoryException e) { + e.printStackTrace(); + // TODO error message + resp.sendError(500); + } finally { + Jcr.logout(session); + } + } + + public void addForm(OdkForm odkForm) { + odkForms.put(odkForm.getFileName(), odkForm); + } + + public void removeForm(OdkForm odkForm) { + odkForms.remove(odkForm.getFileName()); + } + + public void setRepository(Repository repository) { + this.repository = repository; + } + +} diff --git a/org.argeo.app.servlet.odk/src/org/argeo/support/odk/servlet/OdkManifestServlet.java b/org.argeo.app.servlet.odk/src/org/argeo/support/odk/servlet/OdkManifestServlet.java new file mode 100644 index 0000000..63472fc --- /dev/null +++ b/org.argeo.app.servlet.odk/src/org/argeo/support/odk/servlet/OdkManifestServlet.java @@ -0,0 +1,190 @@ +package org.argeo.support.odk.servlet; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.Writer; +import java.nio.charset.Charset; +import java.security.DigestOutputStream; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.List; + +import javax.jcr.ItemNotFoundException; +import javax.jcr.Node; +import javax.jcr.NodeIterator; +import javax.jcr.Property; +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.Value; +import javax.jcr.nodetype.NodeType; +import javax.jcr.query.Query; +import javax.jcr.query.QueryResult; +import javax.jcr.query.Row; +import javax.jcr.query.RowIterator; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.io.output.NullOutputStream; +import org.argeo.cms.auth.RemoteAuthUtils; +import org.argeo.cms.servlet.ServletHttpRequest; +import org.argeo.entity.EntityMimeType; +import org.argeo.jcr.Jcr; +import org.argeo.jcr.JcrException; +import org.argeo.support.odk.OrxManifestName; +import org.argeo.util.CsvWriter; +import org.argeo.util.DigestUtils; + +/** Describe additional files. */ +public class OdkManifestServlet extends HttpServlet { + private static final long serialVersionUID = 138030510865877478L; + + private Repository repository; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + resp.setHeader("X-OpenRosa-Version", "1.0"); + resp.setDateHeader("Date", System.currentTimeMillis()); + + String pathInfo = req.getPathInfo(); + if (pathInfo.startsWith("//")) + pathInfo = pathInfo.substring(1); + + String serverName = req.getServerName(); + int serverPort = req.getServerPort(); + String protocol = serverPort == 443 || req.isSecure() ? "https" : "http"; + + Session session = RemoteAuthUtils.doAs(() -> Jcr.login(repository, null), new ServletHttpRequest(req)); + + try { + Node node = session.getNode(pathInfo); + if (node.isNodeType(OrxManifestName.manifest.get())) { + resp.setContentType(EntityMimeType.XML.toHttpContentType()); + Writer writer = resp.getWriter(); + writer.append(""); + writer.append(""); + NodeIterator nit = node.getNodes(); + children: while (nit.hasNext()) { + Node file = nit.nextNode(); + if (file.isNodeType(OrxManifestName.mediaFile.get())) { + EntityMimeType mimeType = EntityMimeType + .find(file.getProperty(Property.JCR_MIMETYPE).getString()); + Charset charset = Charset.forName(file.getProperty(Property.JCR_ENCODING).getString()); + + if (file.isNodeType(NodeType.NT_ADDRESS)) { + Node target; + try { + target = file.getProperty(Property.JCR_ID).getNode(); + } catch (ItemNotFoundException e) { + // TODO remove old manifests + continue children; + } + writer.append(""); + writer.append(""); + // Work around bug in ODK Collect not supporting paths + // writer.append(target.getPath().substring(1) + ".xml"); + writer.append(target.getIdentifier() + "." + mimeType.getDefaultExtension()); + writer.append(""); + + MessageDigest messageDigest = MessageDigest.getInstance(DigestUtils.MD5); + // TODO cache a temp file ? + try (DigestOutputStream out = new DigestOutputStream(new NullOutputStream(), + messageDigest)) { + writeMediaFile(out, target, mimeType, charset); + writer.append(""); + writer.append("md5sum:" + DigestUtils.encodeHexString(out.getMessageDigest().digest())); + writer.append(""); + } + +// try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { +// session.exportDocumentView(target.getPath(), out, true, false); +// String fileCsum = DigestUtils.digest(DigestUtils.MD5, out.toByteArray()); +// writer.append(""); +// writer.append("md5sum:" + fileCsum); +// writer.append(""); +// } + writer.append("" + protocol + "://" + serverName + + (serverPort == 80 || serverPort == 443 ? "" : ":" + serverPort) + + "/api/odk/formManifest" + file.getPath() + ""); + } + writer.append(""); + } + } + + writer.append(""); + } else if (node.isNodeType(OrxManifestName.mediaFile.get())) { + EntityMimeType mimeType = EntityMimeType.find(node.getProperty(Property.JCR_MIMETYPE).getString()); + Charset charset = Charset.forName(node.getProperty(Property.JCR_ENCODING).getString()); + resp.setContentType(mimeType.toHttpContentType(charset)); + if (node.isNodeType(NodeType.NT_ADDRESS)) { + Node target = node.getProperty(Property.JCR_ID).getNode(); + + writeMediaFile(resp.getOutputStream(), target, mimeType, charset); +// try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { +// session.exportDocumentView(target.getPath(), out, true, false); +// System.out.println(new String(out.toByteArray(), StandardCharsets.UTF_8)); +// resp.getOutputStream().write(out.toByteArray()); +// } + } else { + throw new IllegalArgumentException("Unsupported node " + node); + } + } else { + throw new IllegalArgumentException("Unsupported node " + node); + } + } catch (RepositoryException e) { + throw new JcrException(e); + } catch (NoSuchAlgorithmException e) { + throw new ServletException(e); + } finally { + Jcr.logout(session); + } + + } + + protected void writeMediaFile(OutputStream out, Node target, EntityMimeType mimeType, Charset charset) + throws RepositoryException, IOException { + if (target.isNodeType(NodeType.NT_QUERY)) { + Query query = target.getSession().getWorkspace().getQueryManager().getQuery(target); + QueryResult queryResult = query.execute(); + String[] columnNames = queryResult.getColumnNames(); + if (EntityMimeType.XML.equals(mimeType)) { + } else if (EntityMimeType.CSV.equals(mimeType)) { + CsvWriter csvWriter = new CsvWriter(out, charset); + csvWriter.writeLine(columnNames); + RowIterator rit = queryResult.getRows(); + while (rit.hasNext()) { + Row row = rit.nextRow(); + Value[] values = row.getValues(); + List lst = new ArrayList<>(); + for (Value value : values) { + lst.add(value.getString()); + } + csvWriter.writeLine(lst); + } + } + } else { + if (EntityMimeType.XML.equals(mimeType)) { + target.getSession().exportDocumentView(target.getPath(), out, true, false); + } else if (EntityMimeType.CSV.equals(mimeType)) { + CsvWriter csvWriter = new CsvWriter(out, charset); + csvWriter.writeLine(new String[] { "name", "label" }); + NodeIterator children = target.getNodes(); + while (children.hasNext()) { + Node child = children.nextNode(); + String label = Jcr.getTitle(child); + csvWriter.writeLine(new String[] { child.getIdentifier(), label }); + } + } + + } + + } + + public void setRepository(Repository repository) { + this.repository = repository; + } + +} diff --git a/org.argeo.app.servlet.odk/src/org/argeo/support/odk/servlet/OdkServletContext.java b/org.argeo.app.servlet.odk/src/org/argeo/support/odk/servlet/OdkServletContext.java new file mode 100644 index 0000000..f06965d --- /dev/null +++ b/org.argeo.app.servlet.odk/src/org/argeo/support/odk/servlet/OdkServletContext.java @@ -0,0 +1,19 @@ +package org.argeo.support.odk.servlet; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.argeo.cms.servlet.PrivateWwwAuthServletContext; + +/** ODK specific authentication (with additional headers).*/ +public class OdkServletContext extends PrivateWwwAuthServletContext { + + @Override + protected void askForWwwAuth(HttpServletRequest request, HttpServletResponse response) { + super.askForWwwAuth(request, response); + response.setHeader("X-OpenRosa-Version", "1.0"); + response.setDateHeader("Date", System.currentTimeMillis()); + + } + +} diff --git a/org.argeo.app.servlet.odk/src/org/argeo/support/odk/servlet/OdkSubmissionServlet.java b/org.argeo.app.servlet.odk/src/org/argeo/support/odk/servlet/OdkSubmissionServlet.java new file mode 100644 index 0000000..9e0c800 --- /dev/null +++ b/org.argeo.app.servlet.odk/src/org/argeo/support/odk/servlet/OdkSubmissionServlet.java @@ -0,0 +1,131 @@ +package org.argeo.support.odk.servlet; + +import java.io.IOException; +import java.time.Instant; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; +import java.util.HashSet; +import java.util.Set; + +import javax.jcr.ImportUUIDBehavior; +import javax.jcr.Node; +import javax.jcr.Property; +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.nodetype.NodeType; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.Part; + +import org.argeo.api.cms.CmsSession; +import org.argeo.api.cms.CmsLog; +import org.argeo.cms.auth.RemoteAuthRequest; +import org.argeo.cms.auth.RemoteAuthUtils; +import org.argeo.cms.jcr.CmsJcrUtils; +import org.argeo.cms.servlet.ServletHttpRequest; +import org.argeo.jcr.Jcr; +import org.argeo.jcr.JcrUtils; +import org.argeo.suite.SuiteUtils; +import org.argeo.support.odk.OrxType; +import org.argeo.support.xforms.FormSubmissionListener; + +/** Receives a form submission. */ +public class OdkSubmissionServlet extends HttpServlet { + private static final long serialVersionUID = 7834401404691302385L; + private final static CmsLog log = CmsLog.getLog(OdkSubmissionServlet.class); + + private final static String XML_SUBMISSION_FILE = "xml_submission_file"; + + private DateTimeFormatter submissionNameFormatter = DateTimeFormatter.ofPattern("YYYY-MM-dd-HHmmssSSS") + .withZone(ZoneId.from(ZoneOffset.UTC)); + + private Repository repository; + + private Set submissionListeners = new HashSet<>(); + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + resp.setContentType("text/xml; charset=utf-8"); + resp.setHeader("X-OpenRosa-Version", "1.0"); + resp.setDateHeader("Date", System.currentTimeMillis()); + resp.setIntHeader("X-OpenRosa-Accept-Content-Length", 1024 * 1024); + + RemoteAuthRequest request = new ServletHttpRequest(req); + Session session = RemoteAuthUtils.doAs(() -> Jcr.login(repository, null), request); + + try { +// Node submissions = JcrUtils.mkdirs(session, +// "/" + EntityType.form.get() + "/" + EntityNames.SUBMISSIONS_BASE); + CmsSession cmsSession = RemoteAuthUtils.getCmsSession(request); + + ClassLoader currentContextCl = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(RemoteAuthUtils.class.getClassLoader()); + Session adminSession = null; + try { + // TODO centralise at a deeper level + adminSession = CmsJcrUtils.openDataAdminSession(repository, null); + SuiteUtils.getOrCreateCmsSessionNode(adminSession, cmsSession); + } finally { + Jcr.logout(adminSession); + Thread.currentThread().setContextClassLoader(currentContextCl); + } + + Node cmsSessionNode = SuiteUtils.getCmsSessionNode(session, cmsSession); + Node submission = cmsSessionNode.addNode(submissionNameFormatter.format(Instant.now()), + OrxType.submission.get()); + for (Part part : req.getParts()) { + if (log.isDebugEnabled()) + log.debug("Part: " + part.getName() + ", " + part.getContentType()); + + if (part.getName().equals(XML_SUBMISSION_FILE)) { + Node xml = submission.addNode(XML_SUBMISSION_FILE, NodeType.NT_UNSTRUCTURED); + session.importXML(xml.getPath(), part.getInputStream(), + ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING); + + } else { + Node fileNode = JcrUtils.copyStreamAsFile(submission, part.getName(), part.getInputStream()); + String contentType = part.getContentType(); + if (contentType != null) { + fileNode.addMixin(NodeType.MIX_MIMETYPE); + fileNode.setProperty(Property.JCR_MIMETYPE, contentType); + + } + if (part.getName().endsWith(".jpg") || part.getName().endsWith(".png")) { + // TODO meta data and thumbnails + } + } + } + session.save(); + for (FormSubmissionListener submissionListener : submissionListeners) { + submissionListener.formSubmissionReceived(submission); + } + } catch (RepositoryException e) { + e.printStackTrace(); + resp.setStatus(503); + return; + } finally { + Jcr.logout(session); + } + + resp.setStatus(201); + resp.getWriter().write("" + + "Form Received!" + ""); + + } + + public void setRepository(Repository repository) { + this.repository = repository; + } + + public synchronized void addSubmissionListener(FormSubmissionListener listener) { + submissionListeners.add(listener); + } + + public synchronized void removeSubmissionListener(FormSubmissionListener listener) { + submissionListeners.remove(listener); + } +} diff --git a/org.argeo.app.servlet.publish/.classpath b/org.argeo.app.servlet.publish/.classpath new file mode 100644 index 0000000..e801ebf --- /dev/null +++ b/org.argeo.app.servlet.publish/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/org.argeo.app.servlet.publish/.gitignore b/org.argeo.app.servlet.publish/.gitignore new file mode 100644 index 0000000..09e3bc9 --- /dev/null +++ b/org.argeo.app.servlet.publish/.gitignore @@ -0,0 +1,2 @@ +/bin/ +/target/ diff --git a/org.argeo.app.servlet.publish/.project b/org.argeo.app.servlet.publish/.project new file mode 100644 index 0000000..c080630 --- /dev/null +++ b/org.argeo.app.servlet.publish/.project @@ -0,0 +1,33 @@ + + + org.argeo.app.servlet.publish + + + + + + 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.app.servlet.publish/META-INF/.gitignore b/org.argeo.app.servlet.publish/META-INF/.gitignore new file mode 100644 index 0000000..4854a41 --- /dev/null +++ b/org.argeo.app.servlet.publish/META-INF/.gitignore @@ -0,0 +1 @@ +/MANIFEST.MF diff --git a/org.argeo.app.servlet.publish/OSGI-INF/dbk4Converter.xml b/org.argeo.app.servlet.publish/OSGI-INF/dbk4Converter.xml new file mode 100644 index 0000000..66526d9 --- /dev/null +++ b/org.argeo.app.servlet.publish/OSGI-INF/dbk4Converter.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/org.argeo.app.servlet.publish/OSGI-INF/dbkServlet.xml b/org.argeo.app.servlet.publish/OSGI-INF/dbkServlet.xml new file mode 100644 index 0000000..05522d5 --- /dev/null +++ b/org.argeo.app.servlet.publish/OSGI-INF/dbkServlet.xml @@ -0,0 +1,11 @@ + + + + + + + + "/> + + + diff --git a/org.argeo.app.servlet.publish/OSGI-INF/documentUiProvider.xml b/org.argeo.app.servlet.publish/OSGI-INF/documentUiProvider.xml new file mode 100644 index 0000000..5cee79f --- /dev/null +++ b/org.argeo.app.servlet.publish/OSGI-INF/documentUiProvider.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/org.argeo.app.servlet.publish/OSGI-INF/fontsServlet.xml b/org.argeo.app.servlet.publish/OSGI-INF/fontsServlet.xml new file mode 100644 index 0000000..6ca1c41 --- /dev/null +++ b/org.argeo.app.servlet.publish/OSGI-INF/fontsServlet.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/org.argeo.app.servlet.publish/OSGI-INF/htmlServletContext.xml b/org.argeo.app.servlet.publish/OSGI-INF/htmlServletContext.xml new file mode 100644 index 0000000..e0c1f6b --- /dev/null +++ b/org.argeo.app.servlet.publish/OSGI-INF/htmlServletContext.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/org.argeo.app.servlet.publish/OSGI-INF/l10n/bundle.properties b/org.argeo.app.servlet.publish/OSGI-INF/l10n/bundle.properties new file mode 100644 index 0000000..302f555 --- /dev/null +++ b/org.argeo.app.servlet.publish/OSGI-INF/l10n/bundle.properties @@ -0,0 +1,12 @@ +paragraph=paragraph +section=section +media=media +style=style + +insertParagraph=insert paragraph +deleteParagraph=delete paragraph +deleteSection=delete section + +insertPicture=insert picture +insertVideo=insert video +deleteMedia=delete media \ No newline at end of file diff --git a/org.argeo.app.servlet.publish/OSGI-INF/wwwLayer.xml b/org.argeo.app.servlet.publish/OSGI-INF/wwwLayer.xml new file mode 100644 index 0000000..497d652 --- /dev/null +++ b/org.argeo.app.servlet.publish/OSGI-INF/wwwLayer.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/org.argeo.app.servlet.publish/bnd.bnd b/org.argeo.app.servlet.publish/bnd.bnd new file mode 100644 index 0000000..463e24b --- /dev/null +++ b/org.argeo.app.servlet.publish/bnd.bnd @@ -0,0 +1,23 @@ +Import-Package:\ +org.osgi.service.http.context,\ +javax.jcr.nodetype,\ +org.osgi.service.event,\ +org.argeo.suite.ui,\ +org.eclipse.swt,\ +org.eclipse.jface.viewers,\ +org.osgi.framework,\ +org.apache.xml.serializer,\ +org.eclipse.rap.rwt,\ +org.argeo.entity,\ +* + +Provide-Capability:\ +cms.datamodel; name=docbook; cnd=/org/argeo/docbook/docbook.cnd; abstract=true + +Service-Component:\ +OSGI-INF/fontsServlet.xml,\ +OSGI-INF/htmlServletContext.xml,\ +OSGI-INF/dbkServlet.xml,\ +OSGI-INF/documentUiProvider.xml,\ +OSGI-INF/wwwLayer.xml,\ +OSGI-INF/dbk4Converter.xml diff --git a/org.argeo.app.servlet.publish/build.properties b/org.argeo.app.servlet.publish/build.properties new file mode 100644 index 0000000..e97efd7 --- /dev/null +++ b/org.argeo.app.servlet.publish/build.properties @@ -0,0 +1,7 @@ +output.. = bin/ +bin.includes = META-INF/,\ + .,\ + OSGI-INF/,\ + OSGI-INF/documentUiProvider.xml,\ + OSGI-INF/dbk4Converter.xml +source.. = src/ diff --git a/org.argeo.app.servlet.publish/config/documentUiProvider.properties b/org.argeo.app.servlet.publish/config/documentUiProvider.properties new file mode 100644 index 0000000..855735d --- /dev/null +++ b/org.argeo.app.servlet.publish/config/documentUiProvider.properties @@ -0,0 +1,3 @@ +service.pid=argeo.publishing.ui.documentUiProvider + +entity.type=entity:document,nt:file \ No newline at end of file diff --git a/org.argeo.app.servlet.publish/config/wwwLayer.properties b/org.argeo.app.servlet.publish/config/wwwLayer.properties new file mode 100644 index 0000000..d29fa5b --- /dev/null +++ b/org.argeo.app.servlet.publish/config/wwwLayer.properties @@ -0,0 +1,4 @@ +service.pid=argeo.publishing.ui.wwwLayer + +title=Web +icon=map \ No newline at end of file diff --git a/org.argeo.app.servlet.publish/pom.xml b/org.argeo.app.servlet.publish/pom.xml new file mode 100644 index 0000000..cbd91c1 --- /dev/null +++ b/org.argeo.app.servlet.publish/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + + org.argeo.suite + argeo-suite + 2.3-SNAPSHOT + .. + + org.argeo.app.servlet.publish + Publishing Servlets + jar + + + org.argeo.suite + org.argeo.app.core + 2.3-SNAPSHOT + + + + + org.argeo.commons + org.argeo.cms.servlet + ${version.argeo-commons} + + + diff --git a/org.argeo.app.servlet.publish/src/org/argeo/publishing/servlet/DbkServlet.java b/org.argeo.app.servlet.publish/src/org/argeo/publishing/servlet/DbkServlet.java new file mode 100644 index 0000000..26a0fed --- /dev/null +++ b/org.argeo.app.servlet.publish/src/org/argeo/publishing/servlet/DbkServlet.java @@ -0,0 +1,226 @@ +package org.argeo.publishing.servlet; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import javax.jcr.Node; +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.nodetype.NodeType; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.Result; +import javax.xml.transform.Source; +import javax.xml.transform.Templates; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; + +import org.apache.commons.io.IOUtils; +import org.apache.xalan.processor.TransformerFactoryImpl; +import org.argeo.api.cms.CmsTheme; +import org.argeo.cms.auth.RemoteAuthUtils; +import org.argeo.cms.servlet.ServletHttpRequest; +import org.argeo.docbook.DbkType; +import org.argeo.docbook.DbkUtils; +import org.argeo.jcr.Jcr; +import org.argeo.jcr.JcrException; +import org.argeo.jcr.JcrUtils; +import org.w3c.dom.Document; + +/** + * A servlet transforming a dbk:* JCR node into HTML, using the DocBook XSL. + */ +public class DbkServlet extends HttpServlet { + private static final long serialVersionUID = 6906020513498289335L; + + private Repository repository; + + private DocumentBuilderFactory documentBuilderFactory; + private TransformerFactory transformerFactory; + private Templates docBoookTemplates; + + private Map themes = Collections.synchronizedMap(new HashMap<>()); + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + + String pathInfo = req.getPathInfo(); + if (pathInfo.startsWith("//")) + pathInfo = pathInfo.substring(1); + String path = URLDecoder.decode(pathInfo, StandardCharsets.UTF_8); + + if (path.toLowerCase().endsWith(".css")) { + path = path.substring(1); + int firstSlash = path.indexOf('/'); + String themeId = path.substring(0, firstSlash); + String cssPath = path.substring(firstSlash); + CmsTheme cmsTheme = themes.get(themeId); + if (cmsTheme == null) + throw new IllegalArgumentException("Theme " + themeId + " not found."); + resp.setContentType("text/css"); + IOUtils.copy(cmsTheme.getResourceAsStream(cssPath), resp.getOutputStream()); + return; + } + + if (path.toLowerCase().endsWith("/index.html")) { + path = path.substring(0, path.length() - "/index.html".length()); + } + + Session session = null; + try { + session = RemoteAuthUtils.doAs(() -> Jcr.login(repository, null), new ServletHttpRequest(req)); + Node node = session.getNode(path); + + if (node.hasNode(DbkType.article.get())) { + Node dbkNode = node.getNode(DbkType.article.get()); + if (DbkUtils.isDbk(dbkNode)) { + CmsTheme cmsTheme = null; + String themeId = req.getParameter("themeId"); + if (themeId != null) { + cmsTheme = themes.get(themeId); + if (cmsTheme == null) + throw new IllegalArgumentException("Theme " + themeId + " not found."); + } + + // TODO customise DocBook so that it outputs UTF-8 + // see http://www.sagehill.net/docbookxsl/OutputEncoding.html + resp.setContentType("text/html; charset=ISO-8859-1"); + + // TODO optimise with pipes, SAX, etc. ? + byte[] arr; + try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { + session.exportDocumentView(dbkNode.getPath(), out, true, false); + arr = out.toByteArray(); +// System.out.println(new String(arr, StandardCharsets.UTF_8)); + } catch (RepositoryException e) { + throw new JcrException(e); + } + + try (InputStream in = new ByteArrayInputStream(arr); +// ByteArrayOutputStream out = new ByteArrayOutputStream(); + ) { + + Result xmlOutput = new StreamResult(resp.getOutputStream()); + + DocumentBuilder docBuilder = documentBuilderFactory.newDocumentBuilder(); +// Document doc = docBuilder.parse(new File( +// System.getProperty("user.home") + "/dev/git/gpl/argeo-qa/doc/platform/argeo-platform.dbk.xml")); + Document doc = docBuilder.parse(in); + Source xmlInput = new DOMSource(doc); + + Transformer transformer = docBoookTemplates.newTransformer(); + + // gather CSS + if (cmsTheme != null) { + StringBuilder sb = new StringBuilder(); + for (String cssPath : cmsTheme.getWebCssPaths()) { + sb.append(req.getContextPath()).append(req.getServletPath()).append('/'); + sb.append(themeId).append('/').append(cssPath).append(' '); + } + // FIXME make it more generic + sb.append("https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap") + .append(' '); + sb.append( + "https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,300;0,400;0,600;1,400&display=swap") + .append(' '); + if (sb.length() > 0) + transformer.setParameter("html.stylesheet", sb.toString()); + } + transformer.transform(xmlInput, xmlOutput); +// resp.getOutputStream().write(out.toByteArray()); + } catch (Exception e) { + throw new ServletException("Cannot transform " + path, e); + } + } + } else { + if (node.isNodeType(NodeType.NT_FILE)) {// media download etc. + String fileNameLowerCase = node.getName().toLowerCase(); + if (fileNameLowerCase.endsWith(".jpg") || fileNameLowerCase.endsWith(".jpeg")) { + resp.setContentType("image/jpeg"); + } else if (fileNameLowerCase.endsWith(".png")) { + resp.setContentType("image/png"); + } else if (fileNameLowerCase.endsWith(".gif")) { + resp.setContentType("image/gif"); + } else if (fileNameLowerCase.endsWith(".svg")) { + resp.setContentType("image/svg+xml"); + } else { + // TODO know more content types... + resp.setHeader("Content-Disposition", "attachment; filename=\"" + node.getName() + "\""); + } + IOUtils.copy(JcrUtils.getFileAsStream(node), resp.getOutputStream()); + } else { + throw new IllegalArgumentException("Unsupported node " + node); + } + } + } catch (RepositoryException e1) { + throw new JcrException(e1); + } finally { + Jcr.logout(session); + } + } + + @Override + public void init() throws ServletException { + + // TODO improve configuration and provisioning of DocBook XSL + String xslBase = System.getProperty("argeo.docbook.xsl"); + if (xslBase == null) { + String defaultXslBase = "/opt/docbook-xsl"; + if (!Files.exists(Paths.get(defaultXslBase))) { + throw new ServletException("System property argeo.docbook.xsl is not set and default location " + + defaultXslBase + " does not exist."); + } else { + xslBase = defaultXslBase; + } + } + String xsl = xslBase + "/html/docbook.xsl"; + + documentBuilderFactory = DocumentBuilderFactory.newInstance(); + documentBuilderFactory.setXIncludeAware(true); + documentBuilderFactory.setNamespaceAware(true); + + // We must explicitly use the non-XSLTC transformer, as XSLTC is not working + // with DocBook stylesheets + transformerFactory = new TransformerFactoryImpl(); + + Source xslSource = new StreamSource(xsl); + try { + docBoookTemplates = transformerFactory.newTemplates(xslSource); + if (docBoookTemplates == null) + throw new ServletException("Could not instantiate XSL " + xsl); + } catch (TransformerConfigurationException e) { + throw new ServletException("Cannot instantiate XSL " + xsl, e); + } + } + + public void setRepository(Repository repository) { + this.repository = repository; + } + + public void addTheme(CmsTheme theme, Map properties) { + themes.put(theme.getThemeId(), theme); + } + + public void removeTheme(CmsTheme theme, Map properties) { + themes.remove(theme.getThemeId()); + } + +} diff --git a/org.argeo.app.servlet.publish/src/org/argeo/publishing/servlet/FontsServlet.java b/org.argeo.app.servlet.publish/src/org/argeo/publishing/servlet/FontsServlet.java new file mode 100644 index 0000000..aa116f5 --- /dev/null +++ b/org.argeo.app.servlet.publish/src/org/argeo/publishing/servlet/FontsServlet.java @@ -0,0 +1,51 @@ +package org.argeo.publishing.servlet; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.io.IOUtils; +import org.argeo.api.cms.CmsTheme; + +/** Serves fonts locally. */ +public class FontsServlet extends HttpServlet { + private static final long serialVersionUID = 6009572962850708537L; + private Map themes = Collections.synchronizedMap(new HashMap<>()); + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String font = req.getPathInfo(); + font = font.substring(1, font.length()); + for (CmsTheme theme : themes.values()) { + for (String fontPath : theme.getFontsPaths()) { + if (fontPath.endsWith(font)) { + if (font.endsWith(".woff")) + resp.setContentType("font/woff"); + else if (font.endsWith(".woff2")) + resp.setContentType("font/woff2"); + try (InputStream in = theme.loadPath(fontPath)) { + IOUtils.copy(in, resp.getOutputStream()); + return; + } + } + } + } + resp.setStatus(404); + } + + public void addTheme(CmsTheme theme, Map properties) { + themes.put(theme.getThemeId(), theme); + } + + public void removeTheme(CmsTheme theme, Map properties) { + themes.remove(theme.getThemeId()); + } + +} diff --git a/org.argeo.app.theme.default/.gitignore b/org.argeo.app.theme.default/.gitignore new file mode 100644 index 0000000..09e3bc9 --- /dev/null +++ b/org.argeo.app.theme.default/.gitignore @@ -0,0 +1,2 @@ +/bin/ +/target/ diff --git a/org.argeo.app.theme.default/.project b/org.argeo.app.theme.default/.project new file mode 100644 index 0000000..1a71c08 --- /dev/null +++ b/org.argeo.app.theme.default/.project @@ -0,0 +1,27 @@ + + + org.argeo.app.theme.default + + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + org.eclipse.pde.ds.core.builder + + + + + + org.eclipse.pde.PluginNature + + diff --git a/org.argeo.app.theme.default/META-INF/.gitignore b/org.argeo.app.theme.default/META-INF/.gitignore new file mode 100644 index 0000000..4854a41 --- /dev/null +++ b/org.argeo.app.theme.default/META-INF/.gitignore @@ -0,0 +1 @@ +/MANIFEST.MF diff --git a/org.argeo.app.theme.default/OSGI-INF/cmsTheme.xml b/org.argeo.app.theme.default/OSGI-INF/cmsTheme.xml new file mode 100644 index 0000000..06df08e --- /dev/null +++ b/org.argeo.app.theme.default/OSGI-INF/cmsTheme.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/org.argeo.app.theme.default/bnd.bnd b/org.argeo.app.theme.default/bnd.bnd new file mode 100644 index 0000000..21883fd --- /dev/null +++ b/org.argeo.app.theme.default/bnd.bnd @@ -0,0 +1,6 @@ +Service-Component:\ +OSGI-INF/cmsTheme.xml + +Import-Package:\ +org.argeo.cms.swt.osgi,\ +* \ No newline at end of file diff --git a/org.argeo.app.theme.default/build.properties b/org.argeo.app.theme.default/build.properties new file mode 100644 index 0000000..7f8c707 --- /dev/null +++ b/org.argeo.app.theme.default/build.properties @@ -0,0 +1,2 @@ +bin.includes = META-INF/,\ + OSGI-INF/ diff --git a/org.argeo.app.theme.default/pom.xml b/org.argeo.app.theme.default/pom.xml new file mode 100644 index 0000000..e5afc6e --- /dev/null +++ b/org.argeo.app.theme.default/pom.xml @@ -0,0 +1,15 @@ + + + 4.0.0 + + org.argeo.suite + argeo-suite + 2.3-SNAPSHOT + .. + + org.argeo.app.theme.default + Suite Default Theme + jar + + + diff --git a/org.argeo.app.theme.default/rap/work.css b/org.argeo.app.theme.default/rap/work.css new file mode 100644 index 0000000..c0aaeb1 --- /dev/null +++ b/org.argeo.app.theme.default/rap/work.css @@ -0,0 +1,181 @@ +.argeo-suite-header { + color: white; + background-color: #00294b; +} + +.argeo-suite-headerTitle { + font: bold 18px sans-serif; + color: white; + background-color: #00294b; +} + +.argeo-suite-leadPane { + background-color: #eee; +} + +Label.argeo-suite-leadPane { + font: 14px sans-serif; + color: #888; + background-color: #eee; +} + +Button.argeo-suite-leadPane:hover { + cursor:pointer; +} + +.argeo-suite-recentItems { + font: bold 14px sans-serif; + color: white; + background-color: #00294b; + padding: 8px 16px; +} + +.argeo-suite-titleContainer { + background-color: #00294b; + padding: 6px 8px 4px 8px; +} + +.argeo-suite-titleLabel { + font: bold 14px sans-serif; + color: white; + background-color: #00294b; +} + +.argeo-suite-subTitleLabel { + font: italic 14px sans-serif; + color: #777; + padding: 4px 8px; +} + +.argeo-suite-simpleLabel { + font: bold 14px sans-serif; + padding: 0px; +} + +.argeo-suite-simpleText { + font: 14px sans-serif; + padding: 0px; +} + +.argeo-suite-titleCell { + font: bold 14px sans-serif; + background-color: #ddd; +} + +.argeo-suite-inlineButton { + padding: 0px 4px; + font: 12px sans-serif; + border: 1px solid white; + color: white; + background-image: none; + background-color: #00294b; +} + +.argeo-suite-inlineButton:hover { + color: #00294b; + background-color: white; +} + +Composite.argeo-suite-mainTabBody { + background-color: #eee; + border: 1px solid #bbb; +} + +.argeo-suite-mainTab { + background-color: #eee; + border: 1px solid #888; +} + +ToolItem.argeo-suite-mainTab { + border: none; + background-color: #eee; +} + +ToolItem.argeo-suite-mainTab:hover { + background-color: #eee; +} + + +Button.argeo-suite-mainTab { + border: 1px solid #eee; + background-color: #eee; +} + +.argeo-suite-mainTab:hover { + background-color: #eee; +} + +Button.argeo-suite-mainTab:hover { + cursor: pointer; + background-color: #eee; +} + +.argeo-suite-mainTabSelected { + font: bold 14px sans-serif; + color: white; + /*background-color: #00294b;*/ + background-color: #5882b5; + border:1px solid #888; +} + +ToolItem.argeo-suite-mainTabSelected { + border: none; +} + +ToolItem.argeo-suite-mainTabSelected:hover { + background-color: #5882b5; +} + +Button.argeo-suite-mainTabSelected { + border: none; +} + +Sash { + border: 1px solid white; + background-image: none; + background-color: white; +} + +Sash:hover { + border: 1px solid #5882b5; + background-color: #5882b5; +} + +TreeItem{ + background-color:#fff; +} + +Tree-RowOverlay:selected { + color:#fff; + background-color:#5882b5; +} + +TableItem{ + background-color:#fff; +} + +Table-RowOverlay:selected { + color:#fff; + background-color:#5882b5; +} + +.argeo-suite-navigationBar{ + background-color:#ddd; +} + +.argeo-suite-navigationTitle{ + background-color:#ddd; + font:bold 14px sans-serif; +} + +.argeo-suite-navigationButton{ + color:#777; + background-color:#ddd; + font:bold 14px sans-serif; +} + +.argeo-suite-navigationButton:hover{ + cursor:pointer; + color:#ddd; + background-color:#777; +} diff --git a/org.argeo.app.theme.default/swt/app.css b/org.argeo.app.theme.default/swt/app.css new file mode 100644 index 0000000..4ac745d --- /dev/null +++ b/org.argeo.app.theme.default/swt/app.css @@ -0,0 +1,129 @@ +.argeo-suite-header { + color: white; + background-color: #00294b; +} + +.argeo-suite-headerTitle { + font: bold 14px sans-serif; + color: white; + background-color: #00294b; +} + +.argeo-suite-leadPane { + background-color: #eee; +} + +Label.argeo-suite-leadPane { + font: 11px sans-serif; + color: #888; + background-color: #eee; +} + +Button.argeo-suite-leadPane:hover { + cursor: pointer; +} + +.argeo-suite-recentItems { + font: bold 13px sans-serif; + color: white; + background-color: #00294b; + padding: 8px 16px; +} + +.argeo-suite-titleContainer { + background-color: #00294b; +} + +.argeo-suite-titleLabel { + font: bold 13px sans-serif; + margin: 6px 8px 4px 8px; + color: white; + background-color: #00294b; +} + +.argeo-suite-subTitleLabel { + font: italic 14px sans-serif; + color: #777; + margin: 4px 8px; +} + +.argeo-suite-formLine { + padding: 4px 8px 4px 16px; +} + +.argeo-suite-simpleLabel { + font: normal 11px sans-serif; + border: 8px solid #eee; +} + +.argeo-suite-simpleText { + +} + +.argeo-suite-simpleInput { + padding: 4px 8px 4px 8px; +} + +.argeo-suite-titleCell { + font: bold 11px sans-serif; + background-color: #ddd; +} + +.argeo-suite-inlineButton { + padding: 0px 4px; + font: 12px sans-serif; + border: 1px solid white; + color: white; + background-image: none; + background-color: #00294b; +} + +.argeo-suite-inlineButton:hover { + color: #00294b; + background-color: white; +} + +Composite.argeo-suite-mainTabBody { + background-color: #eee; + border: 1px solid #bbb; +} + +.argeo-suite-mainTab { + background-color: #eee; + border: 1px solid #bbb; +} + +ToolItem.argeo-suite-mainTab { + border: none; + background-color: #eee; +} + +Button.argeo-suite-mainTab { + border: none; + background-color: #eee; +} + +.argeo-suite-mainTab:hover { + background-color: #eee; +} + +Button.argeo-suite-mainTab:hover { + cursor: pointer; + background-color: #eee; +} + +.argeo-suite-mainTabSelected { + font: bold 14px sans-serif; + color: white; + /*background-color: #00294b;*/ + background-color: #5882b5; + border: 1px solid #00294b; +} + +ToolItem.argeo-suite-mainTabSelected { + border: none; +} + +Button.argeo-suite-mainTabSelected { + border: none; +} \ No newline at end of file diff --git a/org.argeo.app.ui.rap/.gitignore b/org.argeo.app.ui.rap/.gitignore new file mode 100644 index 0000000..09e3bc9 --- /dev/null +++ b/org.argeo.app.ui.rap/.gitignore @@ -0,0 +1,2 @@ +/bin/ +/target/ diff --git a/org.argeo.app.ui.rap/.project b/org.argeo.app.ui.rap/.project new file mode 100644 index 0000000..51bc8dd --- /dev/null +++ b/org.argeo.app.ui.rap/.project @@ -0,0 +1,27 @@ + + + org.argeo.app.ui.rap + + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + org.eclipse.pde.ds.core.builder + + + + + + org.eclipse.pde.PluginNature + + diff --git a/org.argeo.app.ui.rap/META-INF/.gitignore b/org.argeo.app.ui.rap/META-INF/.gitignore new file mode 100644 index 0000000..4854a41 --- /dev/null +++ b/org.argeo.app.ui.rap/META-INF/.gitignore @@ -0,0 +1 @@ +/MANIFEST.MF diff --git a/org.argeo.app.ui.rap/OSGI-INF/cmsWebApp.xml b/org.argeo.app.ui.rap/OSGI-INF/cmsWebApp.xml new file mode 100644 index 0000000..4f807c1 --- /dev/null +++ b/org.argeo.app.ui.rap/OSGI-INF/cmsWebApp.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/org.argeo.app.ui.rap/bnd.bnd b/org.argeo.app.ui.rap/bnd.bnd new file mode 100644 index 0000000..140b5e0 --- /dev/null +++ b/org.argeo.app.ui.rap/bnd.bnd @@ -0,0 +1,6 @@ +Service-Component: OSGI-INF/cmsWebApp.xml + +Import-Package:\ +org.argeo.cms.web;resolution:=optional,\ +org.eclipse.rap.rwt.application;resolution:=optional,\ +*;resolution:=optional diff --git a/org.argeo.app.ui.rap/build.properties b/org.argeo.app.ui.rap/build.properties new file mode 100644 index 0000000..6210e84 --- /dev/null +++ b/org.argeo.app.ui.rap/build.properties @@ -0,0 +1,5 @@ +output.. = bin/ +bin.includes = META-INF/,\ + .,\ + OSGI-INF/ +source.. = src/ diff --git a/org.argeo.app.ui.rap/pom.xml b/org.argeo.app.ui.rap/pom.xml new file mode 100644 index 0000000..71b11cc --- /dev/null +++ b/org.argeo.app.ui.rap/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + + org.argeo.suite + argeo-suite + 2.3-SNAPSHOT + .. + + org.argeo.app.ui.rap + Suite UI RAP + jar + + + org.argeo.suite + org.argeo.app.ui + 2.3-SNAPSHOT + + + + + org.argeo.tp + argeo-tp-rap-e4 + ${version.argeo-tp} + pom + provided + + + diff --git a/org.argeo.app.ui/.classpath b/org.argeo.app.ui/.classpath new file mode 100644 index 0000000..e801ebf --- /dev/null +++ b/org.argeo.app.ui/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/org.argeo.app.ui/.gitignore b/org.argeo.app.ui/.gitignore new file mode 100644 index 0000000..09e3bc9 --- /dev/null +++ b/org.argeo.app.ui/.gitignore @@ -0,0 +1,2 @@ +/bin/ +/target/ diff --git a/org.argeo.app.ui/.project b/org.argeo.app.ui/.project new file mode 100644 index 0000000..a7893bd --- /dev/null +++ b/org.argeo.app.ui/.project @@ -0,0 +1,33 @@ + + + org.argeo.app.ui + + + + + + 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.app.ui/META-INF/.gitignore b/org.argeo.app.ui/META-INF/.gitignore new file mode 100644 index 0000000..4854a41 --- /dev/null +++ b/org.argeo.app.ui/META-INF/.gitignore @@ -0,0 +1 @@ +/MANIFEST.MF diff --git a/org.argeo.app.ui/OSGI-INF/adminLeadPane.xml b/org.argeo.app.ui/OSGI-INF/adminLeadPane.xml new file mode 100644 index 0000000..0d060fb --- /dev/null +++ b/org.argeo.app.ui/OSGI-INF/adminLeadPane.xml @@ -0,0 +1,11 @@ + + + + + + + + argeo.suite.ui.termsLayer + + + diff --git a/org.argeo.app.ui/OSGI-INF/cmsApp.xml b/org.argeo.app.ui/OSGI-INF/cmsApp.xml new file mode 100644 index 0000000..bfb372a --- /dev/null +++ b/org.argeo.app.ui/OSGI-INF/cmsApp.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/org.argeo.app.ui/OSGI-INF/dashboard.xml b/org.argeo.app.ui/OSGI-INF/dashboard.xml new file mode 100644 index 0000000..f678b5b --- /dev/null +++ b/org.argeo.app.ui/OSGI-INF/dashboard.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/org.argeo.app.ui/OSGI-INF/dashboardLayer.xml b/org.argeo.app.ui/OSGI-INF/dashboardLayer.xml new file mode 100644 index 0000000..b60eafc --- /dev/null +++ b/org.argeo.app.ui/OSGI-INF/dashboardLayer.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/org.argeo.app.ui/OSGI-INF/eventRecorder.xml b/org.argeo.app.ui/OSGI-INF/eventRecorder.xml new file mode 100644 index 0000000..49badfd --- /dev/null +++ b/org.argeo.app.ui/OSGI-INF/eventRecorder.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/org.argeo.app.ui/OSGI-INF/footer.xml b/org.argeo.app.ui/OSGI-INF/footer.xml new file mode 100644 index 0000000..3499b4f --- /dev/null +++ b/org.argeo.app.ui/OSGI-INF/footer.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/org.argeo.app.ui/OSGI-INF/header.xml b/org.argeo.app.ui/OSGI-INF/header.xml new file mode 100644 index 0000000..526d9f9 --- /dev/null +++ b/org.argeo.app.ui/OSGI-INF/header.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/org.argeo.app.ui/OSGI-INF/l10n/bundle.properties b/org.argeo.app.ui/OSGI-INF/l10n/bundle.properties new file mode 100644 index 0000000..5716780 --- /dev/null +++ b/org.argeo.app.ui/OSGI-INF/l10n/bundle.properties @@ -0,0 +1,98 @@ +dashboard=dashboard +#people=contacts +documents=documents +locations=locations +recentItems=recent items + +appTitle=Argeo Suite + +# +# PEOPLE +# org.argeo.people.ui.PeopleMsg +# +person=Person +organisation=Organisation + +# NewPersonWizard +firstName=First Name +lastName=Last Name +salutation=Salutation +email=Email +personWizardWindowTitle=New person +personWizardPageTitle=Create a contact + +# NewOrgWizard +legalName=Legal name +legalForm=Legal form +vatId=VAT ID +orgWizardWindowTitle=New organisation +orgWizardPageTitle=Create an organisation + + +# ContextAddressComposite +chooseAnOrganisation=Choose an organisation +street=Street +streetComplement=Street complement +zipCode=Zip code +city=City +state=State +country=Country +geopoint=Geopoint + +# FilteredOrderableEntityTable +filterHelp=Type filter criterion separated by a space + +# BankAccountComposite +accountHolder=Account holder +bankName=Bank name +currency=Currency +accountNumber=Account number +bankNumber=Bank number +BIC=BIC +IBAN=IBAN + +# EditJobDialog +position=Role +chosenItem=Chose item +department=Department +isPrimary=Is primary +searchAndChooseEntity=Search and choose a corresponding entity + +# ContactListCTab (e4) +notes=Notes +addAContact=Add a contact +contactValue=Contact value +linkedCompany=Linked company + +# OrgAdminInfoCTab (e4) +paymentAccount=Payment account + +# OrgEditor (e4) +orgDetails=Details +orgActivityLog=Activity log +team=Team +orgAdmin=Admin. + +# PersonEditor (e4) +personDetails=Contact details +personActivityLog=Activity log +personOrgs=Organisations +personSecurity=Security + +# PersonSecurityCTab (e4) +resetPassword=Reset password + +# Generic +label=Label +aCustomLabel=A custom label +description=Description +value=Value +name=Name +primary=Primary +add=Add +save=Save +pickUp=Pick up + +# Tags +confirmNewTag=Tag #{0} is not yet registered. Are you sure you want to create it? +cannotCreateTag=Tag #{0} is not yet registered and you don't have enough rights to create it. diff --git a/org.argeo.app.ui/OSGI-INF/l10n/bundle_de.properties b/org.argeo.app.ui/OSGI-INF/l10n/bundle_de.properties new file mode 100644 index 0000000..0af19c2 --- /dev/null +++ b/org.argeo.app.ui/OSGI-INF/l10n/bundle_de.properties @@ -0,0 +1,98 @@ +dashboard=dashboard +people=Kontakte +documents=Dokumente +locations=Orte +recentItems=neulich + +appTitle=Argeo Suite + +# +# PEOPLE +# org.argeo.people.ui.PeopleMsg +# +person=Person +organisation=Organisation + +# NewPersonWizard +firstName=Vorname +lastName=Nachname +salutation=Salutation +email=E-Mail +personWizardWindowTitle=Neue Person +personWizardPageTitle=Kontakt erstellen + +# NewOrgWizard +legalName=Name +legalForm=Geschäftsform +vatId=Ust ID +orgWizardWindowTitle=Neue Organisation +orgWizardPageTitle=Organisation erstellen + + +# ContextAddressComposite +chooseAnOrganisation=Organisation wählen +street=Strasse +streetComplement=Strasse Zusatz +zipCode=PLZ +city=Stadt +state=Bundesland +country=Land +geopoint=Geopoint + +# FilteredOrderableEntityTable +filterHelp=Type filter criterion separated by a space + +# BankAccountComposite +accountHolder=Kontoinhaber +bankName=Name der Bank +currency=Währung +accountNumber=Kontonummer +bankNumber=BLZ +BIC=BIC +IBAN=IBAN + +# EditJobDialog +position=Rolle +chosenItem=Auswahl +department=Abteilung +isPrimary=Ist Primär +searchAndChooseEntity=Suche und wähle ein zugehöriges Objekt + +# ContactListCTab (e4) +notes=Bemerkungen +addAContact=Kontakt hinzufügen +contactValue=Kontakt value +linkedCompany=zugehörige Firma + +# OrgAdminInfoCTab (e4) +paymentAccount=Geschäftskonto + +# OrgEditor (e4) +orgDetails=Details +orgActivityLog=Aktivitäten Log +team=Team +orgAdmin=Admin. + +# PersonEditor (e4) +personDetails=Kontakt Daten +personActivityLog=Aktivitäten Log +personOrgs=Organisationen +personSecurity=Sicherheit + +# PersonSecurityCTab (e4) +resetPassword=Passwort zurücksetzen + +# Generic +label=Beschriftung +aCustomLabel=Eine spezifische Beschriftung +description=Beschreibung +value=Wert +name=Name +primary=Haupt- +add=Hinzufügen +save=Speichern +pickUp=Aussuchen + +# Tags +confirmNewTag=Das Hashtag '{0}' existiert noch nicht. WollenSie es hinzufügen? +cannotCreateTag=Das Hashtag '{0}' existiert nicht uns Sie haben nicht die Rechte, um es hinzufügen. diff --git a/org.argeo.app.ui/OSGI-INF/l10n/bundle_fr.properties b/org.argeo.app.ui/OSGI-INF/l10n/bundle_fr.properties new file mode 100644 index 0000000..225e5fd --- /dev/null +++ b/org.argeo.app.ui/OSGI-INF/l10n/bundle_fr.properties @@ -0,0 +1,102 @@ +dashboard=dashboard +people=contacts +documents=documents +locations=lieux +recentItems=récent + +appTitle=Argeo Suite + +# +# GENERIC +# + +# +# PEOPLE +# org.argeo.people.ui.PeopleMsg +# +person=Personne +organisation=Organisation + +# NewPersonWizard +firstName=Prénom +lastName=Nom +salutation=Salutation +email=Email +personWizardWindowTitle=Nouvelle personne +personWizardPageTitle=Créer un contact + +# NewOrgWizard +legalName=Nom +legalForm=Forme légale +vatId=ID TVA +orgWizardWindowTitle=Nouvelle organisation +orgWizardPageTitle=Créer une organisation + + +# ContextAddressComposite +chooseAnOrganisation=Choisir une organisation +street=Rue +streetComplement=Complément rue +zipCode=Code postal +city=Ville +state=État +country=Pays +geopoint=Géocoordonnées + +# FilteredOrderableEntityTable +filterHelp=Sasir les critères de filtrage séparés par des espaces + +# BankAccountComposite +accountHolder=Propriétaire du compte +bankName=Nom de la banque +currency=Devise +accountNumber=Numéro de compte +bankNumber=Numéro de banque +BIC=BIC +IBAN=IBAN + +# EditJobDialog +position=Rôle +chosenItem=Choisir une élément +department=Service +isPrimary=Principal +searchAndChooseEntity=Cherhcer et choisir l'entitée correspondante + +# ContactListCTab (e4) +notes=Notes +addAContact=Ajouter un contact +contactValue=Valeur +linkedCompany=Entreprise liée + +# OrgAdminInfoCTab (e4) +paymentAccount=Compte de paiement + +# OrgEditor (e4) +orgDetails=Détails +orgActivityLog=Activités +team=Équipe +orgAdmin=Admin. + +# PersonEditor (e4) +personDetails=Détails du contact +personActivityLog=Activités +personOrgs=Organisations +personSecurity=Accès + +# PersonSecurityCTab (e4) +resetPassword=Force le mot de passe + +# Generic +label=Étiquette +aCustomLabel=Une étiquette spécifique +description=Description +value=Valeur +name=Nom +primary=Principal +add=Ajouter +save=Sauver +pickUp=Choisir + +# Tags +confirmNewTag=Le tag #{0} n'existe pas encore. Voulez-vous le créer? +cannotCreateTag=Le tag #{0} n'existe pas encore et vous n'avez pas les droits pour le créer. diff --git a/org.argeo.app.ui/OSGI-INF/leadPane.xml b/org.argeo.app.ui/OSGI-INF/leadPane.xml new file mode 100644 index 0000000..c43d933 --- /dev/null +++ b/org.argeo.app.ui/OSGI-INF/leadPane.xml @@ -0,0 +1,14 @@ + + + + + + + + argeo.suite.ui.dashboardLayer +argeo.library.ui.contentLayer +argeo.people.ui.peopleLayer +argeo.geo.ui.mapLayer + + + diff --git a/org.argeo.app.ui/OSGI-INF/loginScreen.xml b/org.argeo.app.ui/OSGI-INF/loginScreen.xml new file mode 100644 index 0000000..0c5377a --- /dev/null +++ b/org.argeo.app.ui/OSGI-INF/loginScreen.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/org.argeo.app.ui/OSGI-INF/recentItems.xml b/org.argeo.app.ui/OSGI-INF/recentItems.xml new file mode 100644 index 0000000..8aaee16 --- /dev/null +++ b/org.argeo.app.ui/OSGI-INF/recentItems.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/org.argeo.app.ui/OSGI-INF/termsEntryArea.xml b/org.argeo.app.ui/OSGI-INF/termsEntryArea.xml new file mode 100644 index 0000000..cfcae11 --- /dev/null +++ b/org.argeo.app.ui/OSGI-INF/termsEntryArea.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/org.argeo.app.ui/OSGI-INF/termsLayer.xml b/org.argeo.app.ui/OSGI-INF/termsLayer.xml new file mode 100644 index 0000000..f320dd9 --- /dev/null +++ b/org.argeo.app.ui/OSGI-INF/termsLayer.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/org.argeo.app.ui/bnd.bnd b/org.argeo.app.ui/bnd.bnd new file mode 100644 index 0000000..4dc449b --- /dev/null +++ b/org.argeo.app.ui/bnd.bnd @@ -0,0 +1,24 @@ +Service-Component:\ +OSGI-INF/cmsApp.xml,\ +OSGI-INF/eventRecorder.xml,\ +OSGI-INF/header.xml,\ +OSGI-INF/footer.xml,\ +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 + +Import-Package:\ +org.argeo.cms.ui.widgets,\ +org.eclipse.swt,\ +org.osgi.framework,\ +org.argeo.entity,\ +org.eclipse.core.commands.common,\ +org.eclipse.jface.window,\ +org.eclipse.jface.dialogs,\ +org.eclipse.rap.rwt,\ +* diff --git a/org.argeo.app.ui/build.properties b/org.argeo.app.ui/build.properties new file mode 100644 index 0000000..d829967 --- /dev/null +++ b/org.argeo.app.ui/build.properties @@ -0,0 +1,10 @@ +output.. = bin/ +bin.includes = META-INF/,\ + .,\ + OSGI-INF/,\ + config/,\ + OSGI-INF/loginScreen.xml,\ + OSGI-INF/dashboard.xml,\ + OSGI-INF/recentItems.xml,\ + OSGI-INF/dashboardLayer.xml +source.. = src/ diff --git a/org.argeo.app.ui/config/adminLeadPane.properties b/org.argeo.app.ui/config/adminLeadPane.properties new file mode 100644 index 0000000..90b9b04 --- /dev/null +++ b/org.argeo.app.ui/config/adminLeadPane.properties @@ -0,0 +1 @@ +service.pid=argeo.suite.ui.adminLeadPane diff --git a/org.argeo.app.ui/config/cmsApp.properties b/org.argeo.app.ui/config/cmsApp.properties new file mode 100644 index 0000000..1dec00e --- /dev/null +++ b/org.argeo.app.ui/config/cmsApp.properties @@ -0,0 +1,3 @@ +service.pid=argeo.suite.ui.app + +event.topics=argeo/suite/* \ No newline at end of file diff --git a/org.argeo.app.ui/config/dashboard.properties b/org.argeo.app.ui/config/dashboard.properties new file mode 100644 index 0000000..1832543 --- /dev/null +++ b/org.argeo.app.ui/config/dashboard.properties @@ -0,0 +1 @@ +service.pid=argeo.suite.ui.dashboard diff --git a/org.argeo.app.ui/config/dashboardLayer.properties b/org.argeo.app.ui/config/dashboardLayer.properties new file mode 100644 index 0000000..79abe4c --- /dev/null +++ b/org.argeo.app.ui/config/dashboardLayer.properties @@ -0,0 +1,4 @@ +service.pid=argeo.suite.ui.dashboardLayer + +title=Dashboard +icon=dashboard \ No newline at end of file diff --git a/org.argeo.app.ui/config/eventRecorder.properties b/org.argeo.app.ui/config/eventRecorder.properties new file mode 100644 index 0000000..6503863 --- /dev/null +++ b/org.argeo.app.ui/config/eventRecorder.properties @@ -0,0 +1,3 @@ +service.pid=argeo.suite.ui.eventRecorder + +event.topics=argeo/suite/* \ No newline at end of file diff --git a/org.argeo.app.ui/config/footer.properties b/org.argeo.app.ui/config/footer.properties new file mode 100644 index 0000000..12aca56 --- /dev/null +++ b/org.argeo.app.ui/config/footer.properties @@ -0,0 +1 @@ +service.pid=argeo.suite.ui.footer diff --git a/org.argeo.app.ui/config/header.properties b/org.argeo.app.ui/config/header.properties new file mode 100644 index 0000000..034d5f5 --- /dev/null +++ b/org.argeo.app.ui/config/header.properties @@ -0,0 +1,4 @@ +service.pid=argeo.suite.ui.header +argeo.suite.ui=true + +argeo.suite.ui.header.title=%appTitle \ No newline at end of file diff --git a/org.argeo.app.ui/config/leadPane.properties b/org.argeo.app.ui/config/leadPane.properties new file mode 100644 index 0000000..0d7b193 --- /dev/null +++ b/org.argeo.app.ui/config/leadPane.properties @@ -0,0 +1 @@ +service.pid=argeo.suite.ui.leadPane diff --git a/org.argeo.app.ui/config/loginScreen.properties b/org.argeo.app.ui/config/loginScreen.properties new file mode 100644 index 0000000..332614d --- /dev/null +++ b/org.argeo.app.ui/config/loginScreen.properties @@ -0,0 +1 @@ +service.pid=argeo.suite.ui.loginScreen diff --git a/org.argeo.app.ui/config/recentItems.properties b/org.argeo.app.ui/config/recentItems.properties new file mode 100644 index 0000000..7321c55 --- /dev/null +++ b/org.argeo.app.ui/config/recentItems.properties @@ -0,0 +1 @@ +service.pid=argeo.suite.ui.recentItems diff --git a/org.argeo.app.ui/config/termsEntryArea.properties b/org.argeo.app.ui/config/termsEntryArea.properties new file mode 100644 index 0000000..cd31517 --- /dev/null +++ b/org.argeo.app.ui/config/termsEntryArea.properties @@ -0,0 +1 @@ +service.pid=argeo.suite.ui.termsEntryArea diff --git a/org.argeo.app.ui/config/termsLayer.properties b/org.argeo.app.ui/config/termsLayer.properties new file mode 100644 index 0000000..2c0532e --- /dev/null +++ b/org.argeo.app.ui/config/termsLayer.properties @@ -0,0 +1,5 @@ +service.pid=argeo.suite.ui.termsLayer +title=Terms +icon=dashboard + +entity.type=entity:terms,entity:term \ No newline at end of file diff --git a/org.argeo.app.ui/pom.xml b/org.argeo.app.ui/pom.xml new file mode 100644 index 0000000..7e5ea70 --- /dev/null +++ b/org.argeo.app.ui/pom.xml @@ -0,0 +1,48 @@ + + + 4.0.0 + + org.argeo.suite + argeo-suite + 2.3-SNAPSHOT + .. + + org.argeo.app.ui + Suite UI + jar + + + org.argeo.suite + org.argeo.app.core + 2.3-SNAPSHOT + + + + + + + + + + org.argeo.commons + org.argeo.cms.ui + ${version.argeo-commons} + + + + org.argeo.commons.rap + org.argeo.swt.specific.rap + ${version.argeo-commons} + provided + + + + + org.argeo.tp + argeo-tp-rap-e4 + ${version.argeo-tp} + pom + provided + + + diff --git a/org.argeo.app.ui/src/org/argeo/docbook/ui/AbstractDbkViewer.java b/org.argeo.app.ui/src/org/argeo/docbook/ui/AbstractDbkViewer.java new file mode 100644 index 0000000..c9e2183 --- /dev/null +++ b/org.argeo.app.ui/src/org/argeo/docbook/ui/AbstractDbkViewer.java @@ -0,0 +1,1034 @@ +package org.argeo.docbook.ui; + +import static org.argeo.docbook.DbkType.para; +import static org.argeo.docbook.DbkUtils.addDbk; +import static org.argeo.docbook.DbkUtils.isDbk; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Observer; + +import javax.jcr.Item; +import javax.jcr.Node; +import javax.jcr.NodeIterator; +import javax.jcr.RepositoryException; +import javax.jcr.Session; + +import org.argeo.api.cms.Cms2DSize; +import org.argeo.api.cms.CmsEditable; +import org.argeo.api.cms.CmsLog; +import org.argeo.cms.swt.CmsSwtUtils; +import org.argeo.cms.ui.viewers.AbstractPageViewer; +import org.argeo.cms.ui.viewers.EditablePart; +import org.argeo.cms.ui.viewers.NodePart; +import org.argeo.cms.ui.viewers.PropertyPart; +import org.argeo.cms.ui.viewers.Section; +import org.argeo.cms.ui.viewers.SectionPart; +import org.argeo.cms.ui.widgets.EditableText; +import org.argeo.cms.ui.widgets.StyledControl; +import org.argeo.docbook.DbkAttr; +import org.argeo.docbook.DbkType; +import org.argeo.docbook.DbkUtils; +import org.argeo.jcr.Jcr; +import org.argeo.jcr.JcrException; +import org.argeo.jcr.JcrUtils; +import org.eclipse.rap.fileupload.FileDetails; +import org.eclipse.rap.fileupload.FileUploadEvent; +import org.eclipse.rap.fileupload.FileUploadHandler; +import org.eclipse.rap.fileupload.FileUploadListener; +import org.eclipse.rap.rwt.RWT; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.KeyEvent; +import org.eclipse.swt.events.KeyListener; +import org.eclipse.swt.events.MouseAdapter; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Text; + +/** Base class for text viewers and editors. */ +public abstract class AbstractDbkViewer extends AbstractPageViewer implements KeyListener, Observer { + private static final long serialVersionUID = -2401274679492339668L; + private final static CmsLog log = CmsLog.getLog(AbstractDbkViewer.class); + + private final Section mainSection; + + private TextInterpreter textInterpreter = new DbkTextInterpreter(); + private DbkImageManager imageManager; + + private FileUploadListener fileUploadListener; + private DbkContextMenu styledTools; + + private final boolean flat; + + private boolean showMainTitle = true; + + private Integer maxMediaWidth = null; + private String defaultSectionStyle; + + protected AbstractDbkViewer(Section parent, int style, CmsEditable cmsEditable) { + super(parent, style, cmsEditable); +// CmsView cmsView = CmsView.getCmsView(parent); +// imageManager = cmsView.getImageManager(); + flat = SWT.FLAT == (style & SWT.FLAT); + + if (getCmsEditable().canEdit()) { + fileUploadListener = new FUL(); + styledTools = new DbkContextMenu(this, parent.getShell()); + } + this.mainSection = parent; + Node baseFolder = Jcr.getParent(mainSection.getNode()); + imageManager = new DbkImageManager(baseFolder); + initModelIfNeeded(mainSection.getNode()); + // layout(this.mainSection); + } + + @Override + public Control getControl() { + return mainSection; + } + + protected void refresh(Control control) throws RepositoryException { + if (!(control instanceof Section)) + return; + long begin = System.currentTimeMillis(); + Section section = (Section) control; + if (section instanceof TextSection) { + CmsSwtUtils.clear(section); + Node node = section.getNode(); + TextSection textSection = (TextSection) section; + String style = node.hasProperty(DbkAttr.role.name()) ? node.getProperty(DbkAttr.role.name()).getString() + : getDefaultSectionStyle(); + if (style != null) + CmsSwtUtils.style(textSection, style); + + // Title + Node titleNode = null; + // We give priority to ./title vs ./info/title, like the DocBook XSL + if (node.hasNode(DbkType.title.get())) { + titleNode = node.getNode(DbkType.title.get()); + } else if (node.hasNode(DbkType.info.get() + '/' + DbkType.title.get())) { + titleNode = node.getNode(DbkType.info.get() + '/' + DbkType.title.get()); + } + + if (titleNode != null) { + boolean showTitle = getMainSection() == section ? showMainTitle : true; + if (showTitle) { + if (section.getHeader() == null) + section.createHeader(); + DbkSectionTitle title = newSectionTitle(textSection, titleNode); + title.setLayoutData(CmsSwtUtils.fillWidth()); + updateContent(title); + } + } + + // content + for (NodeIterator ni = node.getNodes(); ni.hasNext();) { + Node child = ni.nextNode(); + SectionPart sectionPart = null; + if (isDbk(child, DbkType.mediaobject)) { + if (child.hasNode(DbkType.imageobject.get())) { + sectionPart = newImg(textSection, child); + } else if (child.hasNode(DbkType.videoobject.get())) { + sectionPart = newVideo(textSection, child); + } else { + throw new IllegalArgumentException("Unsupported media object " + child); + } + } else if (isDbk(child, DbkType.info)) { + // TODO enrich UI based on info + } else if (isDbk(child, DbkType.title)) { + // already managed + } else if (isDbk(child, para)) { + sectionPart = newParagraph(textSection, child); + } else if (isDbk(child, DbkType.section)) { + sectionPart = newSectionPart(textSection, child); +// if (sectionPart == null) +// throw new IllegalArgumentException("Unsupported node " + child); + // TODO list node types in exception + } else { + throw new IllegalArgumentException("Unsupported node type for " + child); + } + if (sectionPart != null && sectionPart instanceof Control) + ((Control) sectionPart).setLayoutData(CmsSwtUtils.fillWidth()); + } + +// if (!flat) + for (NodeIterator ni = section.getNode().getNodes(DbkType.section.get()); ni.hasNext();) { + Node child = ni.nextNode(); + if (isDbk(child, DbkType.section)) { + TextSection newSection = newTextSection(section, child); + newSection.setLayoutData(CmsSwtUtils.fillWidth()); + refresh(newSection); + } + } + } else { + for (Section s : section.getSubSections().values()) + refresh(s); + } + // section.layout(true, true); + long duration = System.currentTimeMillis() - begin; +// System.out.println(duration + " ms - " + DbkUtils.getTitle(section.getNode())); + } + + /** To be overridden in order to provide additional SectionPart types */ + protected TextSection newTextSection(Section section, Node node) { + return new TextSection(section, SWT.NONE, node); + } + + /** To be overridden in order to provide additional SectionPart types */ + protected SectionPart newSectionPart(TextSection textSection, Node node) { + return null; + } + + // CRUD + protected Paragraph newParagraph(TextSection parent, Node node) throws RepositoryException { + Paragraph paragraph = new Paragraph(parent, parent.getStyle(), node); + updateContent(paragraph); + paragraph.setLayoutData(CmsSwtUtils.fillWidth()); + paragraph.setMouseListener(getMouseListener()); + paragraph.setFocusListener(getFocusListener()); + return paragraph; + } + + protected DbkImg newImg(TextSection parent, Node node) { + try { + DbkImg img = new DbkImg(parent, parent.getStyle(), node, imageManager); + GridData imgGd; + if (maxMediaWidth != null) { + imgGd = new GridData(SWT.CENTER, SWT.FILL, false, false); + imgGd.widthHint = maxMediaWidth; + img.setPreferredSize(new Cms2DSize(maxMediaWidth, 0)); + } else { + imgGd = CmsSwtUtils.grabWidth(SWT.CENTER, SWT.DEFAULT); + } + img.setLayoutData(imgGd); + updateContent(img); + img.setMouseListener(getMouseListener()); + img.setFocusListener(getFocusListener()); + return img; + } catch (RepositoryException e) { + throw new JcrException("Cannot add new image " + node, e); + } + } + + protected DbkVideo newVideo(TextSection parent, Node node) { + try { + DbkVideo video = new DbkVideo(parent, getCmsEditable().canEdit() ? SWT.NONE : SWT.READ_ONLY, node); + GridData gd; + if (maxMediaWidth != null) { + gd = new GridData(SWT.CENTER, SWT.FILL, false, false); + // TODO, manage size +// gd.widthHint = maxMediaWidth; +// gd.heightHint = (int) (gd.heightHint * 0.5625); + } else { + gd = new GridData(SWT.CENTER, SWT.FILL, false, false); +// gd.widthHint = video.getWidth(); +// gd.heightHint = video.getHeight(); + } + video.setLayoutData(gd); + updateContent(video); + return video; + } catch (RepositoryException e) { + throw new JcrException("Cannot add new image " + node, e); + } + } + + protected DbkSectionTitle newSectionTitle(TextSection parent, Node titleNode) throws RepositoryException { + int style = parent.getStyle(); + Composite titleParent = newSectionHeader(parent); + if (parent.isTitleReadOnly()) + style = style | SWT.READ_ONLY; + DbkSectionTitle title = new DbkSectionTitle(titleParent, style, titleNode); + updateContent(title); + title.setMouseListener(getMouseListener()); + title.setFocusListener(getFocusListener()); + return title; + } + + /** + * To be overridden in order to provide additional processing at the section + * level. + * + * @return the parent to use for the {@link DbkSectionTitle}, by default + * {@link Section#getHeader()} + */ + protected Composite newSectionHeader(TextSection section) { + return section.getHeader(); + } + + protected DbkSectionTitle prepareSectionTitle(Section newSection, String titleText) throws RepositoryException { + Node sectionNode = newSection.getNode(); + Node titleNode = DbkUtils.getOrAddDbk(sectionNode, DbkType.title); + getTextInterpreter().write(titleNode, titleText); + if (newSection.getHeader() == null) + newSection.createHeader(); + DbkSectionTitle sectionTitle = newSectionTitle((TextSection) newSection, sectionNode); + return sectionTitle; + } + + protected void updateContent(EditablePart part) throws RepositoryException { + if (part instanceof SectionPart) { + SectionPart sectionPart = (SectionPart) part; + Node partNode = sectionPart.getNode(); + + if (part instanceof StyledControl && (sectionPart.getSection() instanceof TextSection)) { + TextSection section = (TextSection) sectionPart.getSection(); + StyledControl styledControl = (StyledControl) part; + if (isDbk(partNode, para)) { + String style = partNode.hasProperty(DbkAttr.role.name()) + ? partNode.getProperty(DbkAttr.role.name()).getString() + : section.getDefaultTextStyle(); + styledControl.setStyle(style); + } + } + // use control AFTER setting style, since it may have been reset + + if (part instanceof EditableText) { + EditableText paragraph = (EditableText) part; + if (paragraph == getEdited()) + paragraph.setText(textInterpreter.raw(partNode)); + else + paragraph.setText(textInterpreter.readSimpleHtml(partNode)); + } else if (part instanceof DbkImg) { + DbkImg editableImage = (DbkImg) part; + // imageManager.load(partNode, part.getControl(), + // editableImage.getPreferredImageSize()); + } else if (part instanceof DbkVideo) { + DbkVideo video = (DbkVideo) part; + video.load(part.getControl()); + } + } else if (part instanceof DbkSectionTitle) { + DbkSectionTitle title = (DbkSectionTitle) part; + title.setStyle(title.getSection().getTitleStyle()); + // use control AFTER setting style + if (title == getEdited()) + title.setText(textInterpreter.read(title.getNode())); + else + title.setText(textInterpreter.readSimpleHtml(title.getNode())); + } + } + + // OVERRIDDEN FROM PARENT VIEWER + @Override + protected void save(EditablePart part) throws RepositoryException { + if (part instanceof EditableText) { + EditableText et = (EditableText) part; + if (!et.getEditable()) + return; + String text = ((Text) et.getControl()).getText(); + + // String[] lines = text.split("[\r\n]+"); + String[] lines = { text }; + assert lines.length != 0; + saveLine(part, lines[0]); + if (lines.length > 1) { + ArrayList toLayout = new ArrayList(); + if (part instanceof Paragraph) { + Paragraph currentParagraph = (Paragraph) et; + Section section = currentParagraph.getSection(); + Node sectionNode = section.getNode(); + Node currentParagraphN = currentParagraph.getNode(); + for (int i = 1; i < lines.length; i++) { + Node newNode = addDbk(sectionNode, para); + // newNode.addMixin(CmsTypes.CMS_STYLED); + saveLine(newNode, lines[i]); + // second node was create as last, if it is not the next + // one, it + // means there are some in between and we can take the + // one at + // index+1 for the re-order + if (newNode.getIndex() > currentParagraphN.getIndex() + 1) { + sectionNode.orderBefore(p(newNode.getIndex()), p(currentParagraphN.getIndex() + 1)); + } + Paragraph newParagraph = newParagraph((TextSection) section, newNode); + newParagraph.moveBelow(currentParagraph); + toLayout.add(newParagraph); + + currentParagraph = newParagraph; + currentParagraphN = newNode; + } + } + // TODO or rather return the created paragraphs? + layout(toLayout.toArray(new Control[toLayout.size()])); + } + persistChanges(et.getNode()); + } + } + + protected void saveLine(EditablePart part, String line) { + if (part instanceof NodePart) { + saveLine(((NodePart) part).getNode(), line); + } else if (part instanceof PropertyPart) { + saveLine(((PropertyPart) part).getProperty(), line); + } else { + throw new IllegalArgumentException("Unsupported part " + part); + } + } + + protected void saveLine(Item item, String line) { + line = line.trim(); + textInterpreter.write(item, line); + } + + @Override + protected void prepare(EditablePart part, Object caretPosition) { + Control control = part.getControl(); + if (control instanceof Text) { + Text text = (Text) control; + if (caretPosition != null) + if (caretPosition instanceof Integer) + text.setSelection((Integer) caretPosition); + else if (caretPosition instanceof Point) { +// layout(text); +// // TODO find a way to position the caret at the right place +// Point clickLocation = (Point) caretPosition; +// Point withinText = text.toControl(clickLocation); +// Rectangle bounds = text.getBounds(); +// int width = bounds.width; +// int height = bounds.height; +// int textLength = text.getText().length(); +// float area = width * height; +// float proportion = withinText.y * width + withinText.x; +// int pos = (int) (textLength * (proportion / area)); +// text.setSelection(pos); + } + text.setData(RWT.ACTIVE_KEYS, new String[] { "BACKSPACE", "ESC", "TAB", "SHIFT+TAB", "ALT+ARROW_LEFT", + "ALT+ARROW_RIGHT", "ALT+ARROW_UP", "ALT+ARROW_DOWN", "RETURN", "CTRL+RETURN", "ENTER", "DELETE" }); + text.setData(RWT.CANCEL_KEYS, new String[] { "RETURN", "ALT+ARROW_LEFT", "ALT+ARROW_RIGHT" }); + text.addKeyListener(this); + } else if (part instanceof DbkImg) { + ((DbkImg) part).setFileUploadListener(fileUploadListener); + } + } + + // REQUIRED BY CONTEXT MENU + void setParagraphStyle(Paragraph paragraph, String style) { + try { + Node paragraphNode = paragraph.getNode(); + if (style == null) {// default + if (paragraphNode.hasProperty(DbkAttr.role.name())) + paragraphNode.getProperty(DbkAttr.role.name()).remove(); + } else { + paragraphNode.setProperty(DbkAttr.role.name(), style); + } + persistChanges(paragraphNode); + updateContent(paragraph); + layoutPage(); + } catch (RepositoryException e1) { + throw new JcrException("Cannot set style " + style + " on " + paragraph, e1); + } + } + + SectionPart insertPart(Section section, Node node) { + try { + refresh(section); + layoutPage(); + for (Control control : section.getChildren()) { + if (control instanceof SectionPart) { + SectionPart sectionPart = (SectionPart) control; + Node partNode = sectionPart.getNode(); + if (partNode.getPath().equals(node.getPath())) + return sectionPart; + } + } + throw new IllegalStateException("New section part " + node + "not found"); + } catch (RepositoryException e) { + throw new JcrException("Cannot insert part " + node + " in section " + section.getNode(), e); + } + } + + void addParagraph(SectionPart partBefore, String txt) { + Section section = partBefore.getSection(); + SectionPart nextSectionPart = section.nextSectionPart(partBefore); + Node newNode = addDbk(section.getNode(), para); + textInterpreter.write(newNode, txt != null ? txt : ""); + if (nextSectionPart != null) { + try { + Node nextNode = nextSectionPart.getNode(); + section.getNode().orderBefore(Jcr.getIndexedName(newNode), Jcr.getIndexedName(nextNode)); + } catch (RepositoryException e) { + throw new JcrException("Cannot order " + newNode + " before " + nextSectionPart.getNode(), e); + } + } + Jcr.save(newNode); + Paragraph paragraph = (Paragraph) insertPart(partBefore.getSection(), newNode); + edit(paragraph, 0); + } + + void deletePart(SectionPart sectionPart) { + try { + Node node = sectionPart.getNode(); + Session session = node.getSession(); + if (sectionPart instanceof DbkImg) { + if (!isDbk(node, DbkType.mediaobject)) + throw new IllegalArgumentException("Node " + node + " is not a media object."); + } + node.remove(); + session.save(); + if (sectionPart instanceof Control) + ((Control) sectionPart).dispose(); + layoutPage(); + } catch (RepositoryException e1) { + throw new JcrException("Cannot delete " + sectionPart, e1); + } + } + + void deleteSection(Section section) { + try { + Node node = section.getNode(); + Session session = node.getSession(); + node.remove(); + session.save(); + section.dispose(); + layoutPage(); + } catch (RepositoryException e1) { + throw new JcrException("Cannot delete " + section, e1); + } + } + + String getRawParagraphText(Paragraph paragraph) { + return textInterpreter.raw(paragraph.getNode()); + } + + // COMMANDS + protected void splitEdit() { + checkEdited(); + try { + if (getEdited() instanceof Paragraph) { + Paragraph paragraph = (Paragraph) getEdited(); + Text text = (Text) paragraph.getControl(); + int caretPosition = text.getCaretPosition(); + String txt = text.getText(); + String first = txt.substring(0, caretPosition); + String second = txt.substring(caretPosition); + Node firstNode = paragraph.getNode(); + Node sectionNode = firstNode.getParent(); + + // FIXME set content the DocBook way + // firstNode.setProperty(CMS_CONTENT, first); + Node secondNode = addDbk(sectionNode, para); + // secondNode.addMixin(CmsTypes.CMS_STYLED); + + // second node was create as last, if it is not the next one, it + // means there are some in between and we can take the one at + // index+1 for the re-order + if (secondNode.getIndex() > firstNode.getIndex() + 1) { + sectionNode.orderBefore(p(secondNode.getIndex()), p(firstNode.getIndex() + 1)); + } + + // if we die in between, at least we still have the whole text + // in the first node + try { + textInterpreter.write(secondNode, second); + textInterpreter.write(firstNode, first); + } catch (Exception e) { + // so that no additional nodes are created: + JcrUtils.discardUnderlyingSessionQuietly(firstNode); + throw e; + } + + persistChanges(firstNode); + + Paragraph secondParagraph = paragraphSplitted(paragraph, secondNode); + edit(secondParagraph, 0); + } else if (getEdited() instanceof DbkSectionTitle) { + DbkSectionTitle sectionTitle = (DbkSectionTitle) getEdited(); + Text text = (Text) sectionTitle.getControl(); + String txt = text.getText(); + int caretPosition = text.getCaretPosition(); + Section section = sectionTitle.getSection(); + Node sectionNode = section.getNode(); + Node paragraphNode = addDbk(sectionNode, para); + // paragraphNode.addMixin(CmsTypes.CMS_STYLED); + + textInterpreter.write(paragraphNode, txt.substring(caretPosition)); + textInterpreter.write(sectionNode.getNode(DbkType.title.get()), txt.substring(0, caretPosition)); + sectionNode.orderBefore(p(paragraphNode.getIndex()), p(1)); + persistChanges(sectionNode); + + Paragraph paragraph = sectionTitleSplitted(sectionTitle, paragraphNode); + // section.layout(); + edit(paragraph, 0); + } + } catch (RepositoryException e) { + throw new JcrException("Cannot split " + getEdited(), e); + } + } + + protected void mergeWithPrevious() { + checkEdited(); + try { + Paragraph paragraph = (Paragraph) getEdited(); + Text text = (Text) paragraph.getControl(); + String txt = text.getText(); + Node paragraphNode = paragraph.getNode(); + if (paragraphNode.getIndex() == 1) + return;// do nothing + Node sectionNode = paragraphNode.getParent(); + Node previousNode = sectionNode.getNode(p(paragraphNode.getIndex() - 1)); + String previousTxt = textInterpreter.read(previousNode); + textInterpreter.write(previousNode, previousTxt + txt); + paragraphNode.remove(); + persistChanges(sectionNode); + + Paragraph previousParagraph = paragraphMergedWithPrevious(paragraph, previousNode); + edit(previousParagraph, previousTxt.length()); + } catch (RepositoryException e) { + throw new JcrException("Cannot stop editing", e); + } + } + + protected void mergeWithNext() { + checkEdited(); + try { + Paragraph paragraph = (Paragraph) getEdited(); + Text text = (Text) paragraph.getControl(); + String txt = text.getText(); + Node paragraphNode = paragraph.getNode(); + Node sectionNode = paragraphNode.getParent(); + NodeIterator paragraphNodes = sectionNode.getNodes(DbkType.para.get()); + long size = paragraphNodes.getSize(); + if (paragraphNode.getIndex() == size) + return;// do nothing + Node nextNode = sectionNode.getNode(p(paragraphNode.getIndex() + 1)); + String nextTxt = textInterpreter.read(nextNode); + textInterpreter.write(paragraphNode, txt + nextTxt); + + Section section = paragraph.getSection(); + Paragraph removed = (Paragraph) section.getSectionPart(nextNode.getIdentifier()); + + nextNode.remove(); + persistChanges(sectionNode); + + paragraphMergedWithNext(paragraph, removed); + edit(paragraph, txt.length()); + } catch (RepositoryException e) { + throw new JcrException("Cannot stop editing", e); + } + } + + protected synchronized void upload(EditablePart part) { + try { + if (part instanceof SectionPart) { + SectionPart sectionPart = (SectionPart) part; + Node partNode = sectionPart.getNode(); + int partIndex = partNode.getIndex(); + Section section = sectionPart.getSection(); + Node sectionNode = section.getNode(); + + if (part instanceof Paragraph) { + // FIXME adapt to DocBook +// Node newNode = sectionNode.addNode(DocBookNames.DBK_MEDIAOBJECT, NodeType.NT_FILE); +// newNode.addNode(Node.JCR_CONTENT, NodeType.NT_RESOURCE); +// JcrUtils.copyBytesAsFile(sectionNode, p(newNode.getIndex()), new byte[0]); +// if (partIndex < newNode.getIndex() - 1) { +// // was not last +// sectionNode.orderBefore(p(newNode.getIndex()), p(partIndex - 1)); +// } +// // sectionNode.orderBefore(p(partNode.getIndex()), +// // p(newNode.getIndex())); +// persistChanges(sectionNode); +// DbkImg img = newImg((TextSection) section, newNode); +// edit(img, null); +// layout(img.getControl()); + } else if (part instanceof DbkImg) { + if (getEdited() == part) + return; + edit(part, null); + layoutPage(); + } + } + } catch (RepositoryException e) { + throw new JcrException("Cannot upload", e); + } + } + + protected void deepen() { + if (flat) + return; + checkEdited(); + try { + if (getEdited() instanceof Paragraph) { + Paragraph paragraph = (Paragraph) getEdited(); + Text text = (Text) paragraph.getControl(); + String txt = text.getText(); + Node paragraphNode = paragraph.getNode(); + Section section = paragraph.getSection(); + Node sectionNode = section.getNode(); + // main title + if (section == mainSection && section instanceof TextSection && paragraphNode.getIndex() == 1 + && !sectionNode.hasNode(DbkType.title.get())) { + DbkSectionTitle sectionTitle = prepareSectionTitle(section, txt); + edit(sectionTitle, 0); + return; + } + Node newSectionNode = addDbk(sectionNode, DbkType.section); + // newSectionNode.addMixin(NodeType.MIX_TITLE); + sectionNode.orderBefore(h(newSectionNode.getIndex()), h(1)); + + int paragraphIndex = paragraphNode.getIndex(); + String sectionPath = sectionNode.getPath(); + String newSectionPath = newSectionNode.getPath(); + while (sectionNode.hasNode(p(paragraphIndex + 1))) { + Node parag = sectionNode.getNode(p(paragraphIndex + 1)); + sectionNode.getSession().move(sectionPath + '/' + p(paragraphIndex + 1), + newSectionPath + '/' + DbkType.para.get()); + SectionPart sp = section.getSectionPart(parag.getIdentifier()); + if (sp instanceof Control) + ((Control) sp).dispose(); + } + // create title + Node titleNode = DbkUtils.addDbk(newSectionNode, DbkType.title); + // newSectionNode.addNode(DocBookType.TITLE, DocBookType.TITLE); + getTextInterpreter().write(titleNode, txt); + + TextSection newSection = new TextSection(section, section.getStyle(), newSectionNode); + newSection.setLayoutData(CmsSwtUtils.fillWidth()); + newSection.moveBelow(paragraph); + + // dispose + paragraphNode.remove(); + paragraph.dispose(); + + refresh(newSection); + newSection.getParent().layout(); + layout(newSection); + persistChanges(sectionNode); + } else if (getEdited() instanceof DbkSectionTitle) { + DbkSectionTitle sectionTitle = (DbkSectionTitle) getEdited(); + Section section = sectionTitle.getSection(); + Section parentSection = section.getParentSection(); + if (parentSection == null) + return;// cannot deepen main section + Node sectionN = section.getNode(); + Node parentSectionN = parentSection.getNode(); + if (sectionN.getIndex() == 1) + return;// cannot deepen first section + Node previousSectionN = parentSectionN.getNode(h(sectionN.getIndex() - 1)); + NodeIterator subSections = previousSectionN.getNodes(DbkType.section.get()); + int subsectionsCount = (int) subSections.getSize(); + previousSectionN.getSession().move(sectionN.getPath(), + previousSectionN.getPath() + "/" + h(subsectionsCount + 1)); + section.dispose(); + TextSection newSection = new TextSection(section, section.getStyle(), sectionN); + refresh(newSection); + persistChanges(previousSectionN); + } + } catch (RepositoryException e) { + throw new JcrException("Cannot deepen " + getEdited(), e); + } + } + + protected void undeepen() { + if (flat) + return; + checkEdited(); + try { + if (getEdited() instanceof Paragraph) { + upload(getEdited()); + } else if (getEdited() instanceof DbkSectionTitle) { + DbkSectionTitle sectionTitle = (DbkSectionTitle) getEdited(); + Section section = sectionTitle.getSection(); + Node sectionNode = section.getNode(); + Section parentSection = section.getParentSection(); + if (parentSection == null) + return;// cannot undeepen main section + + // choose in which section to merge + Section mergedSection; + if (sectionNode.getIndex() == 1) + mergedSection = section.getParentSection(); + else { + Map parentSubsections = parentSection.getSubSections(); + ArrayList
lst = new ArrayList
(parentSubsections.values()); + mergedSection = lst.get(sectionNode.getIndex() - 1); + } + Node mergedNode = mergedSection.getNode(); + boolean mergedHasSubSections = mergedNode.hasNode(DbkType.section.get()); + + // title as paragraph + Node newParagrapheNode = addDbk(mergedNode, para); + // newParagrapheNode.addMixin(CmsTypes.CMS_STYLED); + if (mergedHasSubSections) + mergedNode.orderBefore(p(newParagrapheNode.getIndex()), h(1)); + String txt = getTextInterpreter().read(sectionNode.getNode(DbkType.title.get())); + getTextInterpreter().write(newParagrapheNode, txt); + // move + NodeIterator paragraphs = sectionNode.getNodes(para.get()); + while (paragraphs.hasNext()) { + Node p = paragraphs.nextNode(); + SectionPart sp = section.getSectionPart(p.getIdentifier()); + if (sp instanceof Control) + ((Control) sp).dispose(); + mergedNode.getSession().move(p.getPath(), mergedNode.getPath() + '/' + para.get()); + if (mergedHasSubSections) + mergedNode.orderBefore(p(p.getIndex()), h(1)); + } + + Iterator
subsections = section.getSubSections().values().iterator(); + // NodeIterator sections = sectionNode.getNodes(CMS_H); + while (subsections.hasNext()) { + Section subsection = subsections.next(); + Node s = subsection.getNode(); + mergedNode.getSession().move(s.getPath(), mergedNode.getPath() + '/' + DbkType.section.get()); + subsection.dispose(); + } + + // remove section + section.getNode().remove(); + section.dispose(); + + refresh(mergedSection); + mergedSection.getParent().layout(); + layout(mergedSection); + persistChanges(mergedNode); + } + } catch (RepositoryException e) { + throw new JcrException("Cannot undeepen " + getEdited(), e); + } + } + + // UI CHANGES + protected Paragraph paragraphSplitted(Paragraph paragraph, Node newNode) throws RepositoryException { + Section section = paragraph.getSection(); + updateContent(paragraph); + Paragraph newParagraph = newParagraph((TextSection) section, newNode); + newParagraph.setLayoutData(CmsSwtUtils.fillWidth()); + newParagraph.moveBelow(paragraph); + layout(paragraph.getControl(), newParagraph.getControl()); + return newParagraph; + } + + protected Paragraph sectionTitleSplitted(DbkSectionTitle sectionTitle, Node newNode) throws RepositoryException { + updateContent(sectionTitle); + Paragraph newParagraph = newParagraph(sectionTitle.getSection(), newNode); + // we assume beforeFirst is not null since there was a sectionTitle + newParagraph.moveBelow(sectionTitle.getSection().getHeader()); + layout(sectionTitle.getControl(), newParagraph.getControl()); + return newParagraph; + } + + protected Paragraph paragraphMergedWithPrevious(Paragraph removed, Node remaining) throws RepositoryException { + Section section = removed.getSection(); + removed.dispose(); + + Paragraph paragraph = (Paragraph) section.getSectionPart(remaining.getIdentifier()); + updateContent(paragraph); + layout(paragraph.getControl()); + return paragraph; + } + + protected void paragraphMergedWithNext(Paragraph remaining, Paragraph removed) throws RepositoryException { + removed.dispose(); + updateContent(remaining); + layout(remaining.getControl()); + } + + // UTILITIES + protected String p(Integer index) { + StringBuilder sb = new StringBuilder(6); + sb.append(para.get()).append('[').append(index).append(']'); + return sb.toString(); + } + + protected String h(Integer index) { + StringBuilder sb = new StringBuilder(5); + sb.append(DbkType.section.get()).append('[').append(index).append(']'); + return sb.toString(); + } + + // GETTERS / SETTERS + public Section getMainSection() { + return mainSection; + } + + public boolean isFlat() { + return flat; + } + + public TextInterpreter getTextInterpreter() { + return textInterpreter; + } + + // KEY LISTENER + @Override + public void keyPressed(KeyEvent ke) { + if (log.isTraceEnabled()) + log.trace(ke); + + if (getEdited() == null) + return; + boolean altPressed = (ke.stateMask & SWT.ALT) != 0; + boolean shiftPressed = (ke.stateMask & SWT.SHIFT) != 0; + boolean ctrlPressed = (ke.stateMask & SWT.CTRL) != 0; + + try { + // Common + if (ke.keyCode == SWT.ESC) { +// cancelEdit(); + saveEdit(); + } else if (ke.character == '\r') { + if (!shiftPressed) + splitEdit(); + } else if (ke.character == 'z') { + if (ctrlPressed) + cancelEdit(); + } else if (ke.character == 'S') { + if (ctrlPressed) + saveEdit(); + } else if (ke.character == '\t') { + if (!shiftPressed) { + deepen(); + } else if (shiftPressed) { + undeepen(); + } + } else { + if (getEdited() instanceof Paragraph) { + Paragraph paragraph = (Paragraph) getEdited(); + Section section = paragraph.getSection(); + if (altPressed && ke.keyCode == SWT.ARROW_RIGHT) { + edit(section.nextSectionPart(paragraph), 0); + } else if (altPressed && ke.keyCode == SWT.ARROW_LEFT) { + edit(section.previousSectionPart(paragraph), 0); + } else if (ke.character == SWT.BS) { + Text text = (Text) paragraph.getControl(); + int caretPosition = text.getCaretPosition(); + if (caretPosition == 0) { + mergeWithPrevious(); + } + } else if (ke.character == SWT.DEL) { + Text text = (Text) paragraph.getControl(); + int caretPosition = text.getCaretPosition(); + int charcount = text.getCharCount(); + if (caretPosition == charcount) { + mergeWithNext(); + } + } + } + } + } catch (Exception e) { + ke.doit = false; + notifyEditionException(e); + } + } + + @Override + public void keyReleased(KeyEvent e) { + } + + // MOUSE LISTENER + @Override + protected MouseListener createMouseListener() { + return new ML(); + } + + private class ML extends MouseAdapter { + private static final long serialVersionUID = 8526890859876770905L; + + @Override + public void mouseDoubleClick(MouseEvent e) { + if (e.button == 1) { + Control source = (Control) e.getSource(); + EditablePart composite = findDataParent(source); + Point point = new Point(e.x, e.y); + if (composite instanceof DbkImg) { + if (getCmsEditable().canEdit()) { + if (getCmsEditable().isEditing() && !(getEdited() instanceof DbkImg)) { + if (source == mainSection) + return; + EditablePart part = findDataParent(source); + upload(part); + } else { + getCmsEditable().startEditing(); + } + } + } else if (source instanceof Label) { + Label lbl = (Label) source; + Rectangle bounds = lbl.getBounds(); + float width = bounds.width; + float height = bounds.height; + float textLength = lbl.getText().length(); + float area = width * height; + float charArea = area / textLength; + float lines = textLength / width; + float proportion = point.y * width + point.x; + int pos = (int) (textLength * (proportion / area)); + // TODO refine it + edit(composite, (Integer) pos); + } else { + edit(composite, source.toDisplay(point)); + } + } + } + + @Override + public void mouseDown(MouseEvent e) { + if (getCmsEditable().isEditing()) { + if (e.button == 3) { + EditablePart composite = findDataParent((Control) e.getSource()); + if (styledTools != null) { + List styles = getAvailableStyles(composite); + styledTools.show(composite, new Point(e.x, e.y), styles); + } + } + } + } + + @Override + public void mouseUp(MouseEvent e) { + } + } + + protected List getAvailableStyles(EditablePart editablePart) { + return new ArrayList<>(); + } + + public void setMaxMediaWidth(Integer maxMediaWidth) { + this.maxMediaWidth = maxMediaWidth; + } + + public void setShowMainTitle(boolean showMainTitle) { + this.showMainTitle = showMainTitle; + } + + public String getDefaultSectionStyle() { + return defaultSectionStyle; + } + + public void setDefaultSectionStyle(String defaultSectionStyle) { + this.defaultSectionStyle = defaultSectionStyle; + } + + // FILE UPLOAD LISTENER + private class FUL implements FileUploadListener { + public void uploadProgress(FileUploadEvent event) { + // TODO Monitor upload progress + } + + public void uploadFailed(FileUploadEvent event) { + throw new RuntimeException("Upload failed " + event, event.getException()); + } + + public void uploadFinished(FileUploadEvent event) { + for (FileDetails file : event.getFileDetails()) { + if (log.isDebugEnabled()) + log.debug("Received: " + file.getFileName()); + } + mainSection.getDisplay().syncExec(new Runnable() { + @Override + public void run() { + saveEdit(); + } + }); + FileUploadHandler uploadHandler = (FileUploadHandler) event.getSource(); + uploadHandler.dispose(); + } + } +} \ No newline at end of file diff --git a/org.argeo.app.ui/src/org/argeo/docbook/ui/CustomDbkEditor.java b/org.argeo.app.ui/src/org/argeo/docbook/ui/CustomDbkEditor.java new file mode 100644 index 0000000..94c9825 --- /dev/null +++ b/org.argeo.app.ui/src/org/argeo/docbook/ui/CustomDbkEditor.java @@ -0,0 +1,23 @@ +package org.argeo.docbook.ui; + +import javax.jcr.Node; + +import org.argeo.api.cms.CmsEditable; +import org.argeo.cms.ui.viewers.Section; +import org.eclipse.swt.widgets.Composite; + +/** + * Manages hardcoded sections as an arbitrary hierarchy under the main section, + * which contains no text and no title. + */ +public class CustomDbkEditor extends AbstractDbkViewer { + private static final long serialVersionUID = 656302500183820802L; + + public CustomDbkEditor(Composite parent, int style, Node textNode, CmsEditable cmsEditable) { + this(new Section(parent, style, textNode), style, cmsEditable); + } + + public CustomDbkEditor(Section parent, int style, CmsEditable cmsEditable) { + super(parent, style, cmsEditable); + } +} diff --git a/org.argeo.app.ui/src/org/argeo/docbook/ui/DbkContextMenu.java b/org.argeo.app.ui/src/org/argeo/docbook/ui/DbkContextMenu.java new file mode 100644 index 0000000..778f7c8 --- /dev/null +++ b/org.argeo.app.ui/src/org/argeo/docbook/ui/DbkContextMenu.java @@ -0,0 +1,230 @@ +package org.argeo.docbook.ui; + +import java.util.ArrayList; +import java.util.List; + +import javax.jcr.Node; + +import org.argeo.api.cms.CmsEditable; +import org.argeo.cms.swt.CmsSwtUtils; +import org.argeo.cms.swt.MouseDown; +import org.argeo.cms.ui.viewers.EditablePart; +import org.argeo.cms.ui.viewers.NodePart; +import org.argeo.cms.ui.viewers.Section; +import org.argeo.cms.ui.viewers.SectionPart; +import org.argeo.cms.ui.widgets.EditableText; +import org.argeo.cms.ui.widgets.Img; +import org.argeo.docbook.DbkMsg; +import org.argeo.docbook.DbkUtils; +import org.argeo.jcr.Jcr; +import org.eclipse.rap.rwt.RWT; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.MouseAdapter; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.ShellEvent; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; + +/** Dialog to edit a text part. */ +class DbkContextMenu { + private final AbstractDbkViewer textViewer; + + private Shell shell; + + DbkContextMenu(AbstractDbkViewer textViewer, Shell parentShell) { +// shell = new Shell(display, SWT.NO_TRIM | SWT.BORDER | SWT.ON_TOP); + shell = new Shell(parentShell, SWT.BORDER); +// super(display, SWT.NO_TRIM | SWT.BORDER | SWT.ON_TOP); + this.textViewer = textViewer; + shell.setLayout(new GridLayout()); + // shell.setData(RWT.CUSTOM_VARIANT, TEXT_STYLED_TOOLS_DIALOG); + + shell.addShellListener(new ToolsShellListener()); + } + + void show(EditablePart editablePart, Point location, List availableStyles) { + if (shell.isVisible()) + shell.setVisible(false); + CmsSwtUtils.clear(shell); + Composite parent = shell; + CmsEditable cmsEditable = textViewer.getCmsEditable(); +// if (availableStyles.isEmpty()) +// return; + + if (editablePart instanceof Paragraph) { + Paragraph paragraph = (Paragraph) editablePart; + deletePartB(parent, DbkMsg.deleteParagraph.lead(), paragraph); + insertMediaB(parent, paragraph); + + } else if (editablePart instanceof Img) { + Img img = (Img) editablePart; + deletePartB(parent, DbkMsg.deleteMedia.lead(), img); + insertMediaB(parent, img); + insertParagraphB(parent, DbkMsg.insertParagraph.lead(), img); + + } else if (editablePart instanceof DbkSectionTitle) { + DbkSectionTitle sectionTitle = (DbkSectionTitle) editablePart; + TextSection section = sectionTitle.getSection(); + if (!section.isTitleReadOnly()) { + Label deleteB = new Label(shell, SWT.NONE); + deleteB.setText(DbkMsg.deleteSection.lead()); + deleteB.addMouseListener((MouseDown) (e) -> { + textViewer.deleteSection(section); + hide(); + }); + } + insertMediaB(parent, sectionTitle.getSection(), sectionTitle); + } + + StyledToolMouseListener stml = new StyledToolMouseListener(editablePart); + List styleButtons = new ArrayList(); + if (cmsEditable.isEditing()) { + for (String style : availableStyles) { + StyleButton styleButton = new StyleButton(shell, SWT.WRAP); + if (!"".equals(style)) + styleButton.setStyle(style); + else + styleButton.setStyle(null); + styleButton.setMouseListener(stml); + styleButtons.add(styleButton); + } + } else if (cmsEditable.canEdit()) { + // Edit +// Label editButton = new Label(shell, SWT.NONE); +// editButton.setText("Edit"); +// editButton.addMouseListener(stml); + } + + if (editablePart instanceof Paragraph) { + final int size = 32; + String text = textViewer.getRawParagraphText((Paragraph) editablePart); + String textToShow = text.length() > size ? text.substring(0, size - 3) + "..." : text; + for (StyleButton styleButton : styleButtons) { + styleButton.setText((styleButton.style == null ? "default" : styleButton.style) + " : " + textToShow); + } + } + + shell.pack(); + shell.layout(); + if (editablePart instanceof Control) { + int height = shell.getSize().y; + int parentShellHeight = shell.getShell().getSize().y; + if ((location.y + height) < parentShellHeight) { + shell.setLocation(((Control) editablePart).toDisplay(location.x, location.y)); + } else { + shell.setLocation(((Control) editablePart).toDisplay(location.x, location.y - parentShellHeight)); + } + } + + if (shell.getChildren().length != 0) + shell.open(); + } + + void hide() { + shell.setVisible(false); + } + + protected void insertMediaB(Composite parent, SectionPart sectionPart) { + insertMediaB(parent, sectionPart.getSection(), sectionPart); + } + + protected void insertMediaB(Composite parent, Section section, NodePart nodePart) { + Label insertPictureB = new Label(parent, SWT.NONE); + insertPictureB.setText(DbkMsg.insertPicture.lead()); + insertPictureB.addMouseListener((MouseDown) (e) -> { + Node newNode = DbkUtils.insertImageAfter(nodePart.getNode()); + Jcr.save(newNode); + textViewer.insertPart(section, newNode); + hide(); + }); + Label insertVideoB = new Label(parent, SWT.NONE); + insertVideoB.setText(DbkMsg.insertVideo.lead()); + insertVideoB.addMouseListener((MouseDown) (e) -> { + Node newNode = DbkUtils.insertVideoAfter(nodePart.getNode()); + Jcr.save(newNode); + textViewer.insertPart(section, newNode); + hide(); + }); + + } + + protected void insertParagraphB(Composite parent, String msg, SectionPart sectionPart) { + Label insertMediaB = new Label(parent, SWT.NONE); + insertMediaB.setText(msg); + insertMediaB.addMouseListener((MouseDown) (e) -> { + textViewer.addParagraph(sectionPart, null); + hide(); + }); + } + + protected void deletePartB(Composite parent, String msg, SectionPart sectionPart) { + Label deleteB = new Label(shell, SWT.NONE); + deleteB.setText(msg); + deleteB.addMouseListener((MouseDown) (e) -> { + textViewer.deletePart(sectionPart); + hide(); + }); + } + + class StyleButton extends EditableText { + private static final long serialVersionUID = 7731102609123946115L; + + String style; + + public StyleButton(Composite parent, int style) { + super(parent, style); + } + + @Override + public void setStyle(String style) { + this.style = style; + super.setStyle(style); + } + +// private Label label; +// +// public StyleButton(Composite parent, int swtStyle) { +// super(parent, SWT.NONE); +// setLayout(new GridLayout()); +// label = new Label(this, swtStyle); +// } +// +// public Label getLabel() { +// return label; +// } + + } + + class StyledToolMouseListener extends MouseAdapter { + private static final long serialVersionUID = 8516297091549329043L; + private EditablePart editablePart; + + public StyledToolMouseListener(EditablePart editablePart) { + super(); + this.editablePart = editablePart; + } + + @Override + public void mouseDown(MouseEvent e) { + // TODO make it more robust. + Label sb = (Label) e.getSource(); + Object style = sb.getData(RWT.CUSTOM_VARIANT); + textViewer.setParagraphStyle((Paragraph) editablePart, style == null ? null : style.toString()); + hide(); + } + } + + class ToolsShellListener extends org.eclipse.swt.events.ShellAdapter { + private static final long serialVersionUID = 8432350564023247241L; + + @Override + public void shellDeactivated(ShellEvent e) { + hide(); + } + + } +} diff --git a/org.argeo.app.ui/src/org/argeo/docbook/ui/DbkImageManager.java b/org.argeo.app.ui/src/org/argeo/docbook/ui/DbkImageManager.java new file mode 100644 index 0000000..63f17d2 --- /dev/null +++ b/org.argeo.app.ui/src/org/argeo/docbook/ui/DbkImageManager.java @@ -0,0 +1,175 @@ +package org.argeo.docbook.ui; + +import static javax.jcr.Node.JCR_CONTENT; +import static javax.jcr.Property.JCR_DATA; +import static javax.jcr.nodetype.NodeType.NT_FILE; + +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + +import javax.jcr.Binary; +import javax.jcr.Node; +import javax.jcr.RepositoryException; +import javax.jcr.nodetype.NodeType; + +import org.argeo.api.cms.Cms2DSize; +import org.argeo.api.cms.CmsImageManager; +import org.argeo.cms.ui.util.CmsUiUtils; +import org.argeo.cms.ui.util.DefaultImageManager; +import org.argeo.docbook.DbkAttr; +import org.argeo.docbook.DbkType; +import org.argeo.docbook.DbkUtils; +import org.argeo.entity.EntityNames; +import org.argeo.entity.EntityType; +import org.argeo.jcr.JcrException; +import org.argeo.jcr.JcrUtils; +import org.eclipse.swt.graphics.ImageData; + +/** Add DocBook images support to {@link CmsImageManager}. */ +public class DbkImageManager extends DefaultImageManager { + private Node baseFolder = null; + + public DbkImageManager(Node baseFolder) { + this.baseFolder = baseFolder; + } + + Node getImageDataNode(Node mediaObjectNode) { + try { + if (mediaObjectNode.hasNode(DbkType.imageobject.get())) { + Node imageDataNode = mediaObjectNode.getNode(DbkType.imageobject.get()) + .getNode(DbkType.imagedata.get()); + return imageDataNode; + } else { + throw new IllegalStateException("No image data found for " + mediaObjectNode); + } + } catch (RepositoryException e) { + throw new JcrException(e); + } + } + + @Override + public Binary getImageBinary(Node node) { + Node fileNode = null; + if (DbkUtils.isDbk(node, DbkType.mediaobject)) { + Node imageDataNode = getImageDataNode(node); + fileNode = getFileNode(imageDataNode); + } + try { + if (node.isNodeType(NT_FILE)) { + fileNode = node; + } + if (fileNode != null) { + return node.getNode(JCR_CONTENT).getProperty(JCR_DATA).getBinary(); + } else { + return null; + } + } catch (RepositoryException e) { + throw new JcrException(e); + } + } + + public Cms2DSize getImageSize(Node mediaObjectNode) { + Node imageDataNode = getImageDataNode(mediaObjectNode); + Node fileNode = getFileNode(imageDataNode); + if (fileNode == null) + return new Cms2DSize(0, 0); + try { + Cms2DSize intrinsicSize; + if (fileNode.hasProperty(EntityNames.SVG_WIDTH) && fileNode.hasProperty(EntityNames.SVG_HEIGHT)) { + int width = (int) fileNode.getProperty(EntityNames.SVG_WIDTH).getLong(); + int height = (int) fileNode.getProperty(EntityNames.SVG_HEIGHT).getLong(); + intrinsicSize = new Cms2DSize(width, height); + } else { + try (InputStream in = JcrUtils.getFileAsStream(fileNode)) { + ImageData id = new ImageData(in); + intrinsicSize = updateSize(fileNode, id); + } catch (IOException e) { + throw new RuntimeException("Cannot load file " + fileNode, e); + } + } + // TODO interpret image data infos + return intrinsicSize; + } catch (RepositoryException e) { + throw new JcrException(e); + } + } + + protected Cms2DSize updateSize(Node fileNode, ImageData id) throws RepositoryException { + fileNode.addMixin(EntityType.box.get()); + fileNode.setProperty(EntityNames.SVG_WIDTH, id.width); + fileNode.setProperty(EntityNames.SVG_HEIGHT, id.height); + return new Cms2DSize(id.width, id.height); + } + + @Override + protected void processNewImageFile(Node mediaObjectNode, Node fileNode, ImageData id) + throws RepositoryException, IOException { + Node imageDataNode = getImageDataNode(mediaObjectNode); + updateSize(fileNode, id); + String filePath = fileNode.getPath(); + String relPath = filePath.substring(baseFolder.getPath().length() + 1); + imageDataNode.setProperty(DbkAttr.fileref.name(), relPath); + } + + @Override + public String getImageUrl(Node mediaObjectNode) { + Node imageDataNode = getImageDataNode(mediaObjectNode); + // TODO factorise + String fileref = null; + try { + if (imageDataNode.hasProperty(DbkAttr.fileref.name())) + fileref = imageDataNode.getProperty(DbkAttr.fileref.name()).getString(); + } catch (RepositoryException e) { + throw new JcrException(e); + } + if (fileref == null) + return null; + URI fileUri; + try { + // FIXME it messes up with the '/' + fileUri = new URI(URLEncoder.encode(fileref, StandardCharsets.UTF_8.toString())); + } catch (URISyntaxException | UnsupportedEncodingException e) { + throw new IllegalArgumentException("File ref in " + imageDataNode + " is badly formatted", e); + } + if (fileUri.getScheme() != null) + return fileUri.toString(); + // local + Node fileNode = getFileNode(imageDataNode); + String url = CmsUiUtils.getDataPathForUrl(fileNode); + return url; + } + + protected Node getFileNode(Node imageDataNode) { + // FIXME make URL use case more robust + try { + String fileref = null; + if (imageDataNode.hasProperty(DbkAttr.fileref.name())) + fileref = imageDataNode.getProperty(DbkAttr.fileref.name()).getString(); + if (fileref == null) + return null; + Node fileNode; + if (fileref.startsWith("/")) + fileNode = baseFolder.getSession().getNode(fileref); + else + fileNode = baseFolder.getNode(fileref); + return fileNode; + } catch (RepositoryException e) { + throw new JcrException(e); + } + } + + protected Node getMediaFolder() { + try { + // TODO check edition status + Node mediaFolder = JcrUtils.getOrAdd(baseFolder, EntityNames.MEDIA, NodeType.NT_FOLDER); + return mediaFolder; + } catch (RepositoryException e) { + throw new JcrException("Cannot get media folder", e); + } + } +} diff --git a/org.argeo.app.ui/src/org/argeo/docbook/ui/DbkImg.java b/org.argeo.app.ui/src/org/argeo/docbook/ui/DbkImg.java new file mode 100644 index 0000000..f48c626 --- /dev/null +++ b/org.argeo.app.ui/src/org/argeo/docbook/ui/DbkImg.java @@ -0,0 +1,70 @@ +package org.argeo.docbook.ui; + +import javax.jcr.Node; +import javax.jcr.RepositoryException; + +import org.argeo.cms.swt.CmsSwtUtils; +import org.argeo.cms.ui.widgets.Img; +import org.eclipse.rap.fileupload.FileUploadEvent; +import org.eclipse.rap.fileupload.FileUploadHandler; +import org.eclipse.rap.fileupload.FileUploadListener; +import org.eclipse.rap.fileupload.FileUploadReceiver; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; + +/** DocBook specific image area. */ +public class DbkImg extends Img { + private static final long serialVersionUID = -6150996708899219074L; + + public DbkImg(Composite parent, int swtStyle, Node imgNode, DbkImageManager imageManager) + throws RepositoryException { + super(parent, swtStyle, imgNode, imageManager); + } + + @Override + protected Node getUploadFolder() { + Node mediaFolder = ((DbkImageManager) getImageManager()).getMediaFolder(); + return mediaFolder; + } + + @Override + protected String getUploadName() { + return null; + } + + @Override + protected void setContainerLayoutData(Composite composite) { + composite.setLayoutData(CmsSwtUtils.grabWidth(SWT.CENTER, SWT.DEFAULT)); + } + + @Override + protected void setControlLayoutData(Control control) { + control.setLayoutData(CmsSwtUtils.grabWidth(SWT.CENTER, SWT.DEFAULT)); + } + + @Override + protected FileUploadHandler prepareUpload(FileUploadReceiver receiver) { + FileUploadHandler fileUploadHandler = super.prepareUpload(receiver); + fileUploadHandler.addUploadListener(new FileUploadListener() { + + @Override + public void uploadProgress(FileUploadEvent event) { + // TODO Auto-generated method stub + + } + + @Override + public void uploadFinished(FileUploadEvent event) { + } + + @Override + public void uploadFailed(FileUploadEvent event) { + // TODO Auto-generated method stub + + } + }); + return fileUploadHandler; + } + +} diff --git a/org.argeo.app.ui/src/org/argeo/docbook/ui/DbkSectionTitle.java b/org.argeo.app.ui/src/org/argeo/docbook/ui/DbkSectionTitle.java new file mode 100644 index 0000000..92fd2b8 --- /dev/null +++ b/org.argeo.app.ui/src/org/argeo/docbook/ui/DbkSectionTitle.java @@ -0,0 +1,30 @@ +package org.argeo.docbook.ui; + +import javax.jcr.Node; +import javax.jcr.RepositoryException; + +import org.argeo.cms.ui.viewers.EditablePart; +import org.argeo.cms.ui.viewers.NodePart; +import org.argeo.cms.ui.widgets.EditableText; +import org.eclipse.swt.widgets.Composite; + +/** The title of a section, based on an XML text node. */ +public class DbkSectionTitle extends EditableText implements EditablePart, NodePart { + private static final long serialVersionUID = -1787983154946583171L; + + private final TextSection section; + + public DbkSectionTitle(Composite parent, int swtStyle, Node titleNode) throws RepositoryException { + super(parent, swtStyle, titleNode); + section = (TextSection) TextSection.findSection(this); + } + + public TextSection getSection() { + return section; + } + + @Override + public Node getItem() throws RepositoryException { + return getNode(); + } +} diff --git a/org.argeo.app.ui/src/org/argeo/docbook/ui/DbkTextInterpreter.java b/org.argeo.app.ui/src/org/argeo/docbook/ui/DbkTextInterpreter.java new file mode 100644 index 0000000..c853535 --- /dev/null +++ b/org.argeo.app.ui/src/org/argeo/docbook/ui/DbkTextInterpreter.java @@ -0,0 +1,283 @@ +package org.argeo.docbook.ui; + +import static org.argeo.docbook.DbkType.para; +import static org.argeo.docbook.DbkType.title; +import static org.argeo.docbook.DbkUtils.isDbk; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringReader; +import java.nio.charset.StandardCharsets; +import java.util.List; + +import javax.jcr.ImportUUIDBehavior; +import javax.jcr.Item; +import javax.jcr.Node; +import javax.jcr.NodeIterator; +import javax.jcr.Property; +import javax.jcr.PropertyIterator; +import javax.jcr.RepositoryException; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.apache.commons.io.IOUtils; +import org.argeo.docbook.DbkAttr; +import org.argeo.docbook.DbkType; +import org.argeo.jcr.Jcr; +import org.argeo.jcr.JcrException; + +/** Based on HTML with a few Wiki-like shortcuts. */ +public class DbkTextInterpreter implements TextInterpreter { + private DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + + private String linkCssClass = DbkType.link.name(); + + @Override + public void write(Item item, String content) { + try { + if (item instanceof Node) { + Node node = (Node) item; + if (isDbk(node, para) || isDbk(node, title)) { + String raw = convertToStorage(node, content); + validateBeforeStoring(raw); + + String jcrUuid = node.getIdentifier(); +// if (node.hasProperty(Property.JCR_UUID)) +// jcrUuid = node.getProperty(Property.JCR_UUID).getString(); +// else { +// // TODO use time based +// jcrUuid = UUID.randomUUID().toString(); +// node.setProperty(Property.JCR_UUID, jcrUuid); +// node.getSession().save(); +// } + + StringBuilder namespaces = new StringBuilder(); + namespaces.append(" xmlns:dbk=\"http://docbook.org/ns/docbook\""); + namespaces.append(" xmlns:jcr=\"http://www.jcp.org/jcr/1.0\""); + namespaces.append(" xmlns:xlink=\"http://www.w3.org/1999/xlink\""); + raw = "<" + node.getName() + " jcr:uuid=\"" + jcrUuid + "\"" + namespaces + ">" + raw + ""; +// System.out.println(raw); + try (InputStream in = new ByteArrayInputStream(raw.getBytes(StandardCharsets.UTF_8))) { + node.getSession().importXML(node.getParent().getPath(), in, + ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING); + // node.getSession().save(); + } catch (IOException e) { + throw new IllegalArgumentException("Cannot parse raw content of " + node, e); + } + +// try { +// DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); +// Document document; +// try (Reader in = new StringReader(raw)) { +// document = documentBuilder.parse(new InputSource(in)); +// } +// NodeList nl = document.getChildNodes(); +// for (int i = 0; i < nl.getLength(); i++) { +// org.w3c.dom.Node n = nl.item(i); +// if (node instanceof Text) { +// +// } +// } +// } catch (ParserConfigurationException | SAXException | IOException e) { +// throw new IllegalArgumentException("Cannot parse raw content of " + node, e); +// } + +// Node jcrText; +// if (!node.hasNode(Jcr.JCR_XMLTEXT)) +// jcrText = node.addNode(Jcr.JCR_XMLTEXT, JcrxType.JCRX_XMLTEXT); +// else +// jcrText = node.getNode(Jcr.JCR_XMLTEXT); +// jcrText.setProperty(Jcr.JCR_XMLCHARACTERS, raw); + } else { + throw new IllegalArgumentException("Don't know how to interpret " + node); + } + } else {// property + Property property = (Property) item; + property.setValue(content); + } + // item.getSession().save(); + } catch (RepositoryException e) { + throw new JcrException("Cannot set content on " + item, e); + } + } + + @Override + public String read(Item item) { + try { + String raw = raw(item); + return convertFromStorage(item, raw); + } catch (RepositoryException e) { + throw new JcrException("Cannot get " + item + " for edit", e); + } + } + + @Override + public String raw(Item item) { + try { + item.getSession().refresh(true); + if (item instanceof Node) { + Node node = (Node) item; + if (isDbk(node, para) || isDbk(node, title)) { + StringBuilder sb = new StringBuilder(); + readXml(node, sb); +// NodeIterator nit = node.getNodes(); +// while (nit.hasNext()) { +// Node child = nit.nextNode(); +// if (child.getName().equals(Jcr.JCR_XMLTEXT)) { +// Node jcrText = node.getNode(Jcr.JCR_XMLTEXT); +// String txt = jcrText.getProperty(Jcr.JCR_XMLCHARACTERS).getString(); +// // TODO make it more robust +// // txt = txt.replace("\n", "").replace("\t", ""); +// txt = txt.replace("\t", " "); +// sb.append(txt); +// } else { +// try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { +// child.getSession().exportDocumentView(child.getPath(), out, true, false); +// sb.append(new String(out.toByteArray(), StandardCharsets.UTF_8)); +// } catch (IOException e) { +// throw new IllegalStateException("Cannot export " + child, e); +// } +// } +// } + return sb.toString(); + } else { + throw new IllegalArgumentException("Don't know how to interpret " + node); + } + } else {// property + Property property = (Property) item; + return property.getString(); + } + } catch (RepositoryException e) { + throw new JcrException("Cannot get " + item + " content", e); + } + } + + private void readXml(Node node, StringBuilder sb) throws RepositoryException { + NodeIterator nit = node.getNodes(); + while (nit.hasNext()) { + Node child = nit.nextNode(); + if (child.getName().equals(Jcr.JCR_XMLTEXT)) { + String txt = child.getProperty(Jcr.JCR_XMLCHARACTERS).getString(); + // TODO make it more robust + // txt = txt.replace("\n", "").replace("\t", ""); + txt = txt.replace("\t", " "); + sb.append(txt); + } else { + sb.append('<').append(child.getName()); + PropertyIterator pit = child.getProperties(); + properties: while (pit.hasNext()) { + Property p = pit.nextProperty(); + if (p.getName().startsWith("jcr:")) + continue properties; + sb.append(' ').append(p.getName()).append("=\"").append(p.getString()).append('\"'); + } + sb.append('>'); + readXml(child, sb); +// try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { +// child.getSession().exportDocumentView(child.getPath(), out, true, false); +// sb.append(new String(out.toByteArray(), StandardCharsets.UTF_8)); +// } catch (IOException e) { +// throw new IllegalStateException("Cannot export " + child, e); +// } + sb.append("'); + } + } + } + + private void readAsSimpleHtml(Node node, StringBuilder sb) throws RepositoryException { + NodeIterator nit = node.getNodes(); + while (nit.hasNext()) { + Node child = nit.nextNode(); + if (child.getName().equals(Jcr.JCR_XMLTEXT)) { + String txt = child.getProperty(Jcr.JCR_XMLCHARACTERS).getString(); + // TODO make it more robust + // txt = txt.replace("\n", "").replace("\t", ""); + txt = txt.replace("\t", " "); + String html = textToSimpleHtml(txt); + sb.append(html); + } else if (child.getName().equals(DbkType.link.get())) { + if (child.hasProperty(DbkAttr.XLINK_HREF)) { + String href = child.getProperty(DbkAttr.XLINK_HREF).getString(); + // TODO deal with other forbidden XML characters? + href = href.replace("&", "&"); + sb.append(""); + readAsSimpleHtml(child, sb); + sb.append(""); + } + } else { + // ignore + } + } + } + + private String textToSimpleHtml(String raw) { + // FIXME the saved data should be corrected instead. + if (raw.indexOf('&') >= 0) { + raw = raw.replace("&", "&"); + } + if (raw.indexOf('<') >= 0) { + raw = raw.replace("<", "<"); + } + if (raw.indexOf('>') >= 0) { + raw = raw.replace(">", ">"); + } + if (raw.indexOf('\"') >= 0) { + raw = raw.replace("\"", """); + } + if (raw.indexOf('\'') >= 0) { + raw = raw.replace("\'", "'"); + } +// raw = "
" + raw + ""; + if (raw.length() == 0) + return raw; + try (StringReader reader = new StringReader(raw)) { + List lines = IOUtils.readLines(reader); + if (lines.size() == 1) + return lines.get(0); + StringBuilder sb = new StringBuilder(raw.length() + lines.size() * BR_LENGTH); + for (int i = 0; i < lines.size(); i++) { + if (i != 0) + sb.append("
"); + sb.append(lines.get(i)); + } + return sb.toString(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + final static int BR_LENGTH = "
".length(); + + public String readSimpleHtml(Item item) { + try { + StringBuilder sb = new StringBuilder(); +// sb.append("
"); + readAsSimpleHtml((Node) item, sb); +// sb.append("
"); +// System.out.println(sb); + return sb.toString(); + } catch (RepositoryException e) { + throw new JcrException("Cannot convert " + item + " to simple HTML", e); + } + } + + // EXTENSIBILITY + /** + * To be overridden, in order to make sure that only valid strings are being + * stored. + */ + protected void validateBeforeStoring(String raw) { + } + + /** To be overridden, in order to support additional formatting. */ + protected String convertToStorage(Item item, String content) throws RepositoryException { + return content; + + } + + /** To be overridden, in order to support additional formatting. */ + protected String convertFromStorage(Item item, String content) throws RepositoryException { + return content; + } +} diff --git a/org.argeo.app.ui/src/org/argeo/docbook/ui/DbkVideo.java b/org.argeo.app.ui/src/org/argeo/docbook/ui/DbkVideo.java new file mode 100644 index 0000000..ed7976a --- /dev/null +++ b/org.argeo.app.ui/src/org/argeo/docbook/ui/DbkVideo.java @@ -0,0 +1,227 @@ +package org.argeo.docbook.ui; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.List; +import java.util.Map; + +import javax.jcr.Item; +import javax.jcr.Node; +import javax.jcr.RepositoryException; + +import org.argeo.cms.swt.CmsSwtUtils; +import org.argeo.cms.swt.Selected; +import org.argeo.cms.ui.viewers.NodePart; +import org.argeo.cms.ui.viewers.Section; +import org.argeo.cms.ui.viewers.SectionPart; +import org.argeo.cms.ui.widgets.StyledControl; +import org.argeo.docbook.DbkAttr; +import org.argeo.docbook.DbkType; +import org.argeo.docbook.DbkUtils; +import org.argeo.jcr.Jcr; +import org.argeo.jcr.JcrException; +import org.argeo.util.naming.NamingUtils; +import org.eclipse.swt.SWT; +import org.eclipse.swt.browser.Browser; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Text; + +public class DbkVideo extends StyledControl implements SectionPart, NodePart { + private static final long serialVersionUID = -8753232181570351880L; + private Section section; + + private int width = 640; + private int height = 360; + + private boolean editable; + + public DbkVideo(Composite parent, int style, Node node) { + this(Section.findSection(parent), parent, style, node); + } + + DbkVideo(Section section, Composite parent, int style, Node node) { + super(parent, style, node); + editable = !(SWT.READ_ONLY == (style & SWT.READ_ONLY)); + this.section = section; + setStyle(DbkType.videoobject.name()); + } + + @Override + protected Control createControl(Composite box, String style) { + Node mediaobject = getNode(); + Composite wrapper = new Composite(box, SWT.NONE); + wrapper.setLayout(CmsSwtUtils.noSpaceGridLayout()); + + Composite browserC = new Composite(wrapper, SWT.NONE); + browserC.setLayout(CmsSwtUtils.noSpaceGridLayout()); + GridData gd = new GridData(SWT.CENTER, SWT.FILL, true, true); + gd.widthHint = getWidth(); + gd.heightHint = getHeight(); + browserC.setLayoutData(gd); +// wrapper.setLayoutData(CmsUiUtils.fillAll()); + Browser browser = new Browser(browserC, SWT.NONE); + + if (editable) { + 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); + Text text = new Text(editor, SWT.SINGLE); + if (fileref != null) + text.setText(fileref); + else + text.setMessage("Embed URL of the video"); + text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + Button updateB = new Button(editor, SWT.FLAT); + updateB.setText("Update"); + updateB.addSelectionListener(new Selected() { + + @Override + public void widgetSelected(SelectionEvent e) { + try { + Node videodata = mediaobject.getNode(DbkType.videoobject.get()) + .getNode(DbkType.videodata.get()); + String txt = text.getText(); + URI uri; + try { + uri = new URI(txt); + } catch (URISyntaxException e1) { + text.setText(""); + text.setMessage("Invalid URL"); + return; + } + + // Transform watch URL in embed + // YouTube + String videoId = null; + if ("www.youtube.com".equals(uri.getHost()) || "youtube.com".equals(uri.getHost()) + || "youtu.be".equals(uri.getHost())) { + if ("www.youtube.com".equals(uri.getHost()) || "youtube.com".equals(uri.getHost())) { + if ("/watch".equals(uri.getPath())) { + Map> map = NamingUtils.queryToMap(uri); + videoId = map.get("v").get(0); + } + } else if ("youtu.be".equals(uri.getHost())) { + videoId = uri.getPath().substring(1); + } + if (videoId != null) { + try { + uri = new URI("https://www.youtube.com/embed/" + videoId); + text.setText(uri.toString()); + } catch (URISyntaxException e1) { + throw new IllegalStateException(e1); + } + } + } + + // Vimeo + if ("vimeo.com".equals(uri.getHost())) { + videoId = uri.getPath().substring(1); + if (videoId != null) { + try { + uri = new URI("https://player.vimeo.com/video/" + videoId); + text.setText(uri.toString()); + } catch (URISyntaxException e1) { + throw new IllegalStateException(e1); + } + } + } + + videodata.setProperty(DbkAttr.fileref.name(), uri.toString()); + // TODO better integrate it in the edition lifecycle + videodata.getSession().save(); + load(browser); + } catch (RepositoryException e1) { + throw new JcrException("Cannot update " + mediaobject, e1); + } + + } + }); + + Button deleteB = new Button(editor, SWT.FLAT); + deleteB.setText("Delete"); + deleteB.addSelectionListener(new Selected() { + + @Override + public void widgetSelected(SelectionEvent e) { + try { + mediaobject.remove(); + mediaobject.getSession().save(); + dispose(); + getSection().getParent().layout(true, true); + } catch (RepositoryException e1) { + throw new JcrException("Cannot update " + mediaobject, e1); + } + + } + }); + } + + // TODO caption + return browser; + } + + public void load(Control control) { + try { + if (control instanceof Browser) { + Browser browser = (Browser) control; + getNode().getSession(); + String fileref = DbkUtils.getMediaFileref(getNode()); + if (fileref != null) { + // TODO manage self-hosted videos + // TODO for YouTube videos, check whether the URL starts with + // https://www.youtube.com/embed/ and not https://www.youtube.com/watch?v= + StringBuilder html = new StringBuilder(); + html.append( + "