All Downloads are FREE. Search and download functionalities are using the official Maven repository.

panda.lang.escape.LookupTranslator Maven / Gradle / Ivy

package panda.lang.escape;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

/**
 * Translates a value using a lookup table.
 * 
 */
public class LookupTranslator extends CharSequenceTranslator {
	private final Map lookupMap;
	private int shortest;
	private int longest;

	/**
	 * Define the lookup table to be used in translation Note that, as of Lang 3.1, the key to the
	 * lookup table is converted to a java.lang.String, while the value remains as a
	 * java.lang.CharSequence. This is because we need the key to support hashCode and
	 * equals(Object), allowing it to be the key for a HashMap. See LANG-882.
	 * 
	 * @param lookup CharSequence[][] table of size [*][2]
	 */
	public LookupTranslator(final Map lookup) {
		lookupMap = lookup;
		init();
	}

	/**
	 * Define the lookup table to be used in translation Note that, as of Lang 3.1, the key to the
	 * lookup table is converted to a java.lang.String, while the value remains as a
	 * java.lang.CharSequence. This is because we need the key to support hashCode and
	 * equals(Object), allowing it to be the key for a HashMap. See LANG-882.
	 * 
	 * @param lookup CharSequence[][] table of size [*][2]
	 */
	public LookupTranslator(final String[] ... lookup) {
		lookupMap = new HashMap();
		if (lookup != null) {
			for (final String[] seq : lookup) {
				this.lookupMap.put(seq[0].toString(), seq[1]);
			}
		}
		init();
	}

	private void init() {
		int _shortest = Integer.MAX_VALUE;
		int _longest = 0;
		for (Entry en : lookupMap.entrySet()) {
			final int sz = en.getKey().length();
			if (sz < _shortest) {
				_shortest = sz;
			}
			if (sz > _longest) {
				_longest = sz;
			}
		}

		shortest = _shortest;
		longest = _longest;
	}

	@Override
	public int translateChar(final CharSequence input, final int index, final Appendable out) throws IOException {
		int max = longest;
		if (index + longest > input.length()) {
			max = input.length() - index;
		}
		// descend so as to get a greedy algorithm
		for (int i = max; i >= shortest; i--) {
			final CharSequence subSeq = input.subSequence(index, index + i);
			final CharSequence result = lookupMap.get(subSeq.toString());
			if (result != null) {
				out.append(result);
				return i;
			}
		}
		return 0;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy