/* This file belongs to the Servoy development and deployment environment, Copyright (C) 1997-2010 Servoy BV This program is free software; you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program; if not, see http://www.gnu.org/licenses or write to the Free Software Foundation,Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 */ package com.servoy.j2db.scripting; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import com.servoy.j2db.server.annotations.TerracottaInstrumentedClass; /** * This class represents a object containing all the startup arguments * * @author gboros */ @TerracottaInstrumentedClass public class StartupArguments extends HashMap<String, Object> { private static final long serialVersionUID = 1L; public static final String PARAM_KEY_SOLUTION = "solution"; //$NON-NLS-1$ public static final String PARAM_KEY_METHOD = "method"; //$NON-NLS-1$ public static final String PARAM_KEY_ARGUMENT = "argument"; //$NON-NLS-1$ public static final String PARAM_KEY_CLIENT_IDENTIFIER = "CI"; //$NON-NLS-1$ public static final String PARAM_KEY_SHORT_SOLUTION = "s"; //$NON-NLS-1$ private static final String PARAM_KEY_SHORT_METHOD = "m"; //$NON-NLS-1$ private static final String PARAM_KEY_SHORT_ARGUMENT = "a"; //$NON-NLS-1$ public static final char PARAM_KEY_VALUE_SEPARATOR = ':'; private static final Set<String> excludeKeys = new HashSet<String>(Arrays.asList(new String[] { "sessionid", "windowid", "windowname" })); public StartupArguments() { super(); } /** * @param arguments the map of arguments where the key is the argName and the value is the argValue */ public StartupArguments(Map<String, ? > arguments) { super(); for (Map.Entry<String, ? > entry : arguments.entrySet()) { put(entry.getKey(), entry.getValue()); } } /** * @param sArguments the array of arguments, where each element is of type argName:argValue */ public StartupArguments(String[] sArguments) { super(); if (sArguments != null) { String key, value; int sepIdx; for (String element : sArguments) { if (element != null && (sepIdx = element.indexOf(PARAM_KEY_VALUE_SEPARATOR)) > 0) { key = element.substring(0, sepIdx); value = sepIdx < element.length() - 1 ? element.substring(sepIdx + 1) : ""; //$NON-NLS-1$ put(key, value); } } } } @Override public Object put(String key, Object value) { if (excludeKeys.contains(key)) return null; Object keyValue = null; if (value instanceof String) { keyValue = value; } else if (value instanceof String[] && ((String[])value).length > 0) { String[] sParamValue = (String[])value; if (sParamValue.length > 1) { JSMap array = new JSMap("Array"); //$NON-NLS-1$ for (int i = 0; i < sParamValue.length; i++) array.put(Integer.valueOf(i), sParamValue[i]); keyValue = array; } else keyValue = sParamValue[0]; } else if (value instanceof List< ? > && ((List<String>)value).size() > 0) { List<String> sParamValue = (List<String>)value; if (sParamValue.size() > 1) { JSMap array = new JSMap("Array"); //$NON-NLS-1$ for (int i = 0; i < sParamValue.size(); i++) array.put(Integer.valueOf(i), sParamValue.get(i)); keyValue = array; } else keyValue = sParamValue.get(0); } if (keyValue != null) { if (key == PARAM_KEY_ARGUMENT || key == PARAM_KEY_SHORT_ARGUMENT) jsMap = null; // force rebuild return super.put(key, keyValue); } return null; } public void setSolutionName(String solutionName) { if (solutionName == null) { remove(StartupArguments.PARAM_KEY_SOLUTION); remove(StartupArguments.PARAM_KEY_SHORT_SOLUTION); } else { put(StartupArguments.PARAM_KEY_SOLUTION, solutionName); put(StartupArguments.PARAM_KEY_SHORT_SOLUTION, solutionName); } } public String getSolutionName() { Object solutionName = get(StartupArguments.PARAM_KEY_SOLUTION); if (solutionName == null) solutionName = get(StartupArguments.PARAM_KEY_SHORT_SOLUTION); return solutionName == null ? null : solutionName.toString(); } public void setMethodName(String methodName) { if (methodName == null) { remove(StartupArguments.PARAM_KEY_METHOD); remove(StartupArguments.PARAM_KEY_SHORT_METHOD); } else { put(StartupArguments.PARAM_KEY_METHOD, methodName); put(StartupArguments.PARAM_KEY_SHORT_METHOD, methodName); } } public String getMethodName() { Object methodName = get(StartupArguments.PARAM_KEY_METHOD); if (methodName == null) methodName = get(StartupArguments.PARAM_KEY_SHORT_METHOD); return methodName == null ? null : methodName.toString(); } public void setFirstArgument(String firstArgument) { if (firstArgument == null) { remove(StartupArguments.PARAM_KEY_ARGUMENT); remove(StartupArguments.PARAM_KEY_SHORT_ARGUMENT); } else { put(StartupArguments.PARAM_KEY_ARGUMENT, firstArgument); put(StartupArguments.PARAM_KEY_SHORT_ARGUMENT, firstArgument); } } public String getFirstArgument() { Object firstArgument = get(StartupArguments.PARAM_KEY_ARGUMENT); if (firstArgument == null) firstArgument = get(StartupArguments.PARAM_KEY_SHORT_ARGUMENT); if (firstArgument instanceof JSMap) firstArgument = ((JSMap)firstArgument).get(Integer.valueOf(0)); return firstArgument == null ? null : firstArgument.toString(); } public void setClientIdentifier(String clientIdentifier) { if (clientIdentifier == null) { remove(StartupArguments.PARAM_KEY_CLIENT_IDENTIFIER); } else { put(StartupArguments.PARAM_KEY_CLIENT_IDENTIFIER, clientIdentifier); } } public String getClientIdentifier() { Object clientIdentifier = get(StartupArguments.PARAM_KEY_CLIENT_IDENTIFIER); return clientIdentifier == null ? null : clientIdentifier.toString(); } private JSMap jsMap; public JSMap toJSMap() { if (jsMap == null) { jsMap = new JSMap(); Object key; for (Map.Entry<String, Object> e : entrySet()) { key = e.getKey(); if (StartupArguments.PARAM_KEY_SOLUTION.equals(key) || StartupArguments.PARAM_KEY_METHOD.equals(key) || StartupArguments.PARAM_KEY_CLIENT_IDENTIFIER.equals(key) || StartupArguments.PARAM_KEY_SHORT_SOLUTION.equals(key) || StartupArguments.PARAM_KEY_SHORT_METHOD.equals(key) || (key != null && key.toString().startsWith("system.property."))) continue; //$NON-NLS-1$ jsMap.put(e.getKey(), e.getValue()); } Object shortArgumentValue = jsMap.get(StartupArguments.PARAM_KEY_SHORT_ARGUMENT); if (shortArgumentValue != null) { Object argumentValue = jsMap.get(StartupArguments.PARAM_KEY_ARGUMENT); if (argumentValue != null) { JSMap argumentValueMap; if (argumentValue instanceof JSMap) { argumentValueMap = (JSMap)argumentValue; } else { argumentValueMap = new JSMap("Array"); //$NON-NLS-1$ argumentValueMap.put(Integer.valueOf(0), jsMap.get(StartupArguments.PARAM_KEY_ARGUMENT)); jsMap.put(StartupArguments.PARAM_KEY_ARGUMENT, argumentValueMap); } int argumentValueMapSize = argumentValueMap.size(); if (shortArgumentValue instanceof JSMap) { JSMap shortArgumentValueMap = (JSMap)shortArgumentValue; for (int i = 0; i < shortArgumentValueMap.size(); i++) { argumentValueMap.put(Integer.valueOf(argumentValueMapSize + i), shortArgumentValueMap.get(Integer.valueOf(i))); } } else argumentValueMap.put(Integer.valueOf(argumentValueMapSize), shortArgumentValue); } else jsMap.put(StartupArguments.PARAM_KEY_ARGUMENT, shortArgumentValue); jsMap.remove(StartupArguments.PARAM_KEY_SHORT_ARGUMENT); } } return jsMap; } }