summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2016-05-27 07:04:24 -0700
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2016-05-27 07:04:24 -0700
commitbeb18f93d221241a9306cd31d48f0b847f22468c (patch)
treec02f8f9b3f4441a1dfb7cccc13c88ab76a21e9a9 /src/Classes.java
parent6b673bcb11c01dec2406080d8fe2cba2f3a4ff5f (diff)
parent94b924963d7927fba0bafa268c8477de2794a6da (diff)
Merging website side of calendar.
Diffstat (limited to 'src/Classes.java')
-rw-r--r--src/Classes.java341
1 files changed, 341 insertions, 0 deletions
diff --git a/src/Classes.java b/src/Classes.java
new file mode 100644
index 0000000..31cc0fa
--- /dev/null
+++ b/src/Classes.java
@@ -0,0 +1,341 @@
+import java.util.List;
+import java.util.Set;
+import java.util.HashMap;
+
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+
+public class Classes
+{
+ private static final HashMap<String, Classes> FROM_ABBREVIATION;
+ private static final HashMap<String, Classes> FROM_NAME;
+ private static final String SEPARATOR = " ,.?-&:;";
+
+ private final String name;
+ private final String abbreviation;
+
+ static
+ {
+ FROM_ABBREVIATION = new HashMap<String, Classes>();
+ FROM_NAME = new HashMap<String, Classes>();
+ }
+
+ private Classes (final String name, final String abbreviation)
+ {
+ this.name = name;
+ this.abbreviation = abbreviation;
+ }
+
+ private void register ()
+ throws Classes.AlreadyRegisteredException
+ {
+ /**
+ * We allow multiple (unique) names for the same class, but not
+ * multiple abbreviations
+ **/
+
+ if (FROM_NAME.containsKey(name))
+ {
+ throw (new Classes.AlreadyRegisteredException());
+ }
+
+ if (!FROM_ABBREVIATION.containsKey(abbreviation))
+ {
+ FROM_ABBREVIATION.put(abbreviation, this);
+ }
+
+ FROM_NAME.put(name, this);
+ }
+
+ @Override
+ public boolean equals (Object a)
+ {
+ if (a instanceof Classes)
+ {
+ return abbreviation.equals(((Classes) a).abbreviation);
+ }
+
+ return false;
+ }
+
+ @Override
+ public String toString ()
+ {
+ return abbreviation;
+ }
+
+ public static String name_from_abbreviation (final String abbr)
+ {
+ final Classes c;
+
+ c = FROM_ABBREVIATION.get(abbr);
+
+ if (c == null)
+ {
+ return "unknown";
+ }
+
+ return c.name;
+ }
+
+ private static boolean word_is_isolated
+ (
+ final String word,
+ final String sentence
+ )
+ {
+ final int index_start, index_end;
+
+ index_start = sentence.indexOf(word);
+
+ if
+ (
+ (index_start == -1)
+ || (index_start == 0)
+ || (SEPARATOR.indexOf(sentence.charAt(index_start - 1)) == -1)
+ )
+ {
+ return false;
+ }
+
+ index_end = (index_start + word.length());
+
+ if (index_end == sentence.length())
+ {
+ return true;
+ }
+
+ return (SEPARATOR.indexOf(sentence.charAt(index_end)) != -1);
+ }
+
+ private static Classes ambiguous_entry_guard
+ (
+ final String entry,
+ final String class_name
+ )
+ {
+ final String rest_of_entry_name;
+ boolean ambiguous;
+
+ ambiguous = false;
+ rest_of_entry_name = entry.substring(class_name.length());
+
+ for (final String other_class_name: FROM_NAME.keySet())
+ {
+ if
+ (
+ !other_class_name.equals(class_name)
+ && word_is_isolated(other_class_name, rest_of_entry_name)
+ && !FROM_NAME.get(class_name).equals
+ (
+ FROM_NAME.get(other_class_name)
+ )
+ )
+ {
+ final StringBuilder sb;
+
+ sb = new StringBuilder();
+
+ sb.append("Ambiguous event summary \"");
+ sb.append(entry);
+ sb.append("\". Starts with \"");
+ sb.append(class_name);
+ sb.append("\" (");
+ sb.append(FROM_NAME.get(class_name));
+ sb.append("), but also contains \"");
+ sb.append(other_class_name);
+ sb.append("\" (");
+ sb.append(FROM_NAME.get(other_class_name));
+ sb.append(")");
+
+ Error.WARNING.from_file
+ (
+ Parameters.get_known_classes_filename(),
+ sb.toString()
+ );
+
+ ambiguous = true;
+
+ break;
+ }
+ }
+
+ return ambiguous ? null : FROM_NAME.get(class_name);
+ }
+ public static String abbreviation_from_name
+ (
+ final String name,
+ final boolean lazy
+ )
+ {
+ Classes c;
+
+ if (lazy)
+ {
+ c = null;
+
+ for (final String n: FROM_NAME.keySet())
+ {
+ if (name.startsWith(n))
+ {
+ c = ambiguous_entry_guard(name, n);
+
+ break;
+ }
+ }
+ }
+ else
+ {
+ c = FROM_NAME.get(name);
+ }
+
+ if (c == null)
+ {
+ return "unknown";
+ }
+
+ return c.abbreviation;
+ }
+
+ public static Set<String> get_all_abbreviations ()
+ {
+ return FROM_ABBREVIATION.keySet();
+ }
+
+ public static void read_all ()
+ throws Exception
+ {
+ BufferedReader br;
+ String input_line;
+ String[] data;
+ Classes new_class;
+
+ br = null;
+
+ try
+ {
+ br =
+ new BufferedReader
+ (
+ new InputStreamReader
+ (
+ new FileInputStream(Parameters.get_known_classes_filename())
+ )
+ );
+
+ while ((input_line = br.readLine()) != null)
+ {
+ data = input_line.split("::");
+
+ if (data.length != 3)
+ {
+ final StringBuilder sb;
+
+ sb = new StringBuilder();
+
+ sb.append("Invalid class entry: \"");
+ sb.append(input_line);
+
+ Error.ERROR.from_file
+ (
+ Parameters.get_known_classes_filename(),
+ sb.toString()
+ );
+
+ continue;
+ }
+
+ new_class = new Classes(data[1], data[2]);
+
+ if (!data[0].equals("") && FROM_ABBREVIATION.containsKey(data[2]))
+ {
+ final StringBuilder sb;
+
+ sb = new StringBuilder();
+
+ sb.append("Abbreviation \"");
+ sb.append(data[2]);
+ sb.append("\" is already in use.");
+
+ Error.ERROR.from_file
+ (
+ Parameters.get_known_classes_filename(),
+ sb.toString()
+ );
+
+ continue;
+ }
+
+ try
+ {
+ new_class.register();
+ }
+ catch (final Classes.AlreadyRegisteredException care)
+ {
+ final StringBuilder sb;
+
+ sb = new StringBuilder();
+
+ sb.append("Duplicate entry for class \"");
+ sb.append(data[1]);
+ sb.append("\".");
+
+ Error.ERROR.from_file
+ (
+ Parameters.get_known_classes_filename(),
+ sb.toString()
+ );
+
+ continue;
+ }
+ }
+ }
+ catch (final Exception e)
+ {
+ Error.FATAL.from_file
+ (
+ Parameters.get_known_classes_filename(),
+ "Error while reading class file:",
+ e.getMessage()
+ );
+
+ if (br != null)
+ {
+ try
+ {
+ br.close();
+ }
+ catch (final Exception e2)
+ {
+ Error.WARNING.from_file
+ (
+ Parameters.get_known_classes_filename(),
+ "Error while closing class file:",
+ e2.getMessage()
+ );
+ }
+ }
+
+ throw e;
+ }
+
+ try
+ {
+ br.close();
+ }
+ catch (final Exception e)
+ {
+ Error.WARNING.from_file
+ (
+ Parameters.get_known_classes_filename(),
+ "Error while closing class file:",
+ e.getMessage()
+ );
+
+ throw e;
+ }
+ }
+
+ private static class AlreadyRegisteredException extends Exception {}
+}