|
|
|
@@ -25,6 +25,7 @@ import java.util.Map.Entry;
|
|
|
|
|
import java.util.Set;
|
|
|
|
|
|
|
|
|
|
import org.activiti.engine.ProcessEngine;
|
|
|
|
|
import org.activiti.engine.repository.ModelQuery;
|
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
import org.slf4j.Logger;
|
|
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
@@ -34,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;
|
|
|
|
@@ -206,36 +208,110 @@ public class ModelShareWorker implements Bootstrappable {
|
|
|
|
|
map.put(key, value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void share() {
|
|
|
|
|
this.logger.trace("Discovering models ...");
|
|
|
|
|
public void shareAllModels() {
|
|
|
|
|
this.shareApsFormModels();
|
|
|
|
|
this.shareApsDataModels();
|
|
|
|
|
this.shareApsDecisionTableModels();
|
|
|
|
|
this.shareApsProcessModels();
|
|
|
|
|
this.shareApsAppModels();
|
|
|
|
|
|
|
|
|
|
if (this.tenantId != null) {
|
|
|
|
|
this.shareAllActivitiModels(this.tenantId);
|
|
|
|
|
} else {
|
|
|
|
|
this.shareAllActivitiModels(null);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
List<org.activiti.engine.repository.Model> models = this.services.getRepositoryService().createModelQuery().listPage((page-1)*perPage, perPage);
|
|
|
|
|
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("No activiti models; procDef count: {}", this.services.getRepositoryService().createProcessDefinitionQuery().latestVersion().count());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
while (!models.isEmpty()) {
|
|
|
|
|
this.logger.trace("Fetched page #{} of {} models", page, models.size());
|
|
|
|
|
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());
|
|
|
|
|
this.share(model);
|
|
|
|
|
this.shareModel(model);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
modelCount += models.size();
|
|
|
|
|
page++;
|
|
|
|
|
models = this.services.getRepositoryService().createModelQuery().listPage((page-1)*perPage, perPage);
|
|
|
|
|
models = query.listPage((page-1)*perPage, perPage);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.logger.trace("Discovered {} models", modelCount);
|
|
|
|
|
this.logger.trace("Discovered {} activiti models in tenant {}", modelCount, tenantId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void share(org.activiti.engine.repository.Model orgModel) {
|
|
|
|
|
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());
|
|
|
|
@@ -246,7 +322,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());
|
|
|
|
@@ -257,7 +333,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());
|
|
|
|
@@ -284,9 +360,15 @@ public class ModelShareWorker implements Bootstrappable {
|
|
|
|
|
for (ModelShareInfo share : shares)
|
|
|
|
|
map.put(new HashableGroup(share.getGroup()), share.getPermission());
|
|
|
|
|
|
|
|
|
|
pageable = pageable.next();
|
|
|
|
|
shares = this.shareInfoRepo.findByModelIdOrderByShareDateAsc(model.getId(), pageable);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this.logger.isTraceEnabled()) {
|
|
|
|
|
this.logger.trace("Found existing shares: {}", map);
|
|
|
|
|
} else {
|
|
|
|
|
this.logger.debug("Found existing shares: {}", map.size());
|
|
|
|
|
}
|
|
|
|
|
return map;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -342,7 +424,13 @@ public class ModelShareWorker implements Bootstrappable {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean equals(Object obj) {
|
|
|
|
|
return this.group.getId().equals(((Group) obj).getId());
|
|
|
|
|
if (obj instanceof HashableGroup) {
|
|
|
|
|
return this.group.getId().equals(((HashableGroup) obj).getGroup().getId());
|
|
|
|
|
} else if (obj instanceof Group) {
|
|
|
|
|
return this.group.getId().equals(((Group) obj).getId());
|
|
|
|
|
} else {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|