Commit 31efefbc authored by Brian Long's avatar Brian Long
Browse files

Merge branch 'develop' into stable

parents 3322901c f7d74a08
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -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>
+17 −1
Original line number Diff line number Diff line
@@ -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 {
    
@@ -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;

@@ -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();
    }

+73 −8
Original line number Diff line number Diff line
@@ -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;
@@ -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());
@@ -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());
@@ -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());
@@ -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());