/*
* 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 org.kie.workbench.common.stunner.bpmn.client.forms.util.StringUtils;
public class Assignment {
private Variable variable;
AssignmentData assignmentData;
/*
Assignments have either a processVar or a constant
*/
private Variable processVar;
private String constant;
private static final String INPUT_ASSIGNMENT_PREFIX = "[din]";
private static final String OUTPUT_ASSIGNMENT_PREFIX = "[dout]";
private static final String ASSIGNMENT_OPERATOR_TOVARIABLE = "->";
private static final String ASSIGNMENT_OPERATOR_TOCONSTANT = "=";
public Assignment() {
}
public Assignment(final AssignmentData assignmentData,
final String variableName,
final Variable.VariableType variableType,
final String dataType,
final String customDataType,
final String processVarName,
final String constant) {
this.assignmentData = assignmentData;
variable = assignmentData.findVariable(variableName,
variableType);
if (variable == null) {
variable = new Variable(variableName,
variableType,
dataType,
customDataType);
assignmentData.addVariable(variable);
}
this.processVar = assignmentData.findProcessVariable(processVarName);
this.constant = constant;
}
public Assignment(final AssignmentData assignmentData,
final String variableName,
final Variable.VariableType variableType,
final String processVarName,
final String constant) {
this.assignmentData = assignmentData;
variable = assignmentData.findVariable(variableName,
variableType);
if (variable == null) {
variable = new Variable(variableName,
variableType);
assignmentData.addVariable(variable);
}
processVar = assignmentData.findProcessVariable(processVarName);
this.constant = constant;
}
public String getName() {
return variable.getName();
}
public void setName(final String name) {
variable.setName(name);
}
public Variable.VariableType getVariableType() {
return variable.getVariableType();
}
public void setVariableType(final Variable.VariableType variableType) {
variable.setVariableType(variableType);
}
public Variable getVariable() {
return variable;
}
public String getDataType() {
return variable.getDataType();
}
public void setDataType(final String dataType) {
variable.setDataType(dataType);
}
public String getCustomDataType() {
return variable.getCustomDataType();
}
public void setCustomDataType(final String customDataType) {
variable.setCustomDataType(customDataType);
}
public String getProcessVarName() {
return ((processVar != null) ? processVar.getName() : null);
}
public void setProcessVarName(final String processVarName) {
this.processVar = assignmentData.findProcessVariable(processVarName);
}
public String getConstant() {
return constant;
}
public void setConstant(final String constant) {
this.constant = constant;
}
@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Assignment)) {
return false;
}
Assignment that = (Assignment) o;
if (getVariable() != null ? !getVariable().equals(that.getVariable()) : that.getVariable() != null) {
return false;
}
if (processVar != null ? !processVar.equals(that.processVar) : that.processVar != null) {
return false;
}
return getConstant() != null ? getConstant().equals(that.getConstant()) : that.getConstant() == null;
}
@Override
public int hashCode() {
int result = getVariable() != null ? getVariable().hashCode() : 0;
result = 31 * result + (processVar != null ? processVar.hashCode() : 0);
result = 31 * result + (getConstant() != null ? getConstant().hashCode() : 0);
return result;
}
/**
* Serializes assignment
* e.g. e.g. [din]str1->inStr, [din]inStrConst=TheString, [dout]outStr1->str1
* @return
*/
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
if (getVariableType() == Variable.VariableType.INPUT) {
if (getConstant() != null && !getConstant().isEmpty()) {
sb.append(INPUT_ASSIGNMENT_PREFIX).append(getName()).append(ASSIGNMENT_OPERATOR_TOCONSTANT).append(
StringUtils.urlEncode(getConstant()));
} else if (getProcessVarName() != null && !getProcessVarName().isEmpty()) {
sb.append(INPUT_ASSIGNMENT_PREFIX).append(getProcessVarName()).append(ASSIGNMENT_OPERATOR_TOVARIABLE).append(getName());
} else {
sb.append(INPUT_ASSIGNMENT_PREFIX).append(ASSIGNMENT_OPERATOR_TOVARIABLE).append(getName());
}
} else {
if (getProcessVarName() != null && !getProcessVarName().isEmpty()) {
sb.append(OUTPUT_ASSIGNMENT_PREFIX).append(getName()).append(ASSIGNMENT_OPERATOR_TOVARIABLE).append(getProcessVarName());
} else {
sb.append(OUTPUT_ASSIGNMENT_PREFIX).append(getName()).append(ASSIGNMENT_OPERATOR_TOVARIABLE);
}
}
return sb.toString();
}
/**
* Deserializes an assignment string
* e.g. [din]str1->inStr, [din]inStrConst=TheString, [dout]outStr1->str1
* @param sAssignment
* @return Assignment
*/
public static Assignment deserialize(final AssignmentData assignmentData,
String sAssignment) {
if (sAssignment == null || sAssignment.isEmpty()) {
return null;
}
// Parse the assignment string
Variable.VariableType assignmentType = null;
if (sAssignment.startsWith(INPUT_ASSIGNMENT_PREFIX)) {
assignmentType = Variable.VariableType.INPUT;
sAssignment = sAssignment.substring(INPUT_ASSIGNMENT_PREFIX.length());
} else if (sAssignment.startsWith(OUTPUT_ASSIGNMENT_PREFIX)) {
assignmentType = Variable.VariableType.OUTPUT;
sAssignment = sAssignment.substring(OUTPUT_ASSIGNMENT_PREFIX.length());
}
String variableName = null;
String processVariableName = null;
String constant = null;
if (sAssignment.contains(ASSIGNMENT_OPERATOR_TOVARIABLE)) {
int i = sAssignment.indexOf(ASSIGNMENT_OPERATOR_TOVARIABLE);
if (assignmentType == Variable.VariableType.INPUT) {
processVariableName = sAssignment.substring(0,
i);
variableName = sAssignment.substring(i + ASSIGNMENT_OPERATOR_TOVARIABLE.length());
} else {
variableName = sAssignment.substring(0,
i);
processVariableName = sAssignment.substring(i + ASSIGNMENT_OPERATOR_TOVARIABLE.length());
}
} else if (sAssignment.contains(ASSIGNMENT_OPERATOR_TOCONSTANT)) {
int i = sAssignment.indexOf(ASSIGNMENT_OPERATOR_TOCONSTANT);
variableName = sAssignment.substring(0,
i);
constant = StringUtils.urlDecode(sAssignment.substring(i + ASSIGNMENT_OPERATOR_TOCONSTANT.length()));
}
// Create the new assignment
return new Assignment(assignmentData,
variableName,
assignmentType,
processVariableName,
constant);
}
}