001package org.kuali.common.util.base;
002
003import static com.google.common.base.Preconditions.checkNotNull;
004
005import java.util.Map;
006
007import com.google.common.collect.BiMap;
008import com.google.common.collect.HashBiMap;
009import com.google.common.collect.ImmutableBiMap;
010
011public final class Replacer {
012
013        private final ImmutableBiMap<String, String> tokens;
014
015        public String replace(final String string) {
016                String s = string;
017                for (Map.Entry<String, String> pair : tokens.entrySet()) {
018                        s = s.replace(pair.getKey(), pair.getValue());
019                }
020                return s;
021        }
022
023        public String restore(final String string) {
024                String s = string;
025                for (Map.Entry<String, String> pair : tokens.entrySet()) {
026                        s = s.replace(pair.getValue(), pair.getKey());
027                }
028                return s;
029        }
030
031        private Replacer(Builder builder) {
032                this.tokens = ImmutableBiMap.copyOf(builder.tokens);
033        }
034
035        public static Replacer create(String oldToken, String newToken) {
036                return builder().add(oldToken, newToken).build();
037        }
038
039        public static Builder builder() {
040                return new Builder();
041        }
042
043        public static class Builder {
044
045                private BiMap<String, String> tokens = HashBiMap.create();
046
047                public Builder add(String oldToken, String newToken) {
048                        this.tokens.put(oldToken, newToken);
049                        return this;
050                }
051
052                public Builder tokens(BiMap<String, String> tokens) {
053                        this.tokens = tokens;
054                        return this;
055                }
056
057                public Replacer build() {
058                        Replacer instance = new Replacer(this);
059                        validate(instance);
060                        return instance;
061                }
062
063                private static void validate(Replacer instance) {
064                        checkNotNull(instance.tokens);
065                }
066
067                public BiMap<String, String> getTokens() {
068                        return tokens;
069                }
070
071                public void setTokens(BiMap<String, String> tokens) {
072                        this.tokens = tokens;
073                }
074        }
075
076        public BiMap<String, String> getTokens() {
077                return tokens;
078        }
079
080}