/*
* Copyright (c) 2008-2011 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.plugins.common;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.cim.CIMArgument;
import javax.cim.CIMDataType;
import javax.cim.CIMObjectPath;
import javax.cim.UnsignedInteger16;
import javax.cim.UnsignedInteger32;
import javax.cim.UnsignedInteger64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.cimadapter.connections.cim.CimObjectPathCreator;
import com.emc.storageos.plugins.common.domainmodel.Argument;
/**
* Responsibility of this ArgsCreator is to provide methods to return the
* argument value based on the arguments specified in Domain Logic. Say if
* "getStringValue" is the method used in Argument1 Node of Domain Logic
* <Argument1 Method="getStringValue" Instance="ArgsCreator" > then at runtime,
* "getStringValue" will get called. Say if a new Argument1 needs a IntegerArray
* as an value, then create a new method "getIntArrayValue" add own logic here
* and in Domain Logic <Argument1 method="getIntArrayValue"
* Instance="ArgsCreator" >
*
*/
public class ArgsCreator {
protected Util _util;
protected static final Logger _logger = LoggerFactory.getLogger(ArgsCreator.class);
public ArgsCreator(Util util) {
_util = util;
}
/**
* get String Value. <Argument1 Name="" Method="getStringValue">
* <Value>XYZ<Value> <Argument1>
*
* @param arg
* : Argument1 object.
* @param keyMap
* : Common data structure used in plugin.
* @param commandIndex
* : Index of the Generated Command Objects.
* @return string object. Exceptions are thrown only on developer
* mistakes.Hence not having any.
*/
public final Object getStringValue(
final Argument arg, final Map<String, Object> keyMap, int index) {
Object returnobj = null;
returnobj = arg.getValue();
return returnobj;
}
/**
* create CIMObjectPath based on Arguments.
*
* @param arg
* @param keyMap
* @param index
* @return Object CIMObjectPath.
*/
public final Object createCIMPath(
final Argument arg, final Map<String, Object> keyMap, int index) {
String[] items = arg.getValue().toString().split(":");
CIMObjectPath path = CimObjectPathCreator.createInstance(items[1], items[0]);
return path;
}
public final Object getIntValue32(final Argument arg, final Map<String, Object> keyMap, int index) {
return getUnsignedInteger32(arg);
}
/**
* empty Out Array to hold return values.
*
* @param arg
* @param keyMap
* @param commandIndex
* @return Object
*/
public final Object getCIMArrayValue(
final Argument arg, final Map<String, Object> keyMap, int index) {
CIMArgument<?>[] outputArgs = new CIMArgument<?>[5];
return outputArgs;
}
/**
* keyMap has a key "XYZ". This method uses key "XYZ" to return the value.
* Value could be anything can be a java ref, CIM Object Path.. <Argument1
* Name="" Method="getReferenceValue"> <Value>XYZ<Value> <Argument1>
*
* @param argument
* : Argument1 object.
* @param keyMap
* : Common data structure used in plugin.
* @param Index
* : Index of the Generated Command Objects.
* @return string object.
*/
public final Object getReferenceValue(
final Argument argument, final Map<String, Object> keyMap, int index) {
Object referenceobj = null;
final String objectpath = (String) argument.getValue();
if (keyMap.containsKey(objectpath)) {
if (keyMap.get(objectpath) instanceof List<?>) {
@SuppressWarnings("unchecked")
final List<Object> objList = (List<Object>) keyMap.get(objectpath);
referenceobj = objList.get(index);
} else {
referenceobj = keyMap.get(objectpath);
}
} else {
_logger.debug("Reference key {} not present in Component Map", objectpath);
}
return referenceobj;
}
/**
* get List Value. <Argument1 Name="" Method="getListValue">
* <Value>XYZ<Value> <Argument1>
*
* @param arg
* : Argument1 object.
* @param keyMap
* : Common data structure used in plugin.
* @param index
* : Index of the Generated Command Objects.
* @return list object. Exceptions are thrown only on developer
* mistakes.Hence not having any.
*/
public final Object getListValue(
final Argument arg, final Map<String, Object> keyMap, int index) {
Object listObj = null;
String value = arg.getValue().toString();
if (keyMap.containsKey(value)) {
listObj = keyMap.get(value);
}
return listObj;
}
public final Object getReferenceValue1(String computerSystem) {
return new Object();
}
/**
* get Bool Value. <Argument1 Name="" Method="getBoolValue">
* <Value>false<Value> <Argument1>
*
* @param arg
* : Argument1 object.
* @param keyMap
* : Common data structure used in plugin.
*
* @param commandIndex
* : Index of the Generated Command Objects.
* @return string object.
*/
public final Boolean getBoolValue(
final Argument arg, final Map<String, Object> keyMap, int index) {
return Boolean.parseBoolean((String) arg.getValue());
}
/**
* get StringArray Value. This method will get the comma seperated values
* and gets converted into String Array. <Argument1 Name=""
* Method="getStringArrayValue"> <Value>XYZ,ABC,DEF<Value> <Argument1>
*
* @param arg
* : Argument1 object.
* @param keyMap
* : Common data structure used in plugin.
*
* @param commandIndex
* : Index of the Generated Command Objects.
* @return string object.
*/
public final Object getStringArrayValue(
final Argument arg, final Map<String, Object> keyMap, int index) {
String[] strArray = null;
if (arg.getValue() != null) {
String val = (String) arg.getValue();
strArray = val.split(",");
}
return strArray;
}
/**
* get Integer Value. This method will convert the String to integer.
* <Argument1 Name="" Method="getIntegerValue"> <Value>2<Value> <Argument1>
*
* @param arg
* : Argument1 object.
* @param keyMap
* : Common data structure used in plugin.
*
* @param commandIndex
* : Index of the Generated Command Objects.
* @return string object.
*/
public final Object getIntegerValue(
final Argument arg, final Map<String, Object> keyMap, int index) {
return Integer.parseInt((String) arg.getValue());
}
/**
* get IntegerArray Value. This method will convert the comma seperated
* Strings to integer Array. <Argument1 Name=""
* Method="getIntegerArrayValue"> <Value>2,5,4<Value> <Argument1>
*
* @param arg
* : Argument1 object.
* @param keyMap
* : Common data structure used in plugin.
*
* @param commandIndex
* : Index of the Generated Command Objects.
* @return string object.
*/
public final Object getIntegerArrayValue(
final Argument arg, final Map<String, Object> keyMap, int index) {
String[] arr = null;
if (arg.getValue() != null) {
String val = (String) arg.getValue();
arr = val.split(",");
}
int[] intarr = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
intarr[i] = Integer.parseInt(arr[i]);
}
return intarr;
}
/**
* In Performance collection scenarios, we need to create the value of an
* Argument1 to be a "Array of CIMArgument type Values ". Value of an
* Argument1 : Array of [ CIMArg[String], CIMArg[Integer] ] ; getCIMArgArray
* is used in creating this value format. <Arg Name=""
* Method="getCIMArgument" Instance="ArgsCreator"> <ValueList> <Arg
* Name="ElementName" Method="getStringValue" Instance="ArgCreator">
* <Value>SRM_SYSTEM</Value> </Arg> <Arg Name="ElementType"
* Method="getIntegerValue" Instance="ArgCreator"> <Value>2</Value> </Arg>
* </ValueList> </Arg>
*
* @param arg
* @param keyMap
* @param commandIndex
* @return Object
*/
public final Object getCIMArgArray(
final Argument arg, final Map<String, Object> keyMap, int index) {
CIMArgument<?>[] inputArgs = null;
List<Object> nameList = new ArrayList<Object>();
populateNameList(arg, nameList);
inputArgs = new CIMArgument[nameList.size()];
@SuppressWarnings("unchecked")
List<Object> valueObjList = (List<Object>) arg.getValue(); // need to
// change
int argCount = 0; // implementation
for (Object valargobj : valueObjList) {
Argument valarg = (Argument) valargobj;
// final Object instance = _util.returnInstance(valarg.getCreator(),
// keyMap);
final Object instance = valarg.getCreator();
final Method method = _util.getMethod(null, valarg.getMethod(), instance,
Util.ENDPOINTS.ARGUMENT.toString());
final Object[] Args = { valarg, keyMap, index };
try {
inputArgs[argCount] = (CIMArgument<?>) method.invoke(instance, Args);
} catch (IllegalArgumentException e) {
// Exceptions would arise, only in developer environments.
_logger.debug("Domain Logic XML creation problem");
} catch (IllegalAccessException e) {
_logger.debug("Domain Logic XML creation problem");
} catch (InvocationTargetException e) {
_logger.debug("Domain Logic XML creation problem");
}
argCount++;
}
return inputArgs;
}
public final Object getIntegerArrayValue16(
final Argument arg, final Map<String, Object> keyMap, int index) {
String[] arr = null;
if (arg.getValue() != null) {
String val = (String) arg.getValue();
arr = val.split(",");
}
UnsignedInteger16[] intarr = new UnsignedInteger16[arr.length];
for (int i = 0; i < arr.length; i++) {
intarr[i] = new UnsignedInteger16(Integer.parseInt(arr[i]));
}
return intarr;
}
/**
* CIMArg wrapper over a Reference
*
* @param arg
* @return Object
*/
public final Object getReferenceValueCIMWrapper(
final Argument arg, final Map<String, Object> keyMap, int index) {
Object value = getReferenceValue(arg, keyMap, index);
if (null != value) {
CIMObjectPath path = (CIMObjectPath) value;
return new CIMArgument<Object>(arg.getName(), CIMDataType.getDataType(path),
value);
}
return value;
}
/**
* CIMArg wrapper over a String
*
* @param arg
* @return Object
*/
public final Object getStringValueCIMWrapper(
final Argument arg, final Map<String, Object> keyMap, int index) {
Object value = getStringValue(arg, null, index);
if (null != value) {
return new CIMArgument<Object>(arg.getName(),
CIMDataType.getDataType(value), value);
}
return value;
}
public final Object getStringValueFromKey(
final Argument arg, final Map<String, Object> keyMap, final int index) {
if (keyMap.containsKey(arg.getName())) {
List<String> names = (List<String>) keyMap.get(arg.getName());
return names.get(index);
}
return null;
}
/**
*
* @param argument
* @param keyMap
* @param index
* @return
*/
public final InputStream getStreamValue(
final Argument argument, final Map<String, Object> keyMap, int index) {
InputStream iStream = getClass().getResourceAsStream(
argument.getValue().toString());
// set the proxy or any other configuration parameters here.
return iStream;
}
/**
* CIMArg wrapper over a StringArray
*
* @param arg
* @return Object
*/
public final Object getStringArrayValueCIMWrapper(
final Argument arg, final Map<String, Object> keyMap, int index) {
Object value = getStringArrayValue(arg, null, index);
if (null != value) {
return new CIMArgument<Object>(arg.getName(), CIMDataType.STRING_ARRAY_T,
value);
}
return value;
}
/**
* CIMArg wrapper over a StringArray
*
* @param arg
* @return Object
*/
public final Object getBooleanValueCIMWrapper(
final Argument arg, final Map<String, Object> keyMap, int index) {
Object value = getBoolValue(arg, null, index);
if (null != value) {
return new CIMArgument<Object>(arg.getName(), CIMDataType.BOOLEAN_T, value);
}
return value;
}
/**
* CIMArg wrapper over an Integer
*
* @param arg
* @return Object
*/
public final Object getIntValueCIMWrapper(
final Argument arg, final Map<String, Object> keyMap, int index) {
Object value = getUnsignedInteger16(arg);
if (null != value) {
return new CIMArgument<Object>(arg.getName(), CIMDataType.UINT16_T, value);
}
return value;
}
/**
* CIMArg wrapper over an Integer Array
*
* @param arg
* @return Object
*/
public final Object getIntegerArrayValueCIMWrapper(
final Argument arg, final Map<String, Object> keyMap, int index) {
Object value = getIntegerArrayValue16(arg, null, index);
if (null != value) {
// workaround
_logger.info(CIMDataType.getDataType(value).toString());
return new CIMArgument<Object>(arg.getName(), CIMDataType.UINT16_ARRAY_T,
value);
}
return value;
}
/**
* CIMArg wrapper over an Integer
*
* @param arg
* @return Object
*/
public final Object getIntValue16CIMWrapper(
final Argument arg, final Map<String, Object> keyMap, int index) {
UnsignedInteger16 value = getUnsignedInteger16(arg);
if (null != value) {
return new CIMArgument<Object>(arg.getName(), CIMDataType.UINT16_T, value);
}
return value;
}
/**
* CIMArg wrapper over an Integer
*
* @param arg
* @return Object
*/
public final Object getIntValue64CIMWrapper(
final Argument arg, final Map<String, Object> keyMap, int index) {
UnsignedInteger64 value = getUnsignedInteger64(arg);
if (null != value) {
UnsignedInteger64 val = new UnsignedInteger64(value.toString());
return new CIMArgument<Object>(arg.getName(), CIMDataType.UINT64_T, val);
}
return value;
}
/**
* populate Name List from the Arguments inside ValueList
*
* @param arg
* @param nameList
*/
private final void populateNameList(final Argument arg, final List<Object> nameList) {
List<Object> valueObjList = (List<Object>) arg.getValue();
for (Object valargobj : valueObjList) {
Argument valarg = (Argument) valargobj;
nameList.add(valarg.getName());
}
}
/**
* Creates UnsignedInteger16 instance for the give Argument.value.
*
* @param arg
* @return
*/
public final UnsignedInteger16 getUnsignedInteger16(final Argument arg) {
UnsignedInteger16 value = null;
if (arg.getValue() != null) {
value = new UnsignedInteger16((String) arg.getValue());
}
return value;
}
/**
* Creates UnsignedInteger32 instance for the give Argument.value.
*
* @param arg
* @return
*/
public final UnsignedInteger32 getUnsignedInteger32(final Argument arg) {
UnsignedInteger32 value = null;
if (arg.getValue() != null) {
value = new UnsignedInteger32((String) arg.getValue());
}
return value;
}
/**
* Creates UnsignedInteger64 instance for the give Argument.value.
*
* @param arg
* @return
*/
public final UnsignedInteger64 getUnsignedInteger64(final Argument arg) {
UnsignedInteger64 value = null;
if (arg.getValue() != null) {
value = new UnsignedInteger64((String) arg.getValue());
}
return value;
}
}