/*
* Copyright (C) Yutaka Matsuno 2010-2012 All rights reserved.
*/
package net.dependableos.dcase.diagram.editor.parameter;
import static net.dependableos.dcase.diagram.common.constant.SystemDefinitionConst.DATA_ATTRIBUTE_DIGIT;
import static net.dependableos.dcase.diagram.common.constant.SystemDefinitionConst.DATA_ATTRIBUTE_MIN;
import static net.dependableos.dcase.diagram.common.constant.SystemDefinitionConst.DATA_TYPE_DOUBLE;
import static net.dependableos.dcase.diagram.common.constant.SystemDefinitionConst.DATA_TYPE_ENUM;
import static net.dependableos.dcase.diagram.common.constant.SystemDefinitionConst.DATA_TYPE_INT;
import static net.dependableos.dcase.diagram.common.constant.SystemDefinitionConst.DATA_TYPE_RAW;
import static net.dependableos.dcase.diagram.common.constant.SystemDefinitionConst.DATA_TYPE_STRING;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import net.dependableos.dcase.Argument;
import net.dependableos.dcase.BasicNode;
import net.dependableos.dcase.diagram.common.model.AttributeType;
import net.dependableos.dcase.diagram.common.model.NodeInfo;
import net.dependableos.dcase.diagram.editor.common.util.DcaseEditorUtil;
import net.dependableos.dcase.diagram.editor.verifier.DataTypeVerifier;
import net.dependableos.dcase.diagram.editor.verifier.ParameterDialog;
import net.dependableos.dcase.diagram.part.PatternUtil;
import net.dependableos.dcase.impl.ParameterItem;
import org.eclipse.jface.dialogs.Dialog;
/**
* A utility class to handle parameter items.
*/
public final class ParameterUtil {
/**
* A contractor.
*/
private ParameterUtil() {
}
/**
* Shows a dialog to set parameters if the each node of the specified argument is configured parameters.
*
* @param node the node.
* @return true if and only if the parameters are set;false otherwise.
*/
public static boolean processParameter(BasicNode node) {
return processParameter(node, null);
}
/**
* Shows a dialog to set parameters if the each node of the specified argument is configured parameters.
*
* @param node the node.
* @param argument the argument.
* @return true if and only if the parameters are set;false otherwise.
*/
public static boolean processParameter(BasicNode node, Argument argument) {
boolean result = true;
String userdef007 = node.getParameterVals();
String userdef009 = node.getParameterDefs();
// tests whether the node is configured parameters.
if (userdef009 != null && !"".equals(userdef009.trim())) { //$NON-NLS-1$
if (ParameterItem.isValidParameter(userdef007)) {
// creates a node info and initializes it.
NodeInfo nodeInfo = new NodeInfo(null);
nodeInfo.setAttribute(AttributeType.PARAMETERVALS, userdef007);
String labelStr = node.getParameterizedDesc();
if (labelStr == null || labelStr.length() == 0) {
labelStr = node.getName();
}
nodeInfo.setAttribute(AttributeType.PARAMETERIZEDDESC, labelStr);
nodeInfo.setAttribute(AttributeType.PARAMETERDEFS, userdef009);
ParameterDialog dialog = new ParameterDialog(
DcaseEditorUtil.getActiveWindowShell());
dialog.setNodeInfo(nodeInfo);
if (argument != null) {
dialog.setAdditionalLabel(PatternUtil.getNodeLabel(
PatternUtil.getParent(node, argument), argument));
}
if (Dialog.OK == dialog.open()) {
// applies the parameters to the node.
node.setParameterVals((String) nodeInfo.getAttribute(AttributeType.PARAMETERVALS));
} else {
result = false;
}
}
}
return result;
}
/**
* Returns the decimal places.
*
* @param dataTypeVerifier the verifier.
* @return the decimal places.
*/
public static int getDigit(DataTypeVerifier dataTypeVerifier) {
int result = 0;
String digitStr = getDataTypeDefineXMLAttribute(DATA_ATTRIBUTE_DIGIT,
dataTypeVerifier);
if (digitStr == null) {
result = 0;
} else {
result = Integer.parseInt(digitStr);
if (result < 0) {
result = 0;
}
}
return result;
}
/**
* Returns the attribute.
*
* @param key the key.
* @param dataTypeVerifier the verifier.
* @return the attribute value.
*/
public static String getDataTypeDefineXMLAttribute(String key,
DataTypeVerifier dataTypeVerifier) {
Map<String, String> attributeMap = dataTypeVerifier.getAttributeMap();
String result = attributeMap.get(key);
return result;
}
/**
* Returns the parameter names.
* @param defStr the Userdef009 string.
* @return the parameter names.
*/
public static List<String> getParameterDefinitionNames(String defStr) {
String[] sepString = defStr.split(";"); //$NON-NLS-1$
if(sepString.length >= 2) {
String[] namesString = sepString[0].split(","); //$NON-NLS-1$
List<String> ret = new ArrayList<String>();
for(String name : namesString) {
ret.add(name);
}
return ret;
}
return new ArrayList<String>();
}
/**
* Returns the parameter attributes.
* @param defStr the Userdef009 string.
* @return the parameter attributes.
*/
public static List<String> getParameterDefinitionAttrs(String defStr) {
String[] sepString = defStr.split(";"); //$NON-NLS-1$
if(sepString.length >= 2) {
List<String> ret = new ArrayList<String>();
for(int index=1; index<sepString.length; index++) {
ret.add(sepString[index]);
}
return ret;
}
return new ArrayList<String>();
}
/**
* Returns the new parameter string.
* @param paramStr the current parameter string.
* @param defStr the parameter definitions.
* @return the new parameter string.
*/
public static String updateParameters(String paramStr, String defStr) {
Map<String, DataTypeVerifier> vf = ParameterDataItem.getDataTypeVerifierMapFromString(defStr);
List<String> defList = getParameterDefinitionNames(defStr);
List<ParameterItem> paramList = ParameterItem.getPatameterList(paramStr);
List<ParameterItem> newList = new ArrayList<ParameterItem>();
for (String name : defList) {
ParameterItem foundItem = null;
for (ParameterItem item : paramList) {
if (item.getParameterId().equals(name)) {
// verify value
DataTypeVerifier dataTypeVerifier = vf.get(name);
if (dataTypeVerifier == null ||
dataTypeVerifier.verify(item.getParameterValue())) {
newList.add(item);
foundItem = item;
}
break;
}
}
if (foundItem == null) {
// set default parameter value
ParameterItem newItem = new ParameterItem();
newItem.setParameterId(name);
DataTypeVerifier dataTypeVerifier = vf.get(name);
newItem.setParameterValue(getDefaultParameterValue(dataTypeVerifier));
newList.add(newItem);
}
}
if(newList.size() <= 0) {
return ""; //$NON-NLS-1$
}
StringBuffer ret = new StringBuffer(newList.get(0).getParamString());
for(int index=1; index<newList.size(); index++) {
ret.append(",").append(newList.get(index).getParamString()); //$NON-NLS-1$
}
return ret.toString();
}
/**
* Returns the default parameter value.
* @param dataTypeVerifier the data type verifier.
* @return the default parameter value.
*/
public static String getDefaultParameterValue(DataTypeVerifier dataTypeVerifier) {
String ret = ""; //$NON-NLS-1$
String paramDataType = dataTypeVerifier.getDataType();
if (paramDataType == null
|| DATA_TYPE_STRING.equals(paramDataType)
|| DATA_TYPE_RAW.equals(paramDataType)) {
// do nothing
} else if (DATA_TYPE_DOUBLE.equals(paramDataType)
|| DATA_TYPE_INT.equals(paramDataType)) {
return ParameterUtil.getDataTypeDefineXMLAttribute(
DATA_ATTRIBUTE_MIN, dataTypeVerifier);
} else if (DATA_TYPE_ENUM.equals(paramDataType)) {
List<String> enumList = dataTypeVerifier.getAttributeList();
if (! enumList.isEmpty()) {
ret = enumList.get(0);
}
}
return ret;
}
/***
* Returns the merged parameters.
* @param baseStr the base parameter string.
* @param addedStr the added parameter string.
* @return the merged parameters.
*/
public static String mergeParameters(String baseStr, String addedStr) {
List<ParameterItem> baseList = ParameterItem.getPatameterList(baseStr);
List<ParameterItem> addedList = ParameterItem.getPatameterList(addedStr);
for (ParameterItem item : addedList) {
boolean found = false;
for (ParameterItem bitem : baseList) {
if (item.getParameterId().equals(bitem.getParameterId())) {
found = true;
break;
}
}
if (! found) {
baseList.add(item);
}
}
// make parameter String
return ParameterItem.getSavedString(baseList);
}
/***
* Returns the merged parameter definition string.
* @param baseStr the base definition string.
* @param addedStr the added definition string.
* @return the merged parameter definition string.
*/
public static String mergeParameterDefinitions(String baseStr, String addedStr) {
List<ParameterDataItem> baseList = ParameterDataItem.getParamDatatypeListFromString(baseStr);
List<ParameterDataItem> addedList = ParameterDataItem.getParamDatatypeListFromString(addedStr);
for (ParameterDataItem item : addedList) {
boolean found = false;
for (ParameterDataItem bitem : baseList) {
if (item.getName().equals(bitem.getName())) {
found = true;
break;
}
}
if (! found) {
baseList.add(item);
}
}
return ParameterDataItem.getSavedString(baseList);
}
}