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);