net.sourceforge.plantuml.utils.Cypher Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of plantuml-mit Show documentation
Show all versions of plantuml-mit Show documentation
PlantUML is a component that allows to quickly write diagrams from text.
// THIS FILE HAS BEEN GENERATED BY A PREPROCESSOR.
package net.sourceforge.plantuml.utils;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.sourceforge.plantuml.log.Logme;
public class Cypher {
// ::remove file when __HAXE__
final private static Pattern p = Pattern.compile("[\\p{L}\\p{N}]+");
private final SecureRandom rnd = new SecureRandom();
private final Map convert = new HashMap();
private final Set except = new HashSet<>();
private final List words = new ArrayList<>();
public Cypher() {
final InputStream is = Cypher.class.getResourceAsStream("words.txt");
if (is != null)
try {
final BufferedReader br = new BufferedReader(new InputStreamReader(is));
String s;
while ((s = br.readLine()) != null) {
if (s.matches("[a-z]+"))
words.add(s);
}
is.close();
} catch (Exception e) {
Logme.error(e);
}
Collections.shuffle(words, rnd);
}
public synchronized String cypher(String s) {
final Matcher m = p.matcher(s);
final StringBuffer sb = new StringBuffer(); // Can't be switched to StringBuilder in order to support Java 8
while (m.find()) {
final String word = m.group(0);
m.appendReplacement(sb, changeWord(word));
}
m.appendTail(sb);
return sb.toString();
}
private String changeWord(final String word) {
final String lower = word.toLowerCase();
if (except.contains(lower) || lower.matches("^([a-f0-9]{3}|[a-f0-9]{6})$")) {
return word;
}
String res = convert.get(word);
if (res != null) {
return res;
}
int len = word.length();
if (len < 4) {
len = 4;
}
while (true) {
res = buildRandomWord(len);
if (convert.containsValue(res) == false) {
convert.put(word, res);
return res;
}
}
}
private String buildRandomWord(int len) {
for (Iterator it = words.iterator(); it.hasNext();) {
final String s = it.next();
if (s.length() == len) {
it.remove();
return s;
}
}
final StringBuilder sb = new StringBuilder();
for (int i = 0; i < len; i++) {
final char letter = (char) ('a' + rnd.nextInt(26));
sb.append(letter);
}
return sb.toString();
}
public void addException(String word) {
word = word.toLowerCase();
if (words.contains(word)) {
System.err.println("CypherWarning:" + word);
words.remove(word);
}
except.add(word);
}
}