/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.isis.applib.fixturescripts;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Collections;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Maps;
import com.google.common.io.CharSource;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.joda.time.LocalDateTime;
import org.joda.time.format.ISODateTimeFormat;
public class ExecutionParameters {
private final static Pattern keyEqualsValuePattern = Pattern.compile("([^=]*)=(.*)");
private final String parameters;
private final Map<String, String> parameterMap;
public ExecutionParameters(final String parameters) {
this.parameters = parameters;
this.parameterMap = asKeyValueMap(parameters);
}
static Map<String, String> asKeyValueMap(final String parameters) {
final Map<String, String> keyValues = Maps.newLinkedHashMap();
if (parameters != null) {
try {
final ImmutableList<String> lines = CharSource.wrap(parameters).readLines();
for (final String line : lines) {
if (line == null) {
continue;
}
final Matcher matcher = keyEqualsValuePattern.matcher(line);
if (matcher.matches()) {
keyValues.put(matcher.group(1).trim(), matcher.group(2).trim());
}
}
} catch (final IOException e) {
// ignore, shouldn't happen
}
}
return keyValues;
}
public String getParameters() {
return parameters;
}
public String getParameter(final String parameterName) {
return parameterMap.get(parameterName);
}
public <T> T getParameterAsT(final String parameterName, final Class<T> cls) {
T value = null;
if (Enum.class.isAssignableFrom(cls)) {
Class enumClass = cls;
value = (T) getParameterAsEnum(parameterName, enumClass);
} else if (cls == Boolean.class) {
value = (T) getParameterAsBoolean(parameterName);
} else if (cls == Byte.class) {
value = (T) getParameterAsByte(parameterName);
} else if (cls == Short.class) {
value = (T) getParameterAsShort(parameterName);
} else if (cls == Integer.class) {
value = (T) getParameterAsInteger(parameterName);
} else if (cls == Long.class) {
value = (T) getParameterAsLong(parameterName);
} else if (cls == Float.class) {
value = (T) getParameterAsFloat(parameterName);
} else if (cls == Double.class) {
value = (T) getParameterAsDouble(parameterName);
} else if (cls == Character.class) {
value = (T) getParameterAsCharacter(parameterName);
} else if (cls == BigDecimal.class) {
value = (T) getParameterAsBigDecimal(parameterName);
} else if (cls == BigInteger.class) {
value = (T) getParameterAsBigInteger(parameterName);
} else if (cls == LocalDate.class) {
value = (T) getParameterAsLocalDate(parameterName);
} else if (cls == LocalDateTime.class) {
value = (T) getParameterAsLocalDateTime(parameterName);
} else if (cls == String.class) {
value = (T) getParameter(parameterName);
}
return value;
}
public Boolean getParameterAsBoolean(final String parameterName) {
final String value = getParameter(parameterName);
if (Strings.isNullOrEmpty(value)) {
return null;
}
return Boolean.valueOf(value);
}
public Byte getParameterAsByte(final String parameterName) {
final String value = getParameter(parameterName);
if (Strings.isNullOrEmpty(value)) {
return null;
}
return Byte.valueOf(value);
}
public Short getParameterAsShort(final String parameterName) {
final String value = getParameter(parameterName);
if (Strings.isNullOrEmpty(value)) {
return null;
}
return Short.valueOf(value);
}
public Integer getParameterAsInteger(final String parameterName) {
final String value = getParameter(parameterName);
if (Strings.isNullOrEmpty(value)) {
return null;
}
return Integer.valueOf(value);
}
public Long getParameterAsLong(final String parameterName) {
final String value = getParameter(parameterName);
if (Strings.isNullOrEmpty(value)) {
return null;
}
return Long.valueOf(value);
}
public Float getParameterAsFloat(final String parameterName) {
final String value = getParameter(parameterName);
if (Strings.isNullOrEmpty(value)) {
return null;
}
return Float.valueOf(value);
}
public Double getParameterAsDouble(final String parameterName) {
final String value = getParameter(parameterName);
if (Strings.isNullOrEmpty(value)) {
return null;
}
return Double.valueOf(value);
}
public Character getParameterAsCharacter(final String parameterName) {
final String value = getParameter(parameterName);
if (Strings.isNullOrEmpty(value)) {
return null;
}
return Character.valueOf(value.charAt(0));
}
public BigInteger getParameterAsBigInteger(final String parameterName) {
final String value = getParameter(parameterName);
if (Strings.isNullOrEmpty(value)) {
return null;
}
return new BigInteger(value);
}
public BigDecimal getParameterAsBigDecimal(final String parameterName) {
final String value = getParameter(parameterName);
if (Strings.isNullOrEmpty(value)) {
return null;
}
return new BigDecimal(value);
}
public LocalDate getParameterAsLocalDate(final String parameterName) {
final String value = getParameter(parameterName);
if (value == null) {
return null;
}
return LocalDate.parse(value);
}
public LocalDateTime getParameterAsLocalDateTime(final String parameterName) {
final String value = getParameter(parameterName);
if (value == null) {
return null;
}
return LocalDateTime.parse(value);
}
public <T extends Enum<T>> T getParameterAsEnum(final String parameterName, final Class<T> enumClass) {
final String value = getParameter(parameterName);
return valueOfElseNull(enumClass, value);
}
private static <T extends Enum<T>> T valueOfElseNull(final Class<T> enumClass, final String value) {
if (value == null) {
return null;
}
final T[] enumConstants = enumClass.getEnumConstants();
for (T enumConstant : enumConstants) {
if (enumConstant.name().equals(value)) {
return enumConstant;
}
}
return null;
}
public Map<String, String> getParameterMap() {
return Collections.unmodifiableMap(parameterMap);
}
public void setParameterIfNotPresent(final String parameterName, final String parameterValue) {
if (parameterName == null) {
throw new IllegalArgumentException("parameterName required");
}
if (parameterValue == null) {
// ignore
return;
}
if (parameterMap.containsKey(parameterName)) {
// ignore; the existing parameter take precedence
return;
}
parameterMap.put(parameterName, parameterValue);
}
public void setParameter(final String parameterName, final Boolean parameterValue) {
setParameter(parameterName, parameterValue != null ? parameterValue.toString() : null);
}
public void setParameter(final String parameterName, final Byte parameterValue) {
setParameter(parameterName, parameterValue != null ? parameterValue.toString() : null);
}
public void setParameter(final String parameterName, final Short parameterValue) {
setParameter(parameterName, parameterValue != null ? parameterValue.toString() : null);
}
public void setParameter(final String parameterName, final Integer parameterValue) {
setParameter(parameterName, parameterValue != null ? parameterValue.toString() : null);
}
public void setParameter(final String parameterName, final Long parameterValue) {
setParameter(parameterName, parameterValue != null ? parameterValue.toString() : null);
}
public void setParameter(final String parameterName, final Float parameterValue) {
setParameter(parameterName, parameterValue != null ? parameterValue.toString() : null);
}
public void setParameter(final String parameterName, final Double parameterValue) {
setParameter(parameterName, parameterValue != null ? parameterValue.toString() : null);
}
public void setParameter(final String parameterName, final Character parameterValue) {
setParameter(parameterName, parameterValue != null ? parameterValue.toString() : null);
}
public void setParameter(final String parameterName, final BigInteger parameterValue) {
setParameter(parameterName, parameterValue != null ? parameterValue.toString() : null);
}
public void setParameter(final String parameterName, final java.util.Date parameterValue) {
setParameter(parameterName, parameterValue != null ? parameterValue.toString() : null);
}
public void setParameter(final String parameterName, final java.sql.Date parameterValue) {
setParameter(parameterName, parameterValue != null ? parameterValue.toString() : null);
}
public void setParameter(final String parameterName, final LocalDate parameterValue) {
setParameter(parameterName, parameterValue != null ? parameterValue.toString() : null);
}
public void setParameter(final String parameterName, final LocalDateTime parameterValue) {
setParameter(parameterName, parameterValue != null ? parameterValue.toString() : null);
}
public void setParameter(final String parameterName, final DateTime parameterValue) {
final StringBuffer buf = new StringBuffer();
ISODateTimeFormat.dateTimeParser().printTo(buf, parameterValue);
setParameter(parameterName, parameterValue != null ? buf.toString() : null);
}
public void setParameter(final String parameterName, final BigDecimal parameterValue) {
setParameter(parameterName, parameterValue != null ? parameterValue.toString() : null);
}
public void setParameter(final String parameterName, final Enum<?> parameterValue) {
setParameter(parameterName, parameterValue != null ? parameterValue.name() : null);
}
public void setParameter(final String parameterName, final String parameterValue) {
if (parameterName == null) {
throw new IllegalArgumentException("parameterName required");
}
if (parameterValue == null) {
// ignore
return;
}
parameterMap.put(parameterName, parameterValue);
}
}