aboutsummaryrefslogtreecommitdiff
path: root/src/org/xbill/DNS/Mnemonic.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/xbill/DNS/Mnemonic.java')
-rw-r--r--src/org/xbill/DNS/Mnemonic.java210
1 files changed, 210 insertions, 0 deletions
diff --git a/src/org/xbill/DNS/Mnemonic.java b/src/org/xbill/DNS/Mnemonic.java
new file mode 100644
index 0000000..dd60f62
--- /dev/null
+++ b/src/org/xbill/DNS/Mnemonic.java
@@ -0,0 +1,210 @@
+// Copyright (c) 2004 Brian Wellington (bwelling@xbill.org)
+
+package org.xbill.DNS;
+
+import java.util.HashMap;
+
+/**
+ * A utility class for converting between numeric codes and mnemonics
+ * for those codes. Mnemonics are case insensitive.
+ *
+ * @author Brian Wellington
+ */
+
+class Mnemonic {
+
+private static Integer cachedInts[] = new Integer[64];
+
+static {
+ for (int i = 0; i < cachedInts.length; i++) {
+ cachedInts[i] = new Integer(i);
+ }
+}
+
+/* Strings are case-sensitive. */
+static final int CASE_SENSITIVE = 1;
+
+/* Strings will be stored/searched for in uppercase. */
+static final int CASE_UPPER = 2;
+
+/* Strings will be stored/searched for in lowercase. */
+static final int CASE_LOWER = 3;
+
+private HashMap strings;
+private HashMap values;
+private String description;
+private int wordcase;
+private String prefix;
+private int max;
+private boolean numericok;
+
+/**
+ * Creates a new Mnemonic table.
+ * @param description A short description of the mnemonic to use when
+ * @param wordcase Whether to convert strings into uppercase, lowercase,
+ * or leave them unchanged.
+ * throwing exceptions.
+ */
+public
+Mnemonic(String description, int wordcase) {
+ this.description = description;
+ this.wordcase = wordcase;
+ strings = new HashMap();
+ values = new HashMap();
+ max = Integer.MAX_VALUE;
+}
+
+/** Sets the maximum numeric value */
+public void
+setMaximum(int max) {
+ this.max = max;
+}
+
+/**
+ * Sets the prefix to use when converting to and from values that don't
+ * have mnemonics.
+ */
+public void
+setPrefix(String prefix) {
+ this.prefix = sanitize(prefix);
+}
+
+/**
+ * Sets whether numeric values stored in strings are acceptable.
+ */
+public void
+setNumericAllowed(boolean numeric) {
+ this.numericok = numeric;
+}
+
+/**
+ * Converts an int into a possibly cached Integer.
+ */
+public static Integer
+toInteger(int val) {
+ if (val >= 0 && val < cachedInts.length)
+ return (cachedInts[val]);
+ return new Integer(val);
+}
+
+/**
+ * Checks that a numeric value is within the range [0..max]
+ */
+public void
+check(int val) {
+ if (val < 0 || val > max) {
+ throw new IllegalArgumentException(description + " " + val +
+ "is out of range");
+ }
+}
+
+/* Converts a String to the correct case. */
+private String
+sanitize(String str) {
+ if (wordcase == CASE_UPPER)
+ return str.toUpperCase();
+ else if (wordcase == CASE_LOWER)
+ return str.toLowerCase();
+ return str;
+}
+
+private int
+parseNumeric(String s) {
+ try {
+ int val = Integer.parseInt(s);
+ if (val >= 0 && val <= max)
+ return val;
+ }
+ catch (NumberFormatException e) {
+ }
+ return -1;
+}
+
+/**
+ * Defines the text representation of a numeric value.
+ * @param val The numeric value
+ * @param string The text string
+ */
+public void
+add(int val, String str) {
+ check(val);
+ Integer value = toInteger(val);
+ str = sanitize(str);
+ strings.put(str, value);
+ values.put(value, str);
+}
+
+/**
+ * Defines an additional text representation of a numeric value. This will
+ * be used by getValue(), but not getText().
+ * @param val The numeric value
+ * @param string The text string
+ */
+public void
+addAlias(int val, String str) {
+ check(val);
+ Integer value = toInteger(val);
+ str = sanitize(str);
+ strings.put(str, value);
+}
+
+/**
+ * Copies all mnemonics from one table into another.
+ * @param val The numeric value
+ * @param string The text string
+ * @throws IllegalArgumentException The wordcases of the Mnemonics do not
+ * match.
+ */
+public void
+addAll(Mnemonic source) {
+ if (wordcase != source.wordcase)
+ throw new IllegalArgumentException(source.description +
+ ": wordcases do not match");
+ strings.putAll(source.strings);
+ values.putAll(source.values);
+}
+
+/**
+ * Gets the text mnemonic corresponding to a numeric value.
+ * @param val The numeric value
+ * @return The corresponding text mnemonic.
+ */
+public String
+getText(int val) {
+ check(val);
+ String str = (String) values.get(toInteger(val));
+ if (str != null)
+ return str;
+ str = Integer.toString(val);
+ if (prefix != null)
+ return prefix + str;
+ return str;
+}
+
+/**
+ * Gets the numeric value corresponding to a text mnemonic.
+ * @param str The text mnemonic
+ * @return The corresponding numeric value, or -1 if there is none
+ */
+public int
+getValue(String str) {
+ str = sanitize(str);
+ Integer value = (Integer) strings.get(str);
+ if (value != null) {
+ return value.intValue();
+ }
+ if (prefix != null) {
+ if (str.startsWith(prefix)) {
+ int val = parseNumeric(str.substring(prefix.length()));
+ if (val >= 0) {
+ return val;
+ }
+ }
+ }
+ if (numericok) {
+ return parseNumeric(str);
+ }
+ return -1;
+}
+
+}