package uws.job.parameters; /* * This file is part of UWSLibrary. * * UWSLibrary is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * UWSLibrary 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with UWSLibrary. If not, see <http://www.gnu.org/licenses/>. * * Copyright 2012-2016 - UDS/Centre de DonnĂ©es astronomiques de Strasbourg (CDS), * Astronomisches Rechen Institut (ARI) */ import uws.UWSException; /** * Let controlling a String parameter. * * @author Grégory Mantelet (CDS;ARI) * @version 4.2 (06/2016) */ public class StringParamController implements InputParamController { /** Name of the controlled parameter. */ private final String paramName; /** Default value of this parameter. * <i>By default: <code>null</code></i> */ private String defaultValue = null; /** List of all allowed values. If NULL, any value is allowed. * <i>By default: <code>null</code></i> */ private String[] possibleValues = null; /** Regular Expression that any value of this input parameter must match in order to be valid. * <i>By default: <code>null</code>.</i> * @since 4.2 */ private String regexp = null; /** Tells whether the parameter can be modified after its initialization. */ private boolean allowModification = true; /** * Builds a controller of the specified String parameter. * * @param paramName Name of the controlled parameter. * * @see #StringParamController(String, String, String[], boolean) */ public StringParamController(final String paramName){ this(paramName, null, (String[])null, true); } /** * Builds a controller of the specified String parameter and configures it. * * @param paramName Name of the controlled parameter. * @param defaultValue Default value of this parameter. <i><u>note:</u> It may be NULL. If the next parameter is not NULL or empty, the default value must be one of its values.</i> * @param possibleValues List of all allowed values. <i><u>note:</u> It may be NULL or empty. In this case, any value is allowed.</i> * @param allowModif <i>true</i> to allow the modification of the specified parameter after its initialization, <i>false</i> otherwise. */ public StringParamController(final String paramName, final String defaultValue, final String[] possibleValues, final boolean allowModif){ this.paramName = paramName; setDefaultValue(defaultValue); setPossibleValues(possibleValues); allowModification(allowModif); } /** * Builds a controller of the specified String parameter and configures it. * * @param paramName Name of the controlled parameter. * @param defaultValue Default value of this parameter. <i><u>note:</u> It may be NULL. If the next parameter is not NULL or empty, the default value must be one of its values.</i> * @param regExp Regular Expression that any value of this parameter must match. <i><u>note:</u> It may be NULL or empty. In this case, any value is allowed.</i> * @param allowModif <i>true</i> to allow the modification of the specified parameter after its initialization, <i>false</i> otherwise. */ public StringParamController(final String paramName, final String defaultValue, final String regExp, final boolean allowModif){ this.paramName = paramName; setDefaultValue(defaultValue); setRegExp(regExp); allowModification(allowModif); } /** * Gets the default value of the parameter. * * @return The default value. (MAY BE NULL) */ public final String getDefaultValue(){ return defaultValue; } /** * Sets the default value of the parameter. * * @param defaultValue The new default value. (MAY BE NULL) */ public final void setDefaultValue(String defaultValue){ this.defaultValue = defaultValue; } /** * Gets the Regular Expression that all values of this parameter must match. * * @return The current Regular Expression. (MAY BE NULL) * * @since 4.2 */ public final String getRegExp(){ return regexp; } /** * Sets the Regular Expression that all values of this parameter must match. * * <p><b>Warning:</b> setting a non empty regular expression will set to <code>null</code> * any list of allowed values eventually set in this controller. * </p> * * @param regExp The new Regular Expression. <i><u>note:</u> If NULL or empty, any value is allowed.</i> * * @since 4.2 */ public final void setRegExp(String regExp){ if (regExp != null && regExp.length() > 0){ this.regexp = regExp; this.possibleValues = null; }else this.regexp = null; } /** * Gets the list of all allowed values. * * @return The allowed values. <i><u>note:</u> If NULL or empty, any value is allowed.</i> */ public final String[] getPossibleValues(){ return possibleValues; } /** * Sets the list of all allowed values. * * <p><b>Warning:</b> setting a non empty list of values will set to <code>null</code> * any regular expression eventually set in this controller. * </p> * * @param possibleValues The new allowed values. <i><u>note:</u> If NULL or empty, any value is allowed.</i> */ public final void setPossibleValues(String[] possibleValues){ if (possibleValues == null || possibleValues.length == 0) this.possibleValues = null; else{ this.possibleValues = possibleValues; this.regexp = null; } } @Override public final boolean allowModification(){ return allowModification; } /** * Lets telling if the parameter can be modified after it initialization. * * @param allowModif <i>true</i> to allow its modification after initialization, <i>false</i> otherwise. */ public final void allowModification(final boolean allowModif){ allowModification = allowModif; } @Override public Object check(Object value) throws UWSException{ if (value == null) return null; if (value instanceof String){ String strValue = (String)value; if (possibleValues != null && possibleValues.length > 0){ for(String v : possibleValues){ if (strValue.equalsIgnoreCase(v)) return v; } throw new UWSException(UWSException.BAD_REQUEST, "Unknown value for the parameter \"" + paramName + "\": \"" + strValue + "\". It should be " + getExpectedFormat()); }else if (regexp != null){ if (strValue.matches(regexp)) return strValue; else throw new UWSException(UWSException.BAD_REQUEST, "Incorrect value for the property \"" + paramName + "\": \"" + strValue + "\". It should be " + getExpectedFormat()); }else return strValue; }else throw new UWSException(UWSException.INTERNAL_SERVER_ERROR, "Wrong type for the parameter \"" + paramName + "\": \"" + value.getClass().getName() + "\"! It should be a String."); } /** * Gets a string which lists all the allowed values. * * @return A string which describes the format expected by this controller. */ protected final String getExpectedFormat(){ if (possibleValues != null && possibleValues.length > 0){ StringBuffer buffer = new StringBuffer("a String value among: "); for(int i = 0; i < possibleValues.length; i++) buffer.append((i == 0) ? "" : ", ").append(possibleValues[i]); return buffer.toString(); }else if (regexp != null) return "a String matching this Regular Expression: " + regexp; else return "a String value."; } @Override public Object getDefault(){ return defaultValue; } }