package org.vertexium.id; import com.google.common.base.Splitter; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.apache.commons.lang3.tuple.MutablePair; import org.apache.commons.lang3.tuple.Pair; import org.vertexium.util.IterableUtils; import org.vertexium.util.VertexiumLogger; import org.vertexium.util.VertexiumLoggerFactory; import java.util.Collections; import java.util.List; import java.util.Map; public class SimpleSubstitutionUtils { private static final VertexiumLogger LOGGER = VertexiumLoggerFactory.getLogger(SimpleSubstitutionUtils.class); public static final String SUBSTITUTION_MAP_PREFIX = "substitution"; public static final String KEY_IDENTIFIER = "key"; public static final String VALUE_IDENTIFIER = "value"; public static List<Pair<String, String>> getSubstitutionList(Map configuration) { Map<String, MutablePair<String, String>> substitutionMap = Maps.newHashMap(); //parse the config arguments for (Object objKey : configuration.keySet()) { String key = objKey.toString(); if (key.startsWith(SUBSTITUTION_MAP_PREFIX + ".")) { List<String> parts = Lists.newArrayList(IterableUtils.toList(Splitter.on('.').split(key))); String pairKey = parts.get(parts.size() - 2); String valueType = parts.get(parts.size() - 1); if (!substitutionMap.containsKey(pairKey)) { substitutionMap.put(pairKey, new MutablePair<String, String>()); } MutablePair<String, String> pair = substitutionMap.get(pairKey); if (KEY_IDENTIFIER.equals(valueType)) { pair.setLeft(configuration.get(key).toString()); } else if (VALUE_IDENTIFIER.equals(valueType)) { pair.setValue(configuration.get(key).toString()); } } } //order is important, so create order by the pairKey that was in the config. eg: substitution.0.key is before substitution.1.key so it is evaluated in that order List<String> keys = Lists.newArrayList(substitutionMap.keySet()); Collections.sort(keys); List<Pair<String, String>> finalMap = Lists.newArrayList(); for (String key : keys) { Pair<String, String> pair = substitutionMap.get(key); finalMap.add(pair); LOGGER.info("Using substitution %s -> %s", pair.getKey(), pair.getValue()); } return finalMap; } }