17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Copyright (C) 2002-2012, International Business Machines Corporation and    *
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved.                                                *
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.util;
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Collections;
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Iterator;
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Map;
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.TreeMap;
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class VariableReplacer {
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // simple implementation for now
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private Map m = new TreeMap(Collections.reverseOrder());
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // TODO - fix to do streams also, clean up implementation
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public VariableReplacer add(String variable, String value) {
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        m.put(variable, value);
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return this;
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public String replace(String source) {
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String oldSource;
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        do {
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            oldSource = source;
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (Iterator it = m.keySet().iterator(); it.hasNext();) {
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String variable = (String) it.next();
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String value = (String) m.get(variable);
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                source = replaceAll(source, variable, value);
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } while (!source.equals(oldSource));
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return source;
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public String replaceAll(String source, String key, String value) {
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        while (true) {
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int pos = source.indexOf(key);
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (pos < 0) return source;
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            source = source.substring(0,pos) + value + source.substring(pos+key.length());
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
45