/*
* Copyright (c) 2011-2015 Marat Gubaidullin.
*
* This file is part of HYBRIDBPM.
*
* HybridBPM is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* HybridBPM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with HybridBPM. If not, see <http ://www.gnu.org/licenses/>.
*/
package com.hybridbpm.model;
import java.util.*;
/**
*
* @author Marat Gubaidullin
*/
public class ProcessModel extends AbstractModel {
private Map<String, TaskModel> taskModels;
private Map<String, TransitionModel> transitionModels;
private List<FieldModel> variableModels;
private List<FileModel> fileModels;
private int width = 800;
private int height = 600;
private boolean useCounter = true;
private long counter = 0;
private ModelStatus status;
public ProcessModel() {
}
public static ProcessModel createDefault() {
ProcessModel processModel = new ProcessModel();
processModel.addHumanTaskModel("task0", "Start process", null, TaskModel.TASK_PRIORITY.NORMAL, TaskModel.GATE_TYPE.EXLUSIVE, TaskModel.GATE_TYPE.EXLUSIVE, 100f, 100f);
processModel.addVariableModel("var1", String.class.getCanonicalName(), "", FieldModel.EDITOR_TYPE.TEXT_FIELD);
return processModel;
}
public void removeTaskModelByName(String taskName) {
// find task
String taskId = null;
for (TaskModel taskModel : getTaskModels().values()) {
if (taskModel.getName().equals(taskName)) {
taskId = taskModel.getId();
}
}
// prepare delete transition list
ArrayList<String> transToDelete = new ArrayList<>();
for (TransitionModel trans : transitionModels.values()) {
if (trans.getBeginTaskModel().equals(taskId) || trans.getEndTaskModel().equals(taskId)) {
transToDelete.add(trans.getId());
}
}
// delete transitions from tasks
for (Map.Entry<String, TaskModel> taskModelValue : getTaskModels().entrySet()) {
TaskModel taskModel = taskModelValue.getValue();
for (String transId : transToDelete) {
taskModel.removeTransitionById(transId);
}
taskModelValue.setValue(taskModel);
}
for (String transId : transToDelete) {
removeTransitionModel(transId);
}
getTaskModels().remove(taskId);
}
public TaskModel getTaskModelByName(String taskName) {
for (TaskModel taskModel : getTaskModels().values()) {
if (taskModel.getName().equals(taskName)) {
return taskModel;
}
}
return null;
}
public TaskModel getTaskModelById(String taskId) {
return getTaskModels().get(taskId);
}
public Map<String, TransitionModel> getTransitionModels() {
if (transitionModels == null) {
transitionModels = new HashMap<>();
}
return transitionModels;
}
public ProcessModel addTransitionModel(TransitionModel transitionModel) {
this.getTransitionModels().put(transitionModel.getId(), transitionModel);
// set outgoing transitions to task
this.getTaskModels().get(transitionModel.getBeginTaskModel()).getOutgoingTransitionModel().add(transitionModel);
// set incoming transitions to task
this.getTaskModels().get(transitionModel.getEndTaskModel()).getIncomingTransitionModel().add(transitionModel);
return this;
}
public TransitionModel getTransitionModelByName(String transitionName) {
for (TransitionModel transitionModel : getTransitionModels().values()) {
if (transitionModel.getName().equals(transitionName)) {
return transitionModel;
}
}
return null;
}
public TransitionModel getTransitionModelById(String transitionModelId) {
return this.getTransitionModels().get(transitionModelId);
}
public void removeTransitionModel(String transitionId) {
// delete transitions from tasks
for (Map.Entry<String, TaskModel> taskModelValue : getTaskModels().entrySet()) {
TaskModel taskModel = taskModelValue.getValue();
taskModel.removeTransitionById(transitionId);
taskModelValue.setValue(taskModel);
}
getTransitionModels().remove(transitionId);
}
public void setTransitionModels(Map<String, TransitionModel> transitionModels) {
this.transitionModels = transitionModels;
}
public ProcessModel addTaskModel(TaskModel taskModel) {
this.getTaskModels().put(taskModel.getId(), taskModel);
return this;
}
// WE SHOULD NOT RENAME TASK BECAUSE USER SEE ONLY TITLE
public Map<String, TaskModel> getTaskModels() {
if (taskModels == null) {
taskModels = new HashMap<>();
}
return taskModels;
}
public Map<String, TaskModel> getStartTaskModels() {
Map<String, TaskModel> result = new HashMap<>();
for (TaskModel tm : taskModels.values()) {
if (tm.getIncomingTransitionModel().isEmpty()) {
result.put(tm.getName(), tm);
}
}
return result;
}
public void setTaskModels(Map<String, TaskModel> taskModels) {
this.taskModels = taskModels;
}
public ProcessModel addHumanTaskModel(String name, String title, String role, TaskModel.GATE_TYPE joinType, TaskModel.GATE_TYPE splitType, Float x, Float y) {
return addTaskModel(new TaskModel(name, title, TaskModel.TASK_TYPE.HUMAN, joinType, splitType, role, TaskModel.TASK_PRIORITY.NORMAL, x, y));
}
public ProcessModel addHumanTaskModel(String name, String title, String role, TaskModel.TASK_PRIORITY taskPriority, TaskModel.GATE_TYPE joinType, TaskModel.GATE_TYPE splitType, Float x, Float y) {
return addTaskModel(new TaskModel(name, title, TaskModel.TASK_TYPE.HUMAN, joinType, splitType, role, taskPriority, x, y));
}
public ProcessModel addAutomaticTaskModel(String name, String title, String connector, TaskModel.GATE_TYPE joinType, TaskModel.GATE_TYPE splitType, Float x, Float y) {
return addTaskModel(new TaskModel(name, title, TaskModel.TASK_TYPE.AUTOMATIC, joinType, splitType, connector, x, y));
}
public ProcessModel addTransitionModel(String name, String beginTaskName, String endTaskName, Float x, Float y) {
TaskModel beginTaskModel = getTaskModelByName(beginTaskName);
TaskModel endTaskModel = getTaskModelByName(endTaskName);
return addTransitionModel(TransitionModel.createTransitionModel(name, beginTaskModel.getId(), endTaskModel.getId(), x, y));
}
public ProcessModel addTransitionModelById(String name, String beginTaskModelId, String endTaskModelId, Float x, Float y) {
return addTransitionModel(TransitionModel.createTransitionModel(name, beginTaskModelId, endTaskModelId, x, y));
}
public ProcessModel addDefaultTransitionModel(String name, String beginTaskName, String endTaskName, Float x, Float y) {
TaskModel beginTaskModel = getTaskModelByName(beginTaskName);
TaskModel endTaskModel = getTaskModelByName(endTaskName);
return addTransitionModel(TransitionModel.createDefaultTransitionModel(name, beginTaskModel.getId(), endTaskModel.getId(), x, y));
}
public ProcessModel addConditionalTransitionModel(String name, String beginTaskName, String endTaskName, String expression, Float x, Float y) {
TaskModel beginTaskModel = getTaskModelByName(beginTaskName);
TaskModel endTaskModel = getTaskModelByName(endTaskName);
return addTransitionModel(TransitionModel.createConditionalTransitionModel(name, beginTaskModel.getId(), endTaskModel.getId(), expression, x, y));
}
public List<FieldModel> getVariableModels() {
if (variableModels == null) {
variableModels = new ArrayList<>();
}
return variableModels;
}
public void setVariableModels(List<FieldModel> variableModels) {
this.variableModels = variableModels;
}
public FieldModel getVariableModelByName(String variableName) {
for (FieldModel variableModel : getVariableModels()) {
if (variableModel.getName().equals(variableName)) {
return variableModel;
}
}
return null;
}
public FieldModel getFieldModelByName(String variableName) {
FieldModel result = getVariableModelByName(variableName);
return (result);
}
public ProcessModel addVariableModel(String name, String className, String defaultValue, FieldModel.EDITOR_TYPE editor) {
this.getVariableModels().add(new FieldModel(name, null, className, defaultValue, FieldModel.COLLECTION_TYPE.NONE, editor));
return this;
}
public ProcessModel addFileModel(String name, String description, boolean multiple) {
this.getFileModels().add(new FileModel(name, description, multiple));
return this;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public boolean isUseCounter() {
return useCounter;
}
public void setUseCounter(boolean useCounter) {
this.useCounter = useCounter;
}
public long getCounter() {
return counter;
}
public void setCounter(long counter) {
this.counter = counter;
}
public ModelStatus getStatus() {
return status;
}
public void setStatus(ModelStatus status) {
this.status = status;
}
public List<FileModel> getFileModels() {
if (fileModels == null){
fileModels = new ArrayList<>();
}
return fileModels;
}
public void setFileModels(List<FileModel> fileModels) {
this.fileModels = fileModels;
}
public FileModel getFileModelByName(String name) {
for (FileModel fileModel : getFileModels()) {
if (fileModel.getName().equals(name)) {
return fileModel;
}
}
return null;
}
}