package org.ff4j.utils;
import java.util.HashMap;
/*
* #%L
* ff4j-core
* %%
* Copyright (C) 2013 Ff4J
* %%
* Licensed 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.
* #L%
*/
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.ff4j.core.FlippingStrategy;
import org.ff4j.exception.FeatureAccessException;
import org.ff4j.property.PropertyString;
import org.ff4j.property.PropertyBigDecimal;
import org.ff4j.property.PropertyBigInteger;
import org.ff4j.property.PropertyBoolean;
import org.ff4j.property.PropertyByte;
import org.ff4j.property.PropertyCalendar;
import org.ff4j.property.PropertyDate;
import org.ff4j.property.PropertyDouble;
import org.ff4j.property.PropertyFloat;
import org.ff4j.property.PropertyInt;
import org.ff4j.property.PropertyLogLevel;
import org.ff4j.property.PropertyLong;
import org.ff4j.property.PropertyShort;
/**
* Utility class to work with parameters.
*
* @author Cedrick Lunven (@clunven)
*/
public class MappingUtil {
/** Separator to propose parameters. */
private static final String SEPARATOR = "&";
/** Primitive mapping. */
private static Map < String, String > PROPERTY_TYPES;
/**
* Hiding default constructor for utility class.
*/
private MappingUtil() {}
/** Substitution in XML or any store. */
/**
* Initialisation of substitution types
*/
static {
PROPERTY_TYPES = new HashMap<String, String >();
PROPERTY_TYPES.put("byte", PropertyByte.class.getName());
PROPERTY_TYPES.put("boolean", PropertyBoolean.class.getName());
PROPERTY_TYPES.put("bigdecimal", PropertyBigDecimal.class.getName());
PROPERTY_TYPES.put("biginteger", PropertyBigInteger.class.getName());
PROPERTY_TYPES.put("calendar", PropertyCalendar.class.getName());
PROPERTY_TYPES.put("date", PropertyDate.class.getName());
PROPERTY_TYPES.put("double", PropertyDouble.class.getName());
PROPERTY_TYPES.put("float", PropertyFloat.class.getName());
PROPERTY_TYPES.put("int", PropertyInt.class.getName());
PROPERTY_TYPES.put("loglevel", PropertyLogLevel.class.getName());
PROPERTY_TYPES.put("short", PropertyShort.class.getName());
PROPERTY_TYPES.put("long", PropertyLong.class.getName());
PROPERTY_TYPES.put("string", PropertyString.class.getName());
}
/**
* Substitution of primitive into PropertyXXX.
* Allows to TODO
* @param pType
* @return
*/
public static String mapPropertyType(String pType) {
if (pType == null) return null;
if (PROPERTY_TYPES.containsKey(pType.toLowerCase())) {
return PROPERTY_TYPES.get(pType.toLowerCase());
}
return pType;
}
/**
* Substitution of PropertyXXX intoPrimitive.
*
* Allows to TODO
* @param pType
* @return
*/
public static String mapSimpleType(String className) {
if (className == null) return className;
if (PROPERTY_TYPES.containsValue(className)) {
return Util.getFirstKeyByValue(PROPERTY_TYPES, className);
}
return className;
}
/**
* Substitution of primitive into PropertyXXX.
* Allows to TODO
* @param pType
* @return
*/
public static String mapSimpleType(Class<?> pType) {
if (pType == null) return null;
return mapSimpleType(pType.getName());
}
/**
* Utility Method to convert Parameter Map into String.
*
* @param params
* parameter MAP
* @return parameters as String
*/
public static final String fromMap(Map < String, String > params) {
StringBuilder strBulBuilder = new StringBuilder();
boolean first = true;
if (params != null && !params.isEmpty()) {
for (Entry<String, String> entry : params.entrySet()) {
if (!first) {
strBulBuilder.append(SEPARATOR);
}
strBulBuilder.append(entry.getKey() + "=" + entry.getValue());
first = false;
}
}
return strBulBuilder.toString();
}
/**
* Utility method to convert parameters as Map
*
* @param strParam
* convert String param as Map.
* @return map of parameters.
*/
public static final Map<String, String> toMap(String strParam) {
LinkedHashMap<String, String> parameters = new LinkedHashMap<String, String>();
if (strParam != null) {
String[] chunks = strParam.split("\\" + SEPARATOR);
for (String chunk : chunks) {
int idxEqual = chunk.indexOf("=");
if (idxEqual > 0 && idxEqual < chunk.length()) {
String paramName = chunk.substring(0, idxEqual);
String paramValue = chunk.substring(idxEqual + 1);
parameters.put(paramName, paramValue);
}
}
}
return parameters;
}
/**
* Instanciate flipping strategy from its class name.
*
* @param className
* current class name
* @return
* the flipping strategy
*/
public static FlippingStrategy instanceFlippingStrategy(String uid, String className, Map<String, String> initparams) {
try {
FlippingStrategy flipStrategy = (FlippingStrategy) Class.forName(className).newInstance();
flipStrategy.init(uid, initparams);
return flipStrategy;
} catch (Exception ie) {
throw new FeatureAccessException("Cannot instantiate Strategy, no default constructor available", ie);
}
}
}