/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.kie.workbench.common.stunner.bpmn.client.forms.fields.model; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import org.jboss.errai.common.client.api.annotations.Portable; import org.kie.workbench.common.stunner.bpmn.client.forms.fields.i18n.StunnerFormsClientFieldsConstants; /** * Class which contains everything associated with Assignments which * is passed between the Designer properties and the DataIOEditor, i.e. * Assignments, InputVariables, OutputVariables, DataTypes and ProcessVariables */ @Portable public class AssignmentData { private List<Variable> inputVariables = new ArrayList<Variable>(); private List<Variable> outputVariables = new ArrayList<Variable>(); private List<Variable> processVariables = new ArrayList<Variable>(); private List<Assignment> assignments = new ArrayList<Assignment>(); private List<String> dataTypes = new ArrayList<String>(); private List<String> dataTypeDisplayNames = new ArrayList<String>(); private Map<String, String> mapDisplayNameToDataType = new HashMap<String, String>(); private Map<String, String> mapDataTypeToDisplayName = new HashMap<String, String>(); private Map<String, String> mapSimpleDataTypeToDisplayName = new HashMap<String, String>(); private List<String> disallowedPropertyNames = new ArrayList<String>(); private String variableCountsString = ""; public AssignmentData() { } public AssignmentData(final String sInputVariables, final String sOutputVariables, final String sProcessVariables, final String sAssignments, final String sDataTypes, final String sDisallowedPropertyNames) { // setDataTypes before variables because these determine whether variable datatypes are custom or not setDataTypes(sDataTypes); setProcessVariables(sProcessVariables); setInputVariables(sInputVariables); setOutputVariables(sOutputVariables); setAssignments(sAssignments); setDisallowedPropertyNames(sDisallowedPropertyNames); } public AssignmentData(final String sInputVariables, final String sOutputVariables, final String sProcessVariables, final String sAssignments, final String sDisallowedPropertyNames) { this(sInputVariables, sOutputVariables, sProcessVariables, sAssignments, null, sDisallowedPropertyNames); } /** * Creates AssignmentData based on a list of inputAssignmentRows and outputAssignmentRows. * @param inputAssignmentRows * @param outputAssignmentRows */ public AssignmentData(final List<AssignmentRow> inputAssignmentRows, final List<AssignmentRow> outputAssignmentRows, final List<String> dataTypes, final List<String> dataTypeDisplayNames) { setDataTypes(dataTypes, dataTypeDisplayNames); if (inputAssignmentRows != null) { for (AssignmentRow row : inputAssignmentRows) { convertAssignmentRow(row); } } if (outputAssignmentRows != null) { for (AssignmentRow row : outputAssignmentRows) { convertAssignmentRow(row); } } } protected void convertAssignmentRow(final AssignmentRow assignmentRow) { if (assignmentRow.getName() == null || assignmentRow.getName().isEmpty()) { return; } if (findVariable(assignmentRow.getName(), assignmentRow.getVariableType()) == null) { Variable var = new Variable(assignmentRow.getName(), assignmentRow.getVariableType(), getDataTypeFromDisplayName(assignmentRow.getDataType()), assignmentRow.getCustomDataType()); addVariable(var); } String processVarName; // If there's a constant, use it rather than processVar String constant = assignmentRow.getConstant(); if (constant != null && !constant.isEmpty()) { processVarName = null; } else { processVarName = assignmentRow.getProcessVar(); if (processVarName != null && !processVarName.isEmpty()) { HashSet<String> processVarsNames = new HashSet<String>(); for (Variable var : processVariables) { processVarsNames.add(var.getName()); } if (!processVarsNames.contains(processVarName)) { Variable processVar = new Variable(processVarName, Variable.VariableType.PROCESS, assignmentRow.getDataType(), assignmentRow.getCustomDataType()); processVariables.add(processVar); } } } if ((constant == null || constant.isEmpty()) && (processVarName == null || processVarName.isEmpty())) { return; } Assignment assignment = new Assignment(this, assignmentRow.getName(), assignmentRow.getVariableType(), processVarName, constant); assignments.add(assignment); } public List<Variable> getInputVariables() { return inputVariables; } public String getInputVariablesString() { return getStringForList(inputVariables); } public void setInputVariables(final String sInputVariables) { inputVariables.clear(); if (sInputVariables != null && !sInputVariables.isEmpty()) { String[] inputs = sInputVariables.split(","); for (String input : inputs) { if (!input.isEmpty()) { Variable var = Variable.deserialize(input, Variable.VariableType.INPUT, dataTypes); if (var != null && var.getName() != null && !var.getName().isEmpty()) { inputVariables.add(var); } } } } } public List<Variable> getOutputVariables() { return outputVariables; } public String getOutputVariablesString() { return getStringForList(outputVariables); } public void setOutputVariables(final String sOutputVariables) { outputVariables.clear(); if (sOutputVariables != null && !sOutputVariables.isEmpty()) { String[] outputs = sOutputVariables.split(","); for (String output : outputs) { if (!output.isEmpty()) { Variable var = Variable.deserialize(output, Variable.VariableType.OUTPUT, dataTypes); if (var != null && var.getName() != null && !var.getName().isEmpty()) { outputVariables.add(var); } } } } } public List<Variable> getProcessVariables() { return processVariables; } public String getProcessVariablesString() { return getStringForList(processVariables); } public void setProcessVariables(final String sProcessVariables) { processVariables.clear(); if (sProcessVariables != null && !sProcessVariables.isEmpty()) { HashSet<String> procVarNames = new HashSet<String>(); String[] processVars = sProcessVariables.split(","); for (String processVar : processVars) { if (!processVar.isEmpty()) { Variable var = Variable.deserialize(processVar, Variable.VariableType.PROCESS, dataTypes); if (var != null && var.getName() != null && !var.getName().isEmpty()) { if (!procVarNames.contains(var.getName())) { procVarNames.add(var.getName()); processVariables.add(var); } } } } } } public List<Assignment> getAssignments() { return assignments; } public String getAssignmentsString() { return getStringForList(assignments); } public void setAssignments(final String sAssignments) { assignments.clear(); if (sAssignments != null && !sAssignments.isEmpty()) { String[] as = sAssignments.split(","); for (String a : as) { if (!a.isEmpty()) { Assignment ass = Assignment.deserialize(this, a); if (ass != null && ass.getName() != null && !ass.getName().isEmpty()) { assignments.add(ass); } } } } } public List<String> getDataTypes() { return dataTypes; } protected void setDataTypes(final String dataTypes) { this.dataTypes.clear(); this.dataTypeDisplayNames.clear(); mapDisplayNameToDataType.clear(); mapDataTypeToDisplayName.clear(); mapSimpleDataTypeToDisplayName.clear(); if (dataTypes != null && !dataTypes.isEmpty()) { String[] dts = dataTypes.split(","); for (String dt : dts) { dt = dt.trim(); if (!dt.isEmpty() && !dt.startsWith("*")) { String dtName = ""; String dtDisplayName = ""; String dtSimpleType = ""; if (dt.contains(":")) { dtDisplayName = dt.substring(0, dt.indexOf(':')).trim(); dtName = dt.substring(dt.indexOf(':') + 1).trim(); } else { dtDisplayName = dt.trim(); dtName = dt.trim(); } if (dtDisplayName.indexOf(' ') > 0) { dtSimpleType = dtDisplayName.substring(0, dtDisplayName.indexOf(' ')); } else { dtSimpleType = dtDisplayName; } if (!dtName.isEmpty()) { this.dataTypeDisplayNames.add(dtDisplayName); this.dataTypes.add(dtName); mapDisplayNameToDataType.put(dtDisplayName, dtName); mapDataTypeToDisplayName.put(dtName, dtDisplayName); } if (!dtSimpleType.isEmpty()) { mapSimpleDataTypeToDisplayName.put(dtSimpleType, dtDisplayName); } } } } } protected void setDataTypes(final List<String> dataTypes, final List<String> dataTypeDisplayNames) { this.dataTypes.clear(); this.dataTypeDisplayNames.clear(); mapDisplayNameToDataType.clear(); mapDataTypeToDisplayName.clear(); mapSimpleDataTypeToDisplayName.clear(); this.dataTypes = dataTypes; this.dataTypeDisplayNames = dataTypeDisplayNames; for (int i = 0; i < dataTypeDisplayNames.size(); i++) { if (i < dataTypes.size()) { mapDisplayNameToDataType.put(dataTypeDisplayNames.get(i), dataTypes.get(i)); mapDataTypeToDisplayName.put(dataTypes.get(i), dataTypeDisplayNames.get(i)); } else { mapDisplayNameToDataType.put(dataTypeDisplayNames.get(i), dataTypeDisplayNames.get(i)); mapDataTypeToDisplayName.put(dataTypeDisplayNames.get(i), dataTypeDisplayNames.get(i)); } } } public List<String> getDisallowedPropertyNames() { return disallowedPropertyNames; } protected void setDisallowedPropertyNames(final String disallowedPropertyNames) { this.disallowedPropertyNames.clear(); if (disallowedPropertyNames != null && !disallowedPropertyNames.isEmpty()) { String[] hps = disallowedPropertyNames.split(","); for (String hp : hps) { hp = hp.trim(); if (!hp.isEmpty()) { this.disallowedPropertyNames.add(hp); } } } } public Variable findProcessVariable(final String processVarName) { if (processVarName == null || processVarName.isEmpty()) { return null; } for (Variable var : processVariables) { if (processVarName.equals(var.getName())) { return var; } } return null; } public Variable findVariable(final String variableName, final Variable.VariableType variableType) { if (variableName == null || variableName.isEmpty()) { return null; } if (variableType == Variable.VariableType.INPUT) { for (Variable var : inputVariables) { if (variableName.equals(var.getName())) { return var; } } } else if (variableType == Variable.VariableType.OUTPUT) { for (Variable var : outputVariables) { if (variableName.equals(var.getName())) { return var; } } } return null; } public void addVariable(final Variable variable) { if (variable.getName() == null || variable.getName().isEmpty()) { return; } if (findVariable(variable.getName(), variable.getVariableType()) != null) { return; } if (variable.getVariableType() == Variable.VariableType.INPUT) { inputVariables.add(variable); } else if (variable.getVariableType() == Variable.VariableType.OUTPUT) { outputVariables.add(variable); } else if (variable.getVariableType() == Variable.VariableType.PROCESS) { processVariables.add(variable); } } public List<String> getDataTypeDisplayNames() { return dataTypeDisplayNames; } public String getDataTypeFromDisplayName(final String dataTypeDisplayName) { if (mapDisplayNameToDataType.get(dataTypeDisplayName) != null) { return mapDisplayNameToDataType.get(dataTypeDisplayName); } else { return dataTypeDisplayName; } } public String getDisplayNameFromDataType(final String dataType) { if (mapDataTypeToDisplayName.get(dataType) != null) { return mapDataTypeToDisplayName.get(dataType); } else { return dataType; } } public String getDataTypeDisplayNameForUserString(final String userValue) { if (mapDataTypeToDisplayName.containsKey(userValue)) { return mapDataTypeToDisplayName.get(userValue); } else if (mapSimpleDataTypeToDisplayName.containsKey(userValue)) { return mapSimpleDataTypeToDisplayName.get(userValue); } return null; } public String getDataTypesString() { StringBuilder sb = new StringBuilder(); for (int i = 0; i < dataTypes.size(); i++) { String dataTypeDisplayName = dataTypes.get(i); String dataType = dataTypes.get(i); sb.append(dataTypeDisplayName).append(':').append(dataType).append(','); } if (sb.length() > 0) { sb.setLength(sb.length() - 1); } return sb.toString(); } public String getDisallowedPropertyNamesString() { return getStringForList(disallowedPropertyNames); } public List<String> getProcessVariableNames() { List<String> processVarNames = new ArrayList<String>(); for (Variable processVar : processVariables) { processVarNames.add(processVar.getName()); } return processVarNames; } /** * Gets a list of AssignmentRows based on the current Assignments * @return */ public List<AssignmentRow> getAssignmentRows(final Variable.VariableType varType) { List<AssignmentRow> rows = new ArrayList<AssignmentRow>(); List<Variable> handledVariables = new ArrayList<Variable>(); // Create an AssignmentRow for each Assignment for (Assignment assignment : assignments) { if (assignment.getVariableType() == varType) { String dataType = getDisplayNameFromDataType(assignment.getDataType()); AssignmentRow row = new AssignmentRow(assignment.getName(), assignment.getVariableType(), dataType, assignment.getCustomDataType(), assignment.getProcessVarName(), assignment.getConstant()); rows.add(row); handledVariables.add(assignment.getVariable()); } } List<Variable> vars = null; if (varType == Variable.VariableType.INPUT) { vars = inputVariables; } else { vars = outputVariables; } // Create an AssignmentRow for each Variable that doesn't have an Assignment for (Variable var : vars) { if (!handledVariables.contains(var)) { AssignmentRow row = new AssignmentRow(var.getName(), var.getVariableType(), var.getDataType(), var.getCustomDataType(), null, null); rows.add(row); } } return rows; } public void setVariableCountsString(final String variableCountsString) { this.variableCountsString = variableCountsString; } public void setVariableCountsString(final boolean hasInputVars, final boolean isSingleInputVar, final boolean hasOutputVars, final boolean isSingleOutputVar) { StringBuilder sb = new StringBuilder(); if (hasInputVars) { List<AssignmentRow> inputAssignments = getAssignmentRows(Variable.VariableType.INPUT); inputAssignments = removeDisallowedInputAssignmentRows(inputAssignments); if (inputAssignments == null || inputAssignments.isEmpty()) { if (isSingleInputVar) { sb.append(StunnerFormsClientFieldsConstants.INSTANCE.No_Data_Input()); } else { sb.append("0 " + StunnerFormsClientFieldsConstants.INSTANCE.Data_Inputs()); } } else if (inputAssignments.size() == 1) { sb.append("1 " + StunnerFormsClientFieldsConstants.INSTANCE.Data_Input()); } else if (inputAssignments.size() > 1) { sb.append(inputAssignments.size() + " " + StunnerFormsClientFieldsConstants.INSTANCE.Data_Inputs()); } } if (hasOutputVars) { if (sb.length() > 0) { sb.append(", "); } List<AssignmentRow> outputAssignments = getAssignmentRows(Variable.VariableType.OUTPUT); if (outputAssignments == null || outputAssignments.isEmpty()) { if (isSingleOutputVar) { sb.append(StunnerFormsClientFieldsConstants.INSTANCE.No_Data_Output()); } else { sb.append("0 " + StunnerFormsClientFieldsConstants.INSTANCE.Data_Outputs()); } } else if (outputAssignments.size() == 1) { sb.append("1 " + StunnerFormsClientFieldsConstants.INSTANCE.Data_Output()); } else if (outputAssignments.size() > 1) { sb.append(outputAssignments.size() + " " + StunnerFormsClientFieldsConstants.INSTANCE.Data_Outputs()); } } variableCountsString = sb.toString(); } public String getVariableCountsString() { return variableCountsString; } public String getVariableCountsString(final boolean hasInputVars, final boolean isSingleInputVar, final boolean hasOutputVars, final boolean isSingleOutputVar) { setVariableCountsString(hasInputVars, isSingleInputVar, hasOutputVars, isSingleOutputVar); return getVariableCountsString(); } List<AssignmentRow> removeDisallowedInputAssignmentRows(List<AssignmentRow> inputAssignments) { if (inputAssignments == null) { return null; } List<AssignmentRow> allowedRows = new ArrayList<AssignmentRow>(); for (AssignmentRow inputAssignment : inputAssignments) { String name = inputAssignment.getName(); if (name != null && !name.isEmpty()) { if (!isDisallowedPropertyName(name)) { allowedRows.add(inputAssignment); } } } return allowedRows; } private boolean isDisallowedPropertyName(final String name) { if (disallowedPropertyNames != null) { for (String disallowedPropertyName : disallowedPropertyNames) { if (disallowedPropertyName.equalsIgnoreCase(name)) { return true; } } } return false; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("\"inputVariables\":\"").append(getInputVariablesString()).append("\"").append(",\n"); sb.append("\"outputVariables\":\"").append(getOutputVariablesString()).append("\"").append(",\n"); sb.append("\"processVariables\":\"").append(getProcessVariablesString()).append("\"").append(",\n"); sb.append("\"assignments\":\"").append(getAssignmentsString()).append("\"").append(",\n"); sb.append("\"dataTypes\":\"").append(getDataTypesString()).append("\"").append(",\n"); sb.append("\"disallowedPropertyNames\":\"").append(getDisallowedPropertyNamesString()).append("\""); return sb.toString(); } @Override public boolean equals(final Object o) { if (this == o) { return true; } if (!(o instanceof AssignmentData)) { return false; } AssignmentData that = (AssignmentData) o; if (getInputVariables() != null ? !getInputVariables().equals(that.getInputVariables()) : that.getInputVariables() != null) { return false; } if (getOutputVariables() != null ? !getOutputVariables().equals(that.getOutputVariables()) : that.getOutputVariables() != null) { return false; } if (getProcessVariables() != null ? !getProcessVariables().equals(that.getProcessVariables()) : that.getProcessVariables() != null) { return false; } if (getAssignments() != null ? !getAssignments().equals(that.getAssignments()) : that.getAssignments() != null) { return false; } if (getVariableCountsString() != null ? !getVariableCountsString().equals(that.getVariableCountsString()) : that.getVariableCountsString() != null) { return false; } if (getDataTypes() != null ? !getDataTypes().equals(that.getDataTypes()) : that.getDataTypes() != null) { return false; } if (getDataTypeDisplayNames() != null ? !getDataTypeDisplayNames().equals(that.getDataTypeDisplayNames()) : that.getDataTypeDisplayNames() != null) { return false; } return getDisallowedPropertyNames() != null ? getDisallowedPropertyNames().equals(that.getDisallowedPropertyNames()) : that.getDisallowedPropertyNames() == null; } @Override public int hashCode() { int result = getInputVariables() != null ? getInputVariables().hashCode() : 0; result = 31 * result + (getOutputVariables() != null ? getOutputVariables().hashCode() : 0); result = 31 * result + (getProcessVariables() != null ? getProcessVariables().hashCode() : 0); result = 31 * result + (getAssignments() != null ? getAssignments().hashCode() : 0); result = 31 * result + (getVariableCountsString() != null ? getVariableCountsString().hashCode() : 0); result = 31 * result + (getDataTypes() != null ? getDataTypes().hashCode() : 0); result = 31 * result + (getDataTypeDisplayNames() != null ? getDataTypeDisplayNames().hashCode() : 0); result = 31 * result + (getDisallowedPropertyNames() != null ? getDisallowedPropertyNames().hashCode() : 0); return result; } private String getStringForList(final List<? extends Object> objects) { StringBuilder sb = new StringBuilder(); for (Object o : objects) { sb.append(o.toString()).append(','); } if (sb.length() > 0) { sb.setLength(sb.length() - 1); } return sb.toString(); } }