/* * Copyright (c) 2006-2011 Nuxeo SA (http://nuxeo.com/) and others. * * 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: * bstefanescu */ package org.eclipse.ecr.build; import java.util.HashMap; import java.util.Map; /** * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a> * */ public class Vars { public static interface Resolver { String get(String key); } public static Map<String,String> expand(final Map<String,String> vars) { return expand(vars, null); } public static Map<String,String> expand(final Map<String,String> vars, final Resolver resolver) { final Map<String,String> result = new HashMap<String, String>(vars.size()); Resolver resolver2 = new Resolver() { @Override public String get(String key) { String v = result.get(key); if (v == null) { v = vars.get(key); if (v == null && resolver != null) { return resolver.get(key); } } return v; } }; for (Map.Entry<?,?> entry : vars.entrySet()) { String key = (String)entry.getKey(); String v = (String)entry.getValue(); if (v == null) { result.put(key, null); } else { String rv = expand(v, resolver2); while (!rv.equals(v)) { v = rv; rv = expand(v, resolver2); } result.put(key, rv); } } return result; } public static String expand(String expression, final Map<?,?> vars) { int s = expression.indexOf("${", 0); if (s == -1) { return expression; } int e = expression.indexOf('}', s+2); if (e == -1) { return expression; } return expand(expression, 0, s, e, new Resolver() { @Override public String get(String key) { Object v = vars.get(key); return v != null ? v.toString() : null; } }); } public static String expand(String expression, Resolver resolver) { int s = expression.indexOf("${", 0); if (s == -1) { return expression; } int e = expression.indexOf('}', s+2); if (e == -1) { return expression; } return expand(expression, 0, s, e, resolver); } private static String expand(String expression, int offset, int s, int e, Resolver resolver) { StringBuilder buf = new StringBuilder(); do { if (s > offset) { buf.append(expression.substring(offset, s)); } String v = resolveVar(expression.substring(s+2, e), resolver); if (v == null) { buf.append(expression.substring(s,e+1)); } else { buf.append(v); } offset = e + 1; s = expression.indexOf("${", offset); if (s == -1) { break; } e = expression.indexOf('}', s+2); if (e == -1) { break; } } while (true); if (offset < expression.length()) { buf.append(expression.substring(offset)); } return buf.toString(); } private final static String resolveVar(String var, Resolver resolver) { String key = var; int i = var.indexOf('?'); if (i > -1) { key = key.substring(0, i); Object v = resolver.get(key); if (v != null) { return v.toString(); } else { return var.substring(i+1); } } Object v = resolver.get(key); return v != null ? v.toString() : null; } }