/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.commons.lang; import java.util.Map; /** A deserializer that resolve system properties to allow runtime configuration. */ public class Deserializer { /** * Resolve the variables of type ${my.var} for the current context from the system * properties * * @param input * the input value * @return the resolve value */ public static String resolveVariables(String input) { return resolveVariables(input, null, true); } /** * Resolve the variables of type ${my.var} for the current context which is composed * only of the given settings * * @param input * the input value * @param props * a set of parameters to add for the variable resolution * @return the resolve value */ public static String resolveVariables(String input, Map<String, String> props) { return resolveVariables(input, props, true); } /** * Resolve the variables of type ${my.var} for the current context which is composed * of the system properties and the given settings * * @param input * the input value * @param props * a set of parameters to add for the variable resolution * @return the resolve value */ public static String resolveVariables(String input, Map<String, String> props, boolean includeSysProps) { final int NORMAL = 0; final int SEEN_DOLLAR = 1; final int IN_BRACKET = 2; if (input == null) { return input; } if (!includeSysProps && (props == null || props.size() == 0)) { return input; } char[] chars = input.toCharArray(); StringBuffer buffer = new StringBuffer(); boolean properties = false; int state = NORMAL; int start = 0; for (int i = 0; i < chars.length; ++i) { char c = chars[i]; if (c == '$' && state != IN_BRACKET) { state = SEEN_DOLLAR; } else if (c == '{' && state == SEEN_DOLLAR) { buffer.append(input.substring(start, i - 1)); state = IN_BRACKET; start = i - 1; } else if (state == SEEN_DOLLAR) { state = NORMAL; } else if (c == '}' && state == IN_BRACKET) { if (start + 2 == i) { buffer.append("${}"); } else { String value = null; String key = input.substring(start + 2, i); if (props != null) { // Some parameters have been given thus we need to check // inside first String sValue = props.get(key); value = sValue == null || sValue.length() == 0 ? null : sValue; } if (value == null && includeSysProps) { // try to get it from the system properties value = System.getProperty(key); } if (value != null) { properties = true; buffer.append(value); } } start = i + 1; state = NORMAL; } } if (properties == false) { return input; } if (start != chars.length) { buffer.append(input.substring(start, chars.length)); } return buffer.toString(); } }