/*******************************************************************************
* Copyright 2017 Graz University of Technology
* EAAF-Core Components has been developed in a cooperation between EGIZ,
* A-SIT Plus, A-SIT, and Graz University of Technology.
*
* Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
* the European Commission - subsequent versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
* https://joinup.ec.europa.eu/news/understanding-eupl-v12
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the Licence is distributed on an "AS IS" basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Licence for the specific language governing permissions and
* limitations under the Licence.
*
* This product combines work with different licenses. See the "NOTICE" text
* file for details on the various modules and licenses.
* The "NOTICE" text file is part of the distribution. Any derivative works
* that you distribute must include a readable copy of the "NOTICE" text file.
*******************************************************************************/
/*******************************************************************************
*******************************************************************************/
/*******************************************************************************
*******************************************************************************/
package at.gv.egiz.eaaf.core.impl.idp.process.model;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;
import at.gv.egiz.eaaf.core.impl.idp.process.ProcessDefinitionParser;
/**
* Represents a single process definition containing
*
* - a {@link StartEvent},
* - one or more {@linkplain TaskInfo Tasks},
* - one or more {@linkplain EndEvent EndEvents} and
* - some {@linkplain Transition Transitions} linking StartEvents, Tasks and EndEvents.
*
*
* @author tknall
*
*/
public class ProcessDefinition {
private String id;
private StartEvent startEvent;
private Map taskInfos = new LinkedHashMap<>();
private Map endEvents = new LinkedHashMap<>();
/**
* Returns the unique identifier of the process definition.
*
* @return The unique identifier (never {@code null} if process definition comes from
* {@link ProcessDefinitionParser}).
*/
public String getId() {
return id;
}
/**
* Sets the unique identifier of the process definition.
*
* @param id
* The unique identifier.
*/
public void setId(String id) {
this.id = id;
}
/**
* Returns the start event of the process definition.
*
* @return The start event (never {@code null} if process definition comes from {@link ProcessDefinitionParser}).
*/
public StartEvent getStartEvent() {
return startEvent;
}
/**
* Sets the start event of the process definition.
*
* @param startEvent
* The start event.
*/
public void setStartEvent(StartEvent startEvent) {
this.startEvent = startEvent;
}
/**
* Returns a map containing the tasks of the process definition.
*
* @return The tasks (map is never {@code null} if process definition comes from {@link ProcessDefinitionParser}).
*/
public Map getTaskInfos() {
return taskInfos;
}
/**
* Sets the map containing the tasks.
*
* @param taskInfos
* The map containing the tasks.
*/
public void setTaskInfos(Map taskInfos) {
this.taskInfos = taskInfos;
}
/**
* Returns a map containing the end events of the process description.
*
* @return The map containing the end events (map is never {@code null} if process definition comes from
* {@link ProcessDefinitionParser}).
*/
public Map getEndEvents() {
return endEvents;
}
/**
* Sets a map containing the end events of the process description.
*
* @param endEvents
* The map containing the end events.
*/
public void setEndEvents(Map endEvents) {
this.endEvents = endEvents;
}
/**
* Returns the process node associated with the given {@code id}.
*
* @param id
* The identifier of the process node.
* @return The process node (may be {code null} when no process node with the given {@code id} exists).
*/
public ProcessNode getProcessNode(String id) {
Objects.requireNonNull(id, "Identifier must not be null.");
if (startEvent != null && id.equals(startEvent.getId())) {
return startEvent;
}
TaskInfo task = taskInfos.get(id);
if (task != null) {
return task;
}
return endEvents.get(id);
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
if (id != null) {
builder.append("id=");
builder.append(id);
}
if (startEvent != null) {
if (builder.length() > 0) {
builder.append(", ");
}
builder.append("startEvent=");
builder.append(startEvent);
}
if (taskInfos != null && !taskInfos.isEmpty()) {
if (builder.length() > 0) {
builder.append(", ");
}
builder.append("tasksInfos=");
builder.append(taskInfos.values());
}
if (endEvents != null && !endEvents.isEmpty()) {
if (builder.length() > 0) {
builder.append(", ");
}
builder.append("endEvents=");
builder.append(endEvents.values());
}
builder.insert(0, "ProcessDefinition [");
builder.append("]");
return builder.toString();
}
}