diff --git a/pom.xml b/pom.xml index d408d15..efe9939 100644 --- a/pom.xml +++ b/pom.xml @@ -34,36 +34,27 @@ 1.8 3.6.3 - 2.34 + 2.35 com.inteligr8.alfresco aps-public-rest-api - 1.2.3 + 2.0.0 aps1 + + com.inteligr8.alfresco + aps-public-rest-client + 2.0.0 + jersey + org.apache.commons commons-lang3 3.4 - - org.glassfish.jersey.ext - jersey-proxy-client - ${jersey.version} - - - org.glassfish.jersey.core - jersey-client - ${jersey.version} - - - org.glassfish.jersey.media - jersey-media-multipart - ${jersey.version} - org.glassfish.jersey.inject jersey-hk2 diff --git a/src/main/java/com/inteligr8/maven/aps/modeling/goal/ApsAddressibleGoal.java b/src/main/java/com/inteligr8/maven/aps/modeling/goal/ApsAddressibleGoal.java index 6393015..896fca5 100644 --- a/src/main/java/com/inteligr8/maven/aps/modeling/goal/ApsAddressibleGoal.java +++ b/src/main/java/com/inteligr8/maven/aps/modeling/goal/ApsAddressibleGoal.java @@ -4,7 +4,7 @@ import org.apache.maven.execution.MavenSession; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.settings.Server; -import com.inteligr8.alfresco.activiti.ApsClientConfiguration; +import com.inteligr8.alfresco.activiti.ApsClientJerseyConfiguration; import com.inteligr8.alfresco.activiti.ApsClientJerseyImpl; import com.inteligr8.alfresco.activiti.ApsPublicRestApiJerseyImpl; @@ -36,9 +36,9 @@ public abstract class ApsAddressibleGoal extends DisablableGoal { private ApsPublicRestApiJerseyImpl api; - public ApsClientConfiguration getApsClientConfiguration() { + public ApsClientJerseyConfiguration getApsClientConfiguration() { this.getLog().debug("Configuring APS to URL: " + this.activitiAppBaseUrl); - ApsClientConfiguration config = new ApsClientConfiguration(); + ApsClientJerseyConfiguration config = new ApsClientJerseyConfiguration(); config.setBaseUrl(this.activitiAppBaseUrl); switch (this.activitiAppAuthType.toUpperCase()) { case "BASIC": @@ -88,7 +88,7 @@ public abstract class ApsAddressibleGoal extends DisablableGoal { public synchronized ApsPublicRestApiJerseyImpl getApsApi() { if (this.api == null) { - ApsClientConfiguration config = this.getApsClientConfiguration(); + ApsClientJerseyConfiguration config = this.getApsClientConfiguration(); ApsClientJerseyImpl apsClient = new ApsClientJerseyImpl(config); this.api = new ApsPublicRestApiJerseyImpl(apsClient); } diff --git a/src/main/java/com/inteligr8/maven/aps/modeling/translator/ApsAppJsonTranslator.java b/src/main/java/com/inteligr8/maven/aps/modeling/translator/ApsAppJsonTranslator.java index 95eccca..78862a9 100644 --- a/src/main/java/com/inteligr8/maven/aps/modeling/translator/ApsAppJsonTranslator.java +++ b/src/main/java/com/inteligr8/maven/aps/modeling/translator/ApsAppJsonTranslator.java @@ -9,25 +9,26 @@ import org.slf4j.LoggerFactory; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; -import com.inteligr8.alfresco.activiti.model.Group; +import com.inteligr8.alfresco.activiti.ApsPublicRestApi; +import com.inteligr8.alfresco.activiti.model.GroupLight; import com.inteligr8.maven.aps.modeling.util.Index; import com.inteligr8.maven.aps.modeling.util.ModelUtil; -public class ApsAppJsonTranslator implements ApsFileTranslator { +public class ApsAppJsonTranslator extends ApsOrganizationHandler implements ApsFileTranslator { private final Logger logger = LoggerFactory.getLogger(ApsAppJsonTranslator.class); - - private Map apsOrgIndex; - private Index apsProcessIndex; - private Index fileProcessIndex; + private final Map apsOrgIndex; + private final Index apsProcessIndex; + private final Index fileProcessIndex; public ApsAppJsonTranslator( - Map apsOrgIndex, + ApsPublicRestApi api, + Map apsOrgIndex, Index apsProcessIndex, Index fileProcessIndex) { + super(api, apsOrgIndex); this.apsOrgIndex = apsOrgIndex; this.apsProcessIndex = apsProcessIndex; - this.fileProcessIndex = fileProcessIndex; } @@ -84,11 +85,16 @@ public class ApsAppJsonTranslator implements ApsFileTranslator { if (this.apsOrgIndex.containsKey(fileOrgName)) { long fileOrgId = jsonGroup.get("id").asLong(); - long apsOrgId = this.apsOrgIndex.get(fileOrgName).getId(); + GroupLight apsOrg = this.apsOrgIndex.get(fileOrgName); - if (fileOrgId != apsOrgId) { - this.logger.debug("The organization '{}' exists in APS with ID {}; changing descriptor", fileOrgName, apsOrgId); - jsonGroup.put("id", apsOrgId); + if (apsOrg == null) { + this.logger.debug("The organization '{}' does not exist in APS; adding to APS", fileOrgName); + long apsGroupId = this.createOrganization(fileOrgName); + jsonGroup.put("id", apsGroupId); + changed = true; + } else if (fileOrgId != apsOrg.getId()) { + this.logger.debug("The organization '{}' exists in APS with ID {}; changing descriptor", fileOrgName, apsOrg.getId()); + jsonGroup.put("id", apsOrg.getId()); changed = true; } else { this.logger.trace("The organization '{}' ID does not change; leaving unchanged", fileOrgName); diff --git a/src/main/java/com/inteligr8/maven/aps/modeling/translator/ApsAppTranslator.java b/src/main/java/com/inteligr8/maven/aps/modeling/translator/ApsAppTranslator.java index 3c0c363..6fe46d3 100644 --- a/src/main/java/com/inteligr8/maven/aps/modeling/translator/ApsAppTranslator.java +++ b/src/main/java/com/inteligr8/maven/aps/modeling/translator/ApsAppTranslator.java @@ -16,7 +16,7 @@ import com.inteligr8.alfresco.activiti.ApsPublicRestApi; import com.inteligr8.alfresco.activiti.ApsPublicRestApiJerseyImpl; import com.inteligr8.alfresco.activiti.api.ModelsApi.ModelType; import com.inteligr8.alfresco.activiti.model.Datum; -import com.inteligr8.alfresco.activiti.model.Group; +import com.inteligr8.alfresco.activiti.model.GroupLight; import com.inteligr8.alfresco.activiti.model.ResultListDataRepresentation; import com.inteligr8.alfresco.activiti.model.Tenant; import com.inteligr8.maven.aps.modeling.crawler.ApsAppCrawlable; @@ -31,7 +31,7 @@ public class ApsAppTranslator implements ApsAppCrawlable { private final File appDirectory; private boolean indexesBuilt = false; - private Map apsOrgIndex; + private Map apsOrgIndex; private Index apsFormIndex; private Index apsProcessIndex; private Index fileFormIndex; @@ -95,6 +95,7 @@ public class ApsAppTranslator implements ApsAppCrawlable { throw new IllegalStateException("The indexes are never built"); return new ApsAppJsonTranslator( + this.api, this.apsOrgIndex, this.apsProcessIndex, this.fileProcessIndex); @@ -115,6 +116,7 @@ public class ApsAppTranslator implements ApsAppCrawlable { throw new IllegalStateException("The indexes are never built"); return new ApsProcessJsonTranslator( + this.api, this.apsProcessIndex, this.apsOrgIndex, this.apsFormIndex); @@ -126,6 +128,7 @@ public class ApsAppTranslator implements ApsAppCrawlable { throw new IllegalStateException("The indexes are never built"); return new ApsProcessBpmnTranslator( + this.api, this.apsProcessIndex, this.apsOrgIndex, this.apsFormIndex, @@ -137,11 +140,11 @@ public class ApsAppTranslator implements ApsAppCrawlable { return (tenants == null || tenants.isEmpty()) ? null : tenants.iterator().next().getId(); } - protected Map buildApsGroupMap(long tenantId) { - List groups = this.api.getAdminApi().getGroups(tenantId, true, true); + protected Map buildApsGroupMap(long tenantId) { + List groups = this.api.getAdminApi().getGroups(tenantId, true, true); - Map map = new HashMap<>(groups.size()); - for (Group group : groups) + Map map = new HashMap<>(groups.size()); + for (GroupLight group : groups) map.put(group.getName(), group); return map; } diff --git a/src/main/java/com/inteligr8/maven/aps/modeling/translator/ApsOrganizationHandler.java b/src/main/java/com/inteligr8/maven/aps/modeling/translator/ApsOrganizationHandler.java new file mode 100644 index 0000000..f28fe09 --- /dev/null +++ b/src/main/java/com/inteligr8/maven/aps/modeling/translator/ApsOrganizationHandler.java @@ -0,0 +1,35 @@ +package com.inteligr8.maven.aps.modeling.translator; + +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.inteligr8.alfresco.activiti.ApsPublicRestApi; +import com.inteligr8.alfresco.activiti.model.Group; +import com.inteligr8.alfresco.activiti.model.GroupLight; + +public class ApsOrganizationHandler { + + private final Logger logger = LoggerFactory.getLogger(ApsOrganizationHandler.class); + private final ApsPublicRestApi api; + private final Map apsOrgIndex; + + public ApsOrganizationHandler( + ApsPublicRestApi api, + Map apsOrgIndex) { + this.api = api; + this.apsOrgIndex = apsOrgIndex; + } + + protected long createOrganization(String groupName) { + this.logger.info("Creating organization '{}' in APS", groupName); + + GroupLight group = this.api.getAdminApi().createGroup(new Group() + .withName(groupName) + .withType(1L)); // an organization, not capability + this.apsOrgIndex.put(groupName, group); + return group.getId(); + } + +} diff --git a/src/main/java/com/inteligr8/maven/aps/modeling/translator/ApsProcessBpmnTranslator.java b/src/main/java/com/inteligr8/maven/aps/modeling/translator/ApsProcessBpmnTranslator.java index 456f74a..5e7083a 100644 --- a/src/main/java/com/inteligr8/maven/aps/modeling/translator/ApsProcessBpmnTranslator.java +++ b/src/main/java/com/inteligr8/maven/aps/modeling/translator/ApsProcessBpmnTranslator.java @@ -22,30 +22,32 @@ import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; -import com.inteligr8.alfresco.activiti.model.Group; +import com.inteligr8.alfresco.activiti.ApsPublicRestApi; +import com.inteligr8.alfresco.activiti.model.GroupLight; import com.inteligr8.maven.aps.modeling.util.Index; import com.inteligr8.maven.aps.modeling.util.ModelUtil; -public class ApsProcessBpmnTranslator implements ApsFileTranslator { +public class ApsProcessBpmnTranslator extends ApsOrganizationHandler implements ApsFileTranslator { private static final String NAMESPACE_ACTIVITI = "http://activiti.org/bpmn"; private static final String NAMESPACE_ACTIVITI_MODELER = "http://activiti.com/modeler"; private final Logger logger = LoggerFactory.getLogger(ApsProcessBpmnTranslator.class); private final Index apsIndex; - private final Map apsOrgIndex; + private final Map apsOrgIndex; private final Index apsFormIndex; private final Index fileFormIndex; public ApsProcessBpmnTranslator( + ApsPublicRestApi api, Index apsProcessIndex, - Map apsOrgIndex, + Map apsOrgIndex, Index apsFormIndex, Index fileFormIndex) { + super(api, apsOrgIndex); this.apsIndex = apsProcessIndex; this.apsOrgIndex = apsOrgIndex; this.apsFormIndex = apsFormIndex; - this.fileFormIndex = fileFormIndex; } @@ -141,22 +143,26 @@ public class ApsProcessBpmnTranslator implements ApsFileTranslator { String groupName = groupNameElement.getTextContent().trim(); this.logger.trace("Found '{}' candidate group in the APS Process BPMN model", groupName); - if (this.apsOrgIndex.containsKey(groupName)) { - long apsOrgId = this.apsOrgIndex.get(groupName).getId(); - groupIdsList.add(apsOrgId); - - if (apsOrgId != orgId) { - this.logger.debug("The organization '{}' exists in APS with ID {}; changing model", groupName, apsOrgId); - groupNameElement = (Element)groupNameElement.getOwnerDocument().renameNode(groupNameElement, - groupNameElement.getNamespaceURI(), "modeler:group-info-name-" + apsOrgId); - changed = true; - } else { - this.logger.trace("The organization '{}' ID does not change; leaving unchanged", groupName); - } + GroupLight apsOrg = this.apsOrgIndex.get(groupName); + long apsOrgId = 0L; + if (apsOrg == null) { + this.logger.debug("The organization '{}' does not exist in APS; creating it ...", groupName); + apsOrgId = this.createOrganization(groupName); } else { - // FIXME automatically add the group? - this.logger.debug("The organization '{}' does not exist in APS; leaving unchanged", groupName); - groupIdsList.add(orgId); + apsOrgId = apsOrg.getId(); + } + + if (apsOrgId != orgId) { + this.logger.debug("The organization '{}' exists in APS with ID {}; changing model", groupName, apsOrgId); + groupNameElement = (Element)groupNameElement.getOwnerDocument().renameNode(groupNameElement, + groupNameElement.getNamespaceURI(), "modeler:group-info-name-" + apsOrgId); + + groupIdsList.add(apsOrgId); + changed = true; + } else { + this.logger.trace("The organization '{}' ID does not change; leaving unchanged", groupName); + + groupIdsList.add(apsOrgId); } } diff --git a/src/main/java/com/inteligr8/maven/aps/modeling/translator/ApsProcessJsonTranslator.java b/src/main/java/com/inteligr8/maven/aps/modeling/translator/ApsProcessJsonTranslator.java index 9c0175e..ef527de 100644 --- a/src/main/java/com/inteligr8/maven/aps/modeling/translator/ApsProcessJsonTranslator.java +++ b/src/main/java/com/inteligr8/maven/aps/modeling/translator/ApsProcessJsonTranslator.java @@ -10,21 +10,24 @@ import org.slf4j.LoggerFactory; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; -import com.inteligr8.alfresco.activiti.model.Group; +import com.inteligr8.alfresco.activiti.ApsPublicRestApi; +import com.inteligr8.alfresco.activiti.model.GroupLight; import com.inteligr8.maven.aps.modeling.util.Index; import com.inteligr8.maven.aps.modeling.util.ModelUtil; -public class ApsProcessJsonTranslator implements ApsFileTranslator { +public class ApsProcessJsonTranslator extends ApsOrganizationHandler implements ApsFileTranslator { private final Logger logger = LoggerFactory.getLogger(ApsProcessJsonTranslator.class); private final Index apsIndex; - private final Map apsOrgIndex; + private final Map apsOrgIndex; private final Index apsFormIndex; public ApsProcessJsonTranslator( + ApsPublicRestApi api, Index apsProcessIndex, - Map apsOrgIndex, + Map apsOrgIndex, Index apsFormIndex) { + super(api, apsOrgIndex); this.apsIndex = apsProcessIndex; this.apsOrgIndex = apsOrgIndex; this.apsFormIndex = apsFormIndex; @@ -107,10 +110,16 @@ public class ApsProcessJsonTranslator implements ApsFileTranslator { if (this.apsOrgIndex.containsKey(fileOrgName)) { long fileOrgId = jsonCandidateGroup.get("id").asLong(); - long apsOrgId = this.apsOrgIndex.get(fileOrgName).getId(); - if (apsOrgId != fileOrgId) { - this.logger.debug("The organization '{}' exists in APS with ID {}; changing descriptor", fileOrgName, apsOrgId); - jsonCandidateGroup.put("id", apsOrgId); + GroupLight apsOrg = this.apsOrgIndex.get(fileOrgName); + + if (apsOrg == null) { + this.logger.debug("The organization '{}' does not exist in APS; adding to APS", fileOrgName); + long apsGroupId = this.createOrganization(fileOrgName); + jsonCandidateGroup.put("id", apsGroupId); + return true; + } else if (apsOrg.getId() != fileOrgId) { + this.logger.debug("The organization '{}' exists in APS with ID {}; changing descriptor", fileOrgName, apsOrg.getId()); + jsonCandidateGroup.put("id", apsOrg.getId()); return true; } else { this.logger.trace("The organization '{}' ID does not change; leaving unchanged", fileOrgName);