1 /**
2 * SpamSchutz - simple way to protect your mail addresses from naïve spammers
3 * Copyright (C) 2011, Aiki IT
4 * <p/>
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 * <p/>
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 * <p/>
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18 package de.aikiit.spamprotector.converter;
19
20 import com.google.common.base.Strings;
21 import com.google.common.collect.Maps;
22 import lombok.AccessLevel;
23 import lombok.NoArgsConstructor;
24
25 import java.util.Map;
26
27 /**
28 * Class encapsulates the actual character conversion logics.
29 */
30 @NoArgsConstructor(access = AccessLevel.PRIVATE)
31 public final class SpamProtector {
32
33 private static final Map<String, CharacterConverter> ENCODED = Maps.newHashMap();
34 private static final Map<Character, CharacterConverter> PLAIN = Maps.newHashMap();
35
36 static {
37 // split up characters
38 for (CharacterConverter character : CharacterConverter.values()) {
39 ENCODED.put(character.getReplacement().toLowerCase(), character);
40 PLAIN.put(character.getPlain().charAt(0), character);
41 }
42 }
43
44 /**
45 * Converts an encoded value into a plain one.
46 *
47 * @param input encoded value as set in an enumeration instance of this class.
48 * @return encoded value or input if no mapping is found.
49 */
50 public static String toPlain(String input) {
51 if (!Strings.isNullOrEmpty(input)) {
52 String toTransform = input;
53 StringBuilder result = new StringBuilder();
54
55 while (!Strings.isNullOrEmpty(toTransform)) {
56 int lengthBeforeConversion = toTransform.length();
57
58 for(Map.Entry<String, CharacterConverter> entry : ENCODED.entrySet()) {
59 // cut out any found items
60 String prefix = entry.getKey();
61 if (toTransform.startsWith(prefix)) {
62 result.append(entry.getValue().getPlain());
63 toTransform = toTransform.substring(prefix.length());
64 }
65 }
66
67 // in case we did not replace any character trim one and restart
68 if (toTransform.length() == lengthBeforeConversion) {
69 result.append(toTransform.charAt(0));
70 toTransform = toTransform.substring(1);
71 }
72 }
73
74 return result.toString();
75
76 }
77 return input;
78 }
79
80 /**
81 * Converts a plain value into an encoded one.
82 *
83 * @param input plain value that is transformed by an enumeration instance of this class.
84 * @return encoded value or input if no mapping is found.
85 */
86 public static String toEncoded(String input) {
87 if (!Strings.isNullOrEmpty(input)) {
88 StringBuilder result = new StringBuilder();
89
90 for (Character character : input.toCharArray()) {
91 result.append(PLAIN.containsKey(character) ? PLAIN.get(character).getReplacement() : character);
92 }
93
94 return result.toString();
95 }
96 return input;
97 }
98 }