Loading pom.xml +4 −4 Original line number Diff line number Diff line Loading @@ -39,11 +39,11 @@ <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <maven.compiler.release>11</maven.compiler.release> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <maven.compiler.release>17</maven.compiler.release> <aps.version>2.4.1</aps.version> <aps.version>2.4.4</aps.version> </properties> <dependencies> Loading src/main/java/com/inteligr8/alfresco/activiti/share/ModelShareExtension.java +17 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,10 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import com.activiti.domain.idm.User; import com.activiti.security.SecurityUtils; import com.activiti.service.api.UserService; @Component public class ModelShareExtension implements Bootstrappable { Loading @@ -29,6 +33,12 @@ public class ModelShareExtension implements Bootstrappable { @Autowired private ModelShareWorker worker; @Autowired private UserService userService; @Value("${inteligr8.modelShareExtension.runAs:admin@app.activiti.com}") private String runAsUser; @Value("${inteligr8.modelShareExtension.enabled:true}") private boolean enabled; Loading Loading @@ -60,6 +70,12 @@ public class ModelShareExtension implements Bootstrappable { return; this.logger.trace("scheduled()"); this.logger.debug("Assuming user: {}", this.runAsUser); User runAsUser = this.userService.findUserByEmail(this.runAsUser); SecurityUtils.assumeUser(runAsUser); this.logger.debug("Assumed user: {}", runAsUser.getId()); this.worker.shareAllModels(); } Loading src/main/java/com/inteligr8/alfresco/activiti/share/ModelShareWorker.java +73 −8 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Component; import com.activiti.domain.editor.AbstractModel; import com.activiti.domain.editor.Model; import com.activiti.domain.editor.ModelShareInfo; import com.activiti.domain.editor.SharePermission; Loading Loading @@ -214,20 +215,80 @@ public class ModelShareWorker implements Bootstrappable { } public void shareAllModels(Long tenantId) { this.logger.trace("Discovering models in tenant {} ...", this.tenantId); this.shareApsFormModels(); this.shareApsDataModels(); this.shareApsDecisionTableModels(); this.shareApsProcessModels(); this.shareApsAppModels(); this.shareAllActivitiModels(tenantId); } private void shareApsFormModels() { this.logger.trace("Discovering APS form models"); List<AbstractModel> models = this.modelService.getModelsByModelTypeAndReferenceId(Model.MODEL_TYPE_FORM, null); for (AbstractModel model : models) { this.logger.debug("Discovered APS form model: {} [{}]", model.getName(), model.getId()); this.shareModel((Model) model); } } private void shareApsDataModels() { this.logger.trace("Discovering APS data models"); List<AbstractModel> models = this.modelService.getModelsByModelTypeAndReferenceId(Model.MODEL_TYPE_DATA_MODEL, null); for (AbstractModel model : models) { this.logger.debug("Discovered APS data model: {} [{}]", model.getName(), model.getId()); this.shareModel((Model) model); } } private void shareApsDecisionTableModels() { this.logger.trace("Discovering APS decision table models"); List<AbstractModel> models = this.modelService.getModelsByModelTypeAndReferenceId(Model.MODEL_TYPE_DECISION_TABLE, null); for (AbstractModel model : models) { this.logger.debug("Discovered APS decision table model: {} [{}]", model.getName(), model.getId()); this.shareModel((Model) model); } } private void shareApsProcessModels() { this.logger.trace("Discovering APS process models"); List<AbstractModel> models = this.modelService.getModelsByModelTypeAndReferenceId(Model.MODEL_TYPE_BPMN, null); for (AbstractModel model : models) { this.logger.debug("Discovered APS process model: {} [{}]", model.getName(), model.getId()); this.shareModel((Model) model); } } private void shareApsAppModels() { this.logger.trace("Discovering APS app models"); List<AbstractModel> models = this.modelService.getModelsByModelTypeAndReferenceId(Model.MODEL_TYPE_APP, null); for (AbstractModel model : models) { this.logger.debug("Discovered APS app model: {} [{}]", model.getName(), model.getId()); this.shareModel((Model) model); } } private void shareAllActivitiModels(Long tenantId) { this.logger.trace("Discovering activiti models in tenant {} ...", tenantId); long modelCount = 0L; int page = 1; int perPage = this.modelChunkSize; ModelQuery query = this.services.getRepositoryService().createModelQuery().latestVersion(); ModelQuery query = this.services.getRepositoryService().createModelQuery() .latestVersion(); if (tenantId != null) query.modelTenantId(String.valueOf(tenantId)); else query.modelWithoutTenantId(); this.logger.trace("Discovering activiti models with page size: {}", perPage); List<org.activiti.engine.repository.Model> models = query.listPage((page-1)*perPage, perPage); if (models.isEmpty()) { this.logger.debug("procDef counts: {}", this.services.getRepositoryService().createProcessDefinitionQuery().latestVersion().count()); } while (!models.isEmpty()) { this.logger.trace("Fetched page #{} of {} models in tenant {}", page, models.size(), this.tenantId); this.logger.trace("Fetched page #{} of {} activiti models in tenant {}", page, models.size(), tenantId); for (org.activiti.engine.repository.Model model : models) { this.logger.debug("Discovered model: {}: {}: {}", model.getCategory(), model.getId(), model.getName()); Loading @@ -239,15 +300,19 @@ public class ModelShareWorker implements Bootstrappable { models = query.listPage((page-1)*perPage, perPage); } this.logger.trace("Discovered {} models in tenant {}", modelCount, this.tenantId); this.logger.trace("Discovered {} activiti models in tenant {}", modelCount, tenantId); } public void shareModel(org.activiti.engine.repository.Model orgModel) { Model model = (Model) this.modelService.getModel(Long.valueOf(orgModel.getId())); this.shareModel(model); } public void shareModel(Model model) { Map<HashableGroup, SharePermission> shares = this.fetchCurrentModelShares(model); switch (model.getModelType()) { case 3: case Model.MODEL_TYPE_APP: for (Entry<HashableGroup, SharePermission> group : this.groups.entrySet()) { if (this.appDefsGroups.containsKey(group.getKey())) { this.logger.trace("The default group permission is overridden by the app group permission: {}", group.getKey()); Loading @@ -258,7 +323,7 @@ public class ModelShareWorker implements Bootstrappable { for (Entry<HashableGroup, SharePermission> group : this.appDefsGroups.entrySet()) this.share(shares, model, group.getKey(), group.getValue()); break; case 0: case Model.MODEL_TYPE_BPMN: for (Entry<HashableGroup, SharePermission> group : this.groups.entrySet()) { if (this.processDefsGroups.containsKey(group.getKey())) { this.logger.trace("The default group permission is overridden by the app group permission: {}", group.getKey()); Loading @@ -269,7 +334,7 @@ public class ModelShareWorker implements Bootstrappable { for (Entry<HashableGroup, SharePermission> group : this.processDefsGroups.entrySet()) this.share(shares, model, group.getKey(), group.getValue()); break; case 1: case Model.MODEL_TYPE_FORM: for (Entry<HashableGroup, SharePermission> group : this.groups.entrySet()) { if (this.formDefsGroups.containsKey(group.getKey())) { this.logger.trace("The default group permission is overridden by the app group permission: {}", group.getKey()); Loading Loading
pom.xml +4 −4 Original line number Diff line number Diff line Loading @@ -39,11 +39,11 @@ <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <maven.compiler.release>11</maven.compiler.release> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <maven.compiler.release>17</maven.compiler.release> <aps.version>2.4.1</aps.version> <aps.version>2.4.4</aps.version> </properties> <dependencies> Loading
src/main/java/com/inteligr8/alfresco/activiti/share/ModelShareExtension.java +17 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,10 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import com.activiti.domain.idm.User; import com.activiti.security.SecurityUtils; import com.activiti.service.api.UserService; @Component public class ModelShareExtension implements Bootstrappable { Loading @@ -29,6 +33,12 @@ public class ModelShareExtension implements Bootstrappable { @Autowired private ModelShareWorker worker; @Autowired private UserService userService; @Value("${inteligr8.modelShareExtension.runAs:admin@app.activiti.com}") private String runAsUser; @Value("${inteligr8.modelShareExtension.enabled:true}") private boolean enabled; Loading Loading @@ -60,6 +70,12 @@ public class ModelShareExtension implements Bootstrappable { return; this.logger.trace("scheduled()"); this.logger.debug("Assuming user: {}", this.runAsUser); User runAsUser = this.userService.findUserByEmail(this.runAsUser); SecurityUtils.assumeUser(runAsUser); this.logger.debug("Assumed user: {}", runAsUser.getId()); this.worker.shareAllModels(); } Loading
src/main/java/com/inteligr8/alfresco/activiti/share/ModelShareWorker.java +73 −8 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Component; import com.activiti.domain.editor.AbstractModel; import com.activiti.domain.editor.Model; import com.activiti.domain.editor.ModelShareInfo; import com.activiti.domain.editor.SharePermission; Loading Loading @@ -214,20 +215,80 @@ public class ModelShareWorker implements Bootstrappable { } public void shareAllModels(Long tenantId) { this.logger.trace("Discovering models in tenant {} ...", this.tenantId); this.shareApsFormModels(); this.shareApsDataModels(); this.shareApsDecisionTableModels(); this.shareApsProcessModels(); this.shareApsAppModels(); this.shareAllActivitiModels(tenantId); } private void shareApsFormModels() { this.logger.trace("Discovering APS form models"); List<AbstractModel> models = this.modelService.getModelsByModelTypeAndReferenceId(Model.MODEL_TYPE_FORM, null); for (AbstractModel model : models) { this.logger.debug("Discovered APS form model: {} [{}]", model.getName(), model.getId()); this.shareModel((Model) model); } } private void shareApsDataModels() { this.logger.trace("Discovering APS data models"); List<AbstractModel> models = this.modelService.getModelsByModelTypeAndReferenceId(Model.MODEL_TYPE_DATA_MODEL, null); for (AbstractModel model : models) { this.logger.debug("Discovered APS data model: {} [{}]", model.getName(), model.getId()); this.shareModel((Model) model); } } private void shareApsDecisionTableModels() { this.logger.trace("Discovering APS decision table models"); List<AbstractModel> models = this.modelService.getModelsByModelTypeAndReferenceId(Model.MODEL_TYPE_DECISION_TABLE, null); for (AbstractModel model : models) { this.logger.debug("Discovered APS decision table model: {} [{}]", model.getName(), model.getId()); this.shareModel((Model) model); } } private void shareApsProcessModels() { this.logger.trace("Discovering APS process models"); List<AbstractModel> models = this.modelService.getModelsByModelTypeAndReferenceId(Model.MODEL_TYPE_BPMN, null); for (AbstractModel model : models) { this.logger.debug("Discovered APS process model: {} [{}]", model.getName(), model.getId()); this.shareModel((Model) model); } } private void shareApsAppModels() { this.logger.trace("Discovering APS app models"); List<AbstractModel> models = this.modelService.getModelsByModelTypeAndReferenceId(Model.MODEL_TYPE_APP, null); for (AbstractModel model : models) { this.logger.debug("Discovered APS app model: {} [{}]", model.getName(), model.getId()); this.shareModel((Model) model); } } private void shareAllActivitiModels(Long tenantId) { this.logger.trace("Discovering activiti models in tenant {} ...", tenantId); long modelCount = 0L; int page = 1; int perPage = this.modelChunkSize; ModelQuery query = this.services.getRepositoryService().createModelQuery().latestVersion(); ModelQuery query = this.services.getRepositoryService().createModelQuery() .latestVersion(); if (tenantId != null) query.modelTenantId(String.valueOf(tenantId)); else query.modelWithoutTenantId(); this.logger.trace("Discovering activiti models with page size: {}", perPage); List<org.activiti.engine.repository.Model> models = query.listPage((page-1)*perPage, perPage); if (models.isEmpty()) { this.logger.debug("procDef counts: {}", this.services.getRepositoryService().createProcessDefinitionQuery().latestVersion().count()); } while (!models.isEmpty()) { this.logger.trace("Fetched page #{} of {} models in tenant {}", page, models.size(), this.tenantId); this.logger.trace("Fetched page #{} of {} activiti models in tenant {}", page, models.size(), tenantId); for (org.activiti.engine.repository.Model model : models) { this.logger.debug("Discovered model: {}: {}: {}", model.getCategory(), model.getId(), model.getName()); Loading @@ -239,15 +300,19 @@ public class ModelShareWorker implements Bootstrappable { models = query.listPage((page-1)*perPage, perPage); } this.logger.trace("Discovered {} models in tenant {}", modelCount, this.tenantId); this.logger.trace("Discovered {} activiti models in tenant {}", modelCount, tenantId); } public void shareModel(org.activiti.engine.repository.Model orgModel) { Model model = (Model) this.modelService.getModel(Long.valueOf(orgModel.getId())); this.shareModel(model); } public void shareModel(Model model) { Map<HashableGroup, SharePermission> shares = this.fetchCurrentModelShares(model); switch (model.getModelType()) { case 3: case Model.MODEL_TYPE_APP: for (Entry<HashableGroup, SharePermission> group : this.groups.entrySet()) { if (this.appDefsGroups.containsKey(group.getKey())) { this.logger.trace("The default group permission is overridden by the app group permission: {}", group.getKey()); Loading @@ -258,7 +323,7 @@ public class ModelShareWorker implements Bootstrappable { for (Entry<HashableGroup, SharePermission> group : this.appDefsGroups.entrySet()) this.share(shares, model, group.getKey(), group.getValue()); break; case 0: case Model.MODEL_TYPE_BPMN: for (Entry<HashableGroup, SharePermission> group : this.groups.entrySet()) { if (this.processDefsGroups.containsKey(group.getKey())) { this.logger.trace("The default group permission is overridden by the app group permission: {}", group.getKey()); Loading @@ -269,7 +334,7 @@ public class ModelShareWorker implements Bootstrappable { for (Entry<HashableGroup, SharePermission> group : this.processDefsGroups.entrySet()) this.share(shares, model, group.getKey(), group.getValue()); break; case 1: case Model.MODEL_TYPE_FORM: for (Entry<HashableGroup, SharePermission> group : this.groups.entrySet()) { if (this.formDefsGroups.containsKey(group.getKey())) { this.logger.trace("The default group permission is overridden by the app group permission: {}", group.getKey()); Loading