1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * https://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.apache.commons.lang3.text.translate;
18
19 import java.io.IOException;
20 import java.io.Writer;
21 import java.util.HashMap;
22 import java.util.HashSet;
23
24 /**
25 * Translates a value using a lookup table.
26 *
27 * @since 3.0
28 * @deprecated As of <a href="https://commons.apache.org/proper/commons-lang/changes-report.html#a3.6">3.6</a>, use Apache Commons Text
29 * <a href="https://commons.apache.org/proper/commons-text/javadocs/api-release/org/apache/commons/text/translate/LookupTranslator.html">
30 * LookupTranslator</a>.
31 */
32 @Deprecated
33 public class LookupTranslator extends CharSequenceTranslator {
34
35 private final HashMap<String, String> lookupMap;
36 private final HashSet<Character> prefixSet;
37 private final int shortest;
38 private final int longest;
39
40 /**
41 * Define the lookup table to be used in translation
42 *
43 * Note that, as of Lang 3.1, the key to the lookup table is converted to a
44 * java.lang.String. This is because we need the key to support hashCode and
45 * equals(Object), allowing it to be the key for a HashMap. See LANG-882.
46 *
47 * @param lookup CharSequence[][] table of size [*][2]
48 */
49 public LookupTranslator(final CharSequence[]... lookup) {
50 lookupMap = new HashMap<>();
51 prefixSet = new HashSet<>();
52 int tmpShortest = Integer.MAX_VALUE;
53 int tmpLongest = 0;
54 if (lookup != null) {
55 for (final CharSequence[] seq : lookup) {
56 this.lookupMap.put(seq[0].toString(), seq[1].toString());
57 this.prefixSet.add(seq[0].charAt(0));
58 final int sz = seq[0].length();
59 if (sz < tmpShortest) {
60 tmpShortest = sz;
61 }
62 if (sz > tmpLongest) {
63 tmpLongest = sz;
64 }
65 }
66 }
67 this.shortest = tmpShortest;
68 this.longest = tmpLongest;
69 }
70
71 /**
72 * {@inheritDoc}
73 */
74 @Override
75 public int translate(final CharSequence input, final int index, final Writer out) throws IOException {
76 // check if translation exists for the input at position index
77 if (prefixSet.contains(input.charAt(index))) {
78 int max = longest;
79 if (index + longest > input.length()) {
80 max = input.length() - index;
81 }
82 // implement greedy algorithm by trying maximum match first
83 for (int i = max; i >= shortest; i--) {
84 final CharSequence subSeq = input.subSequence(index, index + i);
85 final String result = lookupMap.get(subSeq.toString());
86
87 if (result != null) {
88 out.write(result);
89 return i;
90 }
91 }
92 }
93 return 0;
94 }
95 }