/*
 *******************************************************************************
 * Copyright (C) 2002-2012, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 */
package com.ibm.icu.dev.util;

import java.util.Collections;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;

public class VariableReplacer {
    // simple implementation for now
    private Map m = new TreeMap(Collections.reverseOrder());

    // TODO - fix to do streams also, clean up implementation

    public VariableReplacer add(String variable, String value) {
        m.put(variable, value);
        return this;
    }
    public String replace(String source) {
        String oldSource;
        do {
            oldSource = source;
            for (Iterator it = m.keySet().iterator(); it.hasNext();) {
                String variable = (String) it.next();
                String value = (String) m.get(variable);
                source = replaceAll(source, variable, value);
            }
        } while (!source.equals(oldSource));
        return source;
    }
    public String replaceAll(String source, String key, String value) {
        while (true) {
            int pos = source.indexOf(key);
            if (pos < 0) return source;
            source = source.substring(0,pos) + value + source.substring(pos+key.length());
        }
    }
}

