You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ctakes.apache.org by ja...@apache.org on 2012/10/31 06:26:55 UTC
svn commit: r1403989 [27/28] - in /incubator/ctakes/branches/SHARPn-cTAKES:
Constituency Parser/src/org/chboston/cnlp/ctakes/parser/ Constituency
Parser/src/org/chboston/cnlp/ctakes/parser/uima/ae/ Constituency
Parser/src/org/chboston/cnlp/ctakes/parse...
Modified: incubator/ctakes/branches/SHARPn-cTAKES/utils/src/edu/mayo/bmi/utils/xcas_comparison/Compare.java
URL: http://svn.apache.org/viewvc/incubator/ctakes/branches/SHARPn-cTAKES/utils/src/edu/mayo/bmi/utils/xcas_comparison/Compare.java?rev=1403989&r1=1403988&r2=1403989&view=diff
==============================================================================
--- incubator/ctakes/branches/SHARPn-cTAKES/utils/src/edu/mayo/bmi/utils/xcas_comparison/Compare.java (original)
+++ incubator/ctakes/branches/SHARPn-cTAKES/utils/src/edu/mayo/bmi/utils/xcas_comparison/Compare.java Wed Oct 31 05:26:43 2012
@@ -1,18 +1,11 @@
/*
- * Copyright: (c) 2009 Mayo Foundation for Medical Education and
- * Research (MFMER). All rights reserved. MAYO, MAYO CLINIC, and the
- * triple-shield Mayo logo are trademarks and service marks of MFMER.
- *
- * Except as contained in the copyright notice above, or as used to identify
- * MFMER as the author of this software, the trade names, trademarks, service
- * marks, or product names of the copyright holder shall not be used in
- * advertising, promotion or otherwise in connection with this software without
- * prior written authorization of the copyright holder.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
@@ -21,37 +14,37 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package edu.mayo.bmi.utils.xcas_comparison;
-import java.io.*;
-
-/**
- * This class illustrates the basic usage of this tool.
- * @author Mayo Clinic
- *
- */
-public class Compare {
-
- public static void main(String[] args) {
-// Prepare the list of attributes to ignore when comparing elements
- Const.init();
-// Initialize a processor
- XcasProcessor p = new XcasProcessor();
-// Process/parse the two files specified in args[0] and args[1]
- File f1 = new File(args[0]);
- if (!f1.exists()) { System.err.println(args[0]+" not exist!"); System.exit(1); }
- File f2 = new File(args[1]);
- if (!f2.exists()) { System.err.println(args[2]+" not exist!"); System.exit(1); }
- XcasFile xf1 = p.process(f1);
- XcasFile xf2 = p.process(f2);
-// Construct an XcasDiff object from the two XcasFiles
- XcasDiff d = new XcasDiff(xf1, xf2);
-// Print differences to stdout
- d.printDiff();
-// Print an HTML summary to file specified in args[2]
- try {
- d.printHTML(new FileWriter(args[2]));
- System.out.println();
- System.out.println("HTML summary written to "+args[2]);
- } catch (IOException e) { e.printStackTrace(); }
- }
-}
+package edu.mayo.bmi.utils.xcas_comparison;
+import java.io.*;
+
+/**
+ * This class illustrates the basic usage of this tool.
+ * @author Mayo Clinic
+ *
+ */
+public class Compare {
+
+ public static void main(String[] args) {
+// Prepare the list of attributes to ignore when comparing elements
+ Const.init();
+// Initialize a processor
+ XcasProcessor p = new XcasProcessor();
+// Process/parse the two files specified in args[0] and args[1]
+ File f1 = new File(args[0]);
+ if (!f1.exists()) { System.err.println(args[0]+" not exist!"); System.exit(1); }
+ File f2 = new File(args[1]);
+ if (!f2.exists()) { System.err.println(args[2]+" not exist!"); System.exit(1); }
+ XcasFile xf1 = p.process(f1);
+ XcasFile xf2 = p.process(f2);
+// Construct an XcasDiff object from the two XcasFiles
+ XcasDiff d = new XcasDiff(xf1, xf2);
+// Print differences to stdout
+ d.printDiff();
+// Print an HTML summary to file specified in args[2]
+ try {
+ d.printHTML(new FileWriter(args[2]));
+ System.out.println();
+ System.out.println("HTML summary written to "+args[2]);
+ } catch (IOException e) { e.printStackTrace(); }
+ }
+}
Modified: incubator/ctakes/branches/SHARPn-cTAKES/utils/src/edu/mayo/bmi/utils/xcas_comparison/Const.java
URL: http://svn.apache.org/viewvc/incubator/ctakes/branches/SHARPn-cTAKES/utils/src/edu/mayo/bmi/utils/xcas_comparison/Const.java?rev=1403989&r1=1403988&r2=1403989&view=diff
==============================================================================
--- incubator/ctakes/branches/SHARPn-cTAKES/utils/src/edu/mayo/bmi/utils/xcas_comparison/Const.java (original)
+++ incubator/ctakes/branches/SHARPn-cTAKES/utils/src/edu/mayo/bmi/utils/xcas_comparison/Const.java Wed Oct 31 05:26:43 2012
@@ -1,18 +1,11 @@
/*
- * Copyright: (c) 2009 Mayo Foundation for Medical Education and
- * Research (MFMER). All rights reserved. MAYO, MAYO CLINIC, and the
- * triple-shield Mayo logo are trademarks and service marks of MFMER.
- *
- * Except as contained in the copyright notice above, or as used to identify
- * MFMER as the author of this software, the trade names, trademarks, service
- * marks, or product names of the copyright holder shall not be used in
- * advertising, promotion or otherwise in connection with this software without
- * prior written authorization of the copyright holder.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
@@ -21,47 +14,47 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package edu.mayo.bmi.utils.xcas_comparison;
-
-import java.util.HashSet;
-import java.util.Properties;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-
-public abstract class Const {
- public static String UIMA_TCAS_DOCUMENT = "uima.tcas.Document";
- public static String UIMA_FSARRAY = "uima.cas.FSArray";
- public static String UIMA_INTARRAY = "uima.cas.IntegerArray";
- public static String UIMA_NONEMPTY_FSLIST = "uima.cas.NonEmptyFSList";
- public static String UIMA_EMPTY_FSLIST = "uima.cas.EmptyFSList";
- public static String ID = "_id";
- public static String REF_PREFIX = "_ref_";
- public static String UIMA_ARRAY_INDEX_KEYWORD = "i";
- public static String UIMA_ARRAY_SIZE_KEYWORD = "size";
- public static String UIMA_LIST_HEAD_KEYWORD = "_ref_head";
- public static String UIMA_LIST_TAIL_KEYWORD = "_ref_tail";
- public static String UIMA_CAS = "CAS";
- public static String UIMA_REF_SOFA = "_ref_Sofa";
- public static String UIMA_SOFA = "uima.cas.Sofa";
- public static String UIMA_SOFA_STRING = "sofaString";
- public static String HIDDEN_TEXT = "...";
- public static HashSet<String> ATTRIBUTES_TO_IGNORE = new HashSet<String>();
-
- public static void init() {
- // uid is always ignored;
- ATTRIBUTES_TO_IGNORE.add("uid");
- // read in attributes from file
- File f = new File("attributes_to_ignore.properties");
- if (!f.exists()) return;
- Properties p = new Properties();
- try {
- p.load(new FileInputStream(f));
- String s = p.getProperty("ATTRIBUTES_TO_IGNORE");
- if (s!=null) {
- String[] a = s.split(";");
- for (String i : a) ATTRIBUTES_TO_IGNORE.add(i);
- }
- } catch (IOException e) {}
- }
-}
+package edu.mayo.bmi.utils.xcas_comparison;
+
+import java.util.HashSet;
+import java.util.Properties;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+
+public abstract class Const {
+ public static String UIMA_TCAS_DOCUMENT = "uima.tcas.Document";
+ public static String UIMA_FSARRAY = "uima.cas.FSArray";
+ public static String UIMA_INTARRAY = "uima.cas.IntegerArray";
+ public static String UIMA_NONEMPTY_FSLIST = "uima.cas.NonEmptyFSList";
+ public static String UIMA_EMPTY_FSLIST = "uima.cas.EmptyFSList";
+ public static String ID = "_id";
+ public static String REF_PREFIX = "_ref_";
+ public static String UIMA_ARRAY_INDEX_KEYWORD = "i";
+ public static String UIMA_ARRAY_SIZE_KEYWORD = "size";
+ public static String UIMA_LIST_HEAD_KEYWORD = "_ref_head";
+ public static String UIMA_LIST_TAIL_KEYWORD = "_ref_tail";
+ public static String UIMA_CAS = "CAS";
+ public static String UIMA_REF_SOFA = "_ref_Sofa";
+ public static String UIMA_SOFA = "uima.cas.Sofa";
+ public static String UIMA_SOFA_STRING = "sofaString";
+ public static String HIDDEN_TEXT = "...";
+ public static HashSet<String> ATTRIBUTES_TO_IGNORE = new HashSet<String>();
+
+ public static void init() {
+ // uid is always ignored;
+ ATTRIBUTES_TO_IGNORE.add("uid");
+ // read in attributes from file
+ File f = new File("attributes_to_ignore.properties");
+ if (!f.exists()) return;
+ Properties p = new Properties();
+ try {
+ p.load(new FileInputStream(f));
+ String s = p.getProperty("ATTRIBUTES_TO_IGNORE");
+ if (s!=null) {
+ String[] a = s.split(";");
+ for (String i : a) ATTRIBUTES_TO_IGNORE.add(i);
+ }
+ } catch (IOException e) {}
+ }
+}
Modified: incubator/ctakes/branches/SHARPn-cTAKES/utils/src/edu/mayo/bmi/utils/xcas_comparison/ConvertAndCompare.java
URL: http://svn.apache.org/viewvc/incubator/ctakes/branches/SHARPn-cTAKES/utils/src/edu/mayo/bmi/utils/xcas_comparison/ConvertAndCompare.java?rev=1403989&r1=1403988&r2=1403989&view=diff
==============================================================================
--- incubator/ctakes/branches/SHARPn-cTAKES/utils/src/edu/mayo/bmi/utils/xcas_comparison/ConvertAndCompare.java (original)
+++ incubator/ctakes/branches/SHARPn-cTAKES/utils/src/edu/mayo/bmi/utils/xcas_comparison/ConvertAndCompare.java Wed Oct 31 05:26:43 2012
@@ -1,18 +1,11 @@
/*
- * Copyright: (c) 2009 Mayo Foundation for Medical Education and
- * Research (MFMER). All rights reserved. MAYO, MAYO CLINIC, and the
- * triple-shield Mayo logo are trademarks and service marks of MFMER.
- *
- * Except as contained in the copyright notice above, or as used to identify
- * MFMER as the author of this software, the trade names, trademarks, service
- * marks, or product names of the copyright holder shall not be used in
- * advertising, promotion or otherwise in connection with this software without
- * prior written authorization of the copyright holder.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
@@ -21,111 +14,111 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package edu.mayo.bmi.utils.xcas_comparison;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.Hashtable;
-
-
-public class ConvertAndCompare {
-
-
- public static void main(String[] args) {
- // key = cni, value = open source
- Hashtable<String, String> map = new Hashtable<String, String>();
- map.put("edu.mayo.bmi.uima.common.type.DocumentID",
- "edu.mayo.bmi.uima.common.types.DocumentIDAnnotation");
- map.put("edu.mayo.bmi.uima.core.type.textspan.LookupWindowAnnotation",
- "edu.mayo.bmi.uima.lookup.types.LookupWindowAnnotation");
-// Specify your mappings here
-/* map.put("",
- "uima.tt.MCAnnotation");
- map.put("",
- "uima.tt.TCAnnotation");
- map.put("",
- "uima.tt.WHPAnnotation");
- map.put("",
- "uima.tt.OBJAnnotation");
- map.put("",
- "uima.tt.PSUBAnnotation");
- map.put("",
- "uima.tt.SUBAnnotation");
- map.put("",
- "uima.tt.AdjAnnotation");
- map.put("",
- "uima.tt.CNPAnnotation");
- map.put("",
- "uima.tt.NPAnnotation");
- map.put("",
- "uima.tt.NPListAnnotation");
- map.put("",
- "uima.tt.NPPAnnotation");
- map.put("",
- "uima.tt.PPAnnotation");
- map.put("",
- "uima.tt.PVGAnnotation");
- map.put("",
- "uima.tt.VGAnnotation");
-*/
- map.put("edu.mayo.bmi.uima.cdt.type.RomanNumeralAnnotation",
- "edu.mayo.bmi.uima.cdt.types.RomanNumeralAnnotation");
- map.put("edu.mayo.bmi.uima.cdt.type.FractionAnnotation",
- "edu.mayo.bmi.uima.cdt.types.FractionAnnotation");
- map.put("edu.mayo.bmi.uima.cdt.type.DateAnnotation",
- "edu.mayo.bmi.uima.cdt.types.DateAnnotation");
- map.put("edu.mayo.bmi.uima.cdt.type.ProblemListAnnotation",
- "edu.mayo.bmi.uima.cdt.types.ProblemListAnnotation");
- map.put("edu.mayo.bmi.uima.cdt.type.MeasurementAnnotation",
- "edu.mayo.bmi.uima.cdt.types.MeasurementAnnotation");
- map.put("edu.mayo.bmi.uima.cdt.type.PersonTitleAnnotation",
- "edu.mayo.bmi.uima.cdt.types.PersonTitleAnnotation");
- map.put("edu.mayo.bmi.uima.core.type.textspan.Segment",
- "edu.mayo.bmi.uima.common.types.SegmentAnnotation");
- map.put("edu.mayo.bmi.uima.core.type.textspan.Sentence",
- "edu.mayo.bmi.uima.common.types.SentenceAnnotation");
- map.put("edu.mayo.bmi.uima.core.type.syntax.WordToken",
- "edu.mayo.bmi.uima.common.types.WordTokenAnnotation");
- map.put("edu.mayo.bmi.uima.core.type.NumToken",
- "edu.mayo.bmi.uima.common.types.NumTokenAnnotation");
- map.put("edu.mayo.bmi.uima.core.type.PunctuationToken",
- "edu.mayo.bmi.uima.common.types.PunctTokenAnnotation");
- map.put("edu.mayo.bmi.uima.core.type.SymbolToken",
- "edu.mayo.bmi.uima.common.types.SymbolTokenAnnotation");
- map.put("edu.mayo.bmi.uima.core.type.NewlineToken",
- "edu.mayo.bmi.uima.common.types.NewlineTokenAnnotation");
- map.put("edu.mayo.bmi.uima.core.type.textsem.IdentifiedAnnotation",
- "edu.mayo.bmi.uima.common.types.NamedEntityAnnotation");
- map.put("edu.mayo.bmi.uima.core.type.UmlsConcept",
- "edu.mayo.bmi.uima.common.types.UmlsConcept");
- map.put("edu.mayo.bmi.uima.core.type.OntologyConcept",
- "edu.mayo.bmi.uima.common.types.OntologyConcept");
-
-// Prepare the list of attributes to ignore when comparing elements
- Const.init();
-// Initialize a processor
- XcasProcessor p = new XcasProcessor();
-// Process/parse the two files specified in args[0] and args[1]
- File f1 = new File(args[0]);
- if (!f1.exists()) { System.err.println(args[0]+" not exist!"); System.exit(1); }
- File f2 = new File(args[1]);
- if (!f2.exists()) { System.err.println(args[2]+" not exist!"); System.exit(1); }
- XcasFile xf1 = p.process(f1);
- XcasFile xf2 = p.process(f2);
-// Change xf1 to xf2 if the second command line argument is the open source output
- for (XcasAnnotation a : xf1.getAllAnnotations())
- if (map.containsKey(a.getType()))
- a.setType(map.get(a.getType()));
-// Construct an XcasDiff object from the two XcasFiles
- XcasDiff d = new XcasDiff(xf1, xf2);
-// Print differences to stdout
- d.printDiff();
-// Print an HTML summary to file specified in args[2]
- try {
- d.printHTML(new FileWriter(args[2]));
- System.out.println();
- System.out.println("HTML summary written to "+args[2]);
- } catch (IOException e) { e.printStackTrace(); }
- }
-
-}
+package edu.mayo.bmi.utils.xcas_comparison;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Hashtable;
+
+
+public class ConvertAndCompare {
+
+
+ public static void main(String[] args) {
+ // key = cni, value = open source
+ Hashtable<String, String> map = new Hashtable<String, String>();
+ map.put("edu.mayo.bmi.uima.common.type.DocumentID",
+ "edu.mayo.bmi.uima.common.types.DocumentIDAnnotation");
+ map.put("edu.mayo.bmi.uima.core.type.textspan.LookupWindowAnnotation",
+ "edu.mayo.bmi.uima.lookup.types.LookupWindowAnnotation");
+// Specify your mappings here
+/* map.put("",
+ "uima.tt.MCAnnotation");
+ map.put("",
+ "uima.tt.TCAnnotation");
+ map.put("",
+ "uima.tt.WHPAnnotation");
+ map.put("",
+ "uima.tt.OBJAnnotation");
+ map.put("",
+ "uima.tt.PSUBAnnotation");
+ map.put("",
+ "uima.tt.SUBAnnotation");
+ map.put("",
+ "uima.tt.AdjAnnotation");
+ map.put("",
+ "uima.tt.CNPAnnotation");
+ map.put("",
+ "uima.tt.NPAnnotation");
+ map.put("",
+ "uima.tt.NPListAnnotation");
+ map.put("",
+ "uima.tt.NPPAnnotation");
+ map.put("",
+ "uima.tt.PPAnnotation");
+ map.put("",
+ "uima.tt.PVGAnnotation");
+ map.put("",
+ "uima.tt.VGAnnotation");
+*/
+ map.put("edu.mayo.bmi.uima.cdt.type.RomanNumeralAnnotation",
+ "edu.mayo.bmi.uima.cdt.types.RomanNumeralAnnotation");
+ map.put("edu.mayo.bmi.uima.cdt.type.FractionAnnotation",
+ "edu.mayo.bmi.uima.cdt.types.FractionAnnotation");
+ map.put("edu.mayo.bmi.uima.cdt.type.DateAnnotation",
+ "edu.mayo.bmi.uima.cdt.types.DateAnnotation");
+ map.put("edu.mayo.bmi.uima.cdt.type.ProblemListAnnotation",
+ "edu.mayo.bmi.uima.cdt.types.ProblemListAnnotation");
+ map.put("edu.mayo.bmi.uima.cdt.type.MeasurementAnnotation",
+ "edu.mayo.bmi.uima.cdt.types.MeasurementAnnotation");
+ map.put("edu.mayo.bmi.uima.cdt.type.PersonTitleAnnotation",
+ "edu.mayo.bmi.uima.cdt.types.PersonTitleAnnotation");
+ map.put("edu.mayo.bmi.uima.core.type.textspan.Segment",
+ "edu.mayo.bmi.uima.common.types.SegmentAnnotation");
+ map.put("edu.mayo.bmi.uima.core.type.textspan.Sentence",
+ "edu.mayo.bmi.uima.common.types.SentenceAnnotation");
+ map.put("edu.mayo.bmi.uima.core.type.syntax.WordToken",
+ "edu.mayo.bmi.uima.common.types.WordTokenAnnotation");
+ map.put("edu.mayo.bmi.uima.core.type.NumToken",
+ "edu.mayo.bmi.uima.common.types.NumTokenAnnotation");
+ map.put("edu.mayo.bmi.uima.core.type.PunctuationToken",
+ "edu.mayo.bmi.uima.common.types.PunctTokenAnnotation");
+ map.put("edu.mayo.bmi.uima.core.type.SymbolToken",
+ "edu.mayo.bmi.uima.common.types.SymbolTokenAnnotation");
+ map.put("edu.mayo.bmi.uima.core.type.NewlineToken",
+ "edu.mayo.bmi.uima.common.types.NewlineTokenAnnotation");
+ map.put("edu.mayo.bmi.uima.core.type.textsem.IdentifiedAnnotation",
+ "edu.mayo.bmi.uima.common.types.NamedEntityAnnotation");
+ map.put("edu.mayo.bmi.uima.core.type.UmlsConcept",
+ "edu.mayo.bmi.uima.common.types.UmlsConcept");
+ map.put("edu.mayo.bmi.uima.core.type.OntologyConcept",
+ "edu.mayo.bmi.uima.common.types.OntologyConcept");
+
+// Prepare the list of attributes to ignore when comparing elements
+ Const.init();
+// Initialize a processor
+ XcasProcessor p = new XcasProcessor();
+// Process/parse the two files specified in args[0] and args[1]
+ File f1 = new File(args[0]);
+ if (!f1.exists()) { System.err.println(args[0]+" not exist!"); System.exit(1); }
+ File f2 = new File(args[1]);
+ if (!f2.exists()) { System.err.println(args[2]+" not exist!"); System.exit(1); }
+ XcasFile xf1 = p.process(f1);
+ XcasFile xf2 = p.process(f2);
+// Change xf1 to xf2 if the second command line argument is the open source output
+ for (XcasAnnotation a : xf1.getAllAnnotations())
+ if (map.containsKey(a.getType()))
+ a.setType(map.get(a.getType()));
+// Construct an XcasDiff object from the two XcasFiles
+ XcasDiff d = new XcasDiff(xf1, xf2);
+// Print differences to stdout
+ d.printDiff();
+// Print an HTML summary to file specified in args[2]
+ try {
+ d.printHTML(new FileWriter(args[2]));
+ System.out.println();
+ System.out.println("HTML summary written to "+args[2]);
+ } catch (IOException e) { e.printStackTrace(); }
+ }
+
+}
Modified: incubator/ctakes/branches/SHARPn-cTAKES/utils/src/edu/mayo/bmi/utils/xcas_comparison/XcasAnnotation.java
URL: http://svn.apache.org/viewvc/incubator/ctakes/branches/SHARPn-cTAKES/utils/src/edu/mayo/bmi/utils/xcas_comparison/XcasAnnotation.java?rev=1403989&r1=1403988&r2=1403989&view=diff
==============================================================================
--- incubator/ctakes/branches/SHARPn-cTAKES/utils/src/edu/mayo/bmi/utils/xcas_comparison/XcasAnnotation.java (original)
+++ incubator/ctakes/branches/SHARPn-cTAKES/utils/src/edu/mayo/bmi/utils/xcas_comparison/XcasAnnotation.java Wed Oct 31 05:26:43 2012
@@ -1,18 +1,11 @@
/*
- * Copyright: (c) 2009 Mayo Foundation for Medical Education and
- * Research (MFMER). All rights reserved. MAYO, MAYO CLINIC, and the
- * triple-shield Mayo logo are trademarks and service marks of MFMER.
- *
- * Except as contained in the copyright notice above, or as used to identify
- * MFMER as the author of this software, the trade names, trademarks, service
- * marks, or product names of the copyright holder shall not be used in
- * advertising, promotion or otherwise in connection with this software without
- * prior written authorization of the copyright holder.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
@@ -21,233 +14,233 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package edu.mayo.bmi.utils.xcas_comparison;
-import java.util.Collection;
-import java.util.Vector;
-import java.util.Hashtable;
-import java.util.Collections;
-
-/**
- * An <code>XcasAnnotation</code> object represents an element under the <code>CAS</code>
- * tag in an XCAS file. It provides members and methods to store and access
- * its type, attributes,and references.
- * <p>
- * Note: this class has a natural ordering that is inconsistent with equals.
- * It is strongly recommended that the use of {@link #compareTo(XcasAnnotation)}
- * be strictly limited to the purpose of an orderly display of multiple objects.
- * @author Mayo Clinic
- *
- */
-public class XcasAnnotation implements Cloneable, Comparable<XcasAnnotation> {
-
- private class MyVector extends Vector<XcasAnnotation> implements Cloneable {
- private static final long serialVersionUID = -8717810064045790243L;
- public MyVector () { super(); }
- public boolean contains (Object obj) {
- if (obj.getClass()!=XcasAnnotation.class) return false;
- for (XcasAnnotation a : this) if (a.equals(obj)) return true;
- return false;
- }
- public boolean containsAll (Collection<?> c) {
- if (c==this || c.size()==0) return true;
- for (Object o : c)
- if (o.getClass()!=XcasAnnotation.class || !contains(o)) return false;
- return true;
- }
- public boolean equals (Object obj) {
- if (obj.getClass()!=getClass() || ((MyVector)obj).size()!=size()) return false;
- return containsAll((MyVector)obj);
- }
- public String toString () {
- StringBuffer ret = new StringBuffer("[");
- Collections.sort(this);
- for (XcasAnnotation a : this)
- ret.append(a.type.equalsIgnoreCase(Const.UIMA_SOFA) ? Const.HIDDEN_TEXT : a.description()).append(",");
- if (size()>0) ret.deleteCharAt(ret.length()-1);
- return ret.append("]").toString();
- }
- public Object clone () {
- MyVector o = null;
- try {
- o = (MyVector)super.clone();
- o.clear();
- for (XcasAnnotation a : this) //TODO is the order guaranteed to be the same?
- o.add((XcasAnnotation)a.clone());
- } catch (Exception e) { e.printStackTrace(); }
- return o;
- }
- }
-
- protected String type;
- protected Hashtable<String, String> attributes;
- protected Hashtable<String, MyVector> references;
- protected Hashtable<String, Vector<Integer>> refIntArrays;
-
- /**
- * Default constructor. Its type is initialized to empty.
- */
- public XcasAnnotation () {
- type = "";
- attributes = new Hashtable<String, String>();
- references = new Hashtable<String, MyVector>();
- refIntArrays = new Hashtable<String, Vector<Integer>>();
- }
-
- /**
- * Constructs an object with the specified type.
- * @param t Type of the <code>XcasAnnotation</code> object to be created.
- */
- public XcasAnnotation (String t) { this(); type = t; }
-
- /**
- * Sets the type name of this annotation.
- * @param t Type to be set.
- */
- public void setType (String t) { type = t; }
-
- /**
- * Inserts an (attribute, value) pair to this <code>XcasAnnotation</code>.
- * @param k Name of the attribute.
- * @param v Value of the attribute.
- */
- public void insertAttribute (String k, String v) { attributes.put(k, v); }
- //TODO Check for loop in references
- public void insertReference (String k, XcasAnnotation a) {
- if (references.containsKey(k))
- references.get(k).add(a);
- else {
- MyVector v = new MyVector();
- v.add(a);
- references.put(k, v);
- }
- }
-
- public void insertIntReference (String k, int[] a) {
- Vector<Integer> v = new Vector<Integer>(a.length);
- for (int i : a) v.add(i);
- refIntArrays.put(k, v);
- }
-
- /**
- * Returns the value of the specified attribute.
- * @param name Name of the attribute.
- * @return Value of the specified attribute.
- */
- public String getAttribute (String name) { return attributes.get(name); }
-
- /**
- * Returns the referenced <code>XcasAnnotation</code>s of the specified attribute.
- * @param name Name of an attribute that references to other <code>XcasAnnotation</code>.
- * @return A <code>HashSet</code> of referenced <XcasAnnotation</code> objects.
- */
- public Vector<XcasAnnotation> getReference (String name) { return references.get(name); }
-
- /**
- * Determines whether the specified object equals to this one. Specifically,
- * an <code>XcasAnnotation a</code> equals to another one <code>o</code>
- * if and only if <code>o</code> is also an <code>XcasAnnotation</code> object
- * and <code>a.type.equals(o.type) && a.attributes.equals(o.attributes) &&
- * a.references.equals(o.references)</code>.
- * @param obj An object to compare with this one.
- * @return <code>true</code> if the specified object equals this one,
- * <code>false</code> otherwise.
- */
- public boolean equals (Object obj) {
- return this==obj || ( obj.getClass()==getClass() &&
- ((XcasAnnotation)obj).type.equals(type) &&
- ((XcasAnnotation)obj).attributes.equals(attributes) &&
- ((XcasAnnotation)obj).references.equals(references) &&
- ((XcasAnnotation)obj).refIntArrays.equals(refIntArrays)
- );
- }
-
- public String getType () { return type; }
- /**
- * Returns a short description of this <code>XcasAnnotation</code>'s type,
- * specifically, the last segment as separated by dots.
- * @return A short type name.
- */
- public String shortType () { return type.substring(type.lastIndexOf('.')+1); }
-
- /**
- * Returns a string representation of all the attributes and references.
- * Some long values are shortened to ellipses.
- * @return A string containing all attributes, references and their values.
- */
- public String allFieldsValues () {
- StringBuffer ret = new StringBuffer("Attributes {");
- Vector<String> v = new Vector<String>(attributes.keySet());
- Collections.sort(v);
- for (String s : v)
- ret.append(s+"="+attributes.get(s)+", ");
- if (v.size()>0) ret.replace(ret.length()-2, ret.length(), "} References {");
- v.clear();
- v.addAll(references.keySet());
- v.addAll(refIntArrays.keySet());
- Collections.sort(v);
- for (String s : v)
- ret.append(s+"="+(references.containsKey(s)?references.get(s):refIntArrays.get(s))+", ");
- if (v.size()>0) ret.delete(ret.length()-2, ret.length());
- ret.append("}");
- return ret.toString();
-// return "Attributes "+attributes.toString()+" References "+references.toString();
- }
-
- /**
- * Returns a String representation of this object, including its type, and
- * all attributes and references. Named such so as not to override
- * the default much shorter String representation
- * @return A string containing the type and all attributes, references information.
- */
- public String description () { return shortType()+" "+allFieldsValues(); }
-
- /**
- * Clones this object and its attributes, but leave references blank.
- * @return
- */
- private final XcasAnnotation prepareCopy () {
- XcasAnnotation o = null;
- try {
- o = (XcasAnnotation)super.clone();
- o.attributes = new Hashtable<String, String>();
- o.attributes.putAll(attributes);
- o.references = new Hashtable<String, MyVector>();
- o.refIntArrays = new Hashtable<String, Vector<Integer>>();
- for (String s : refIntArrays.keySet())
- o.refIntArrays.put(s, new Vector<Integer>(refIntArrays.get(s)));
- } catch (Exception e) { e.printStackTrace(); }
- return o;
- }
-
- /**
- * Recursive, deep copy of this object, including attributes and references.
- */
- public Object clone () {
- XcasAnnotation o = prepareCopy();
- for (String s : references.keySet())
- o.references.put(s, (MyVector)references.get(s).clone());
- return o;
- }
-
- /**
- * Clones this object, its attributes, and reference keys.
- * @return A shallow copy of this object.
- */
- public final XcasAnnotation shallowCopy () {
- XcasAnnotation o = prepareCopy();
- for (String s : references.keySet())
- o.references.put(s, new MyVector());
- return o;
- }
-
- /**
- * Determines the order of this and the specified <code>XcasAnnotation</code>.
- * Note: It is strongly recommended that the use of this method be strictly
- * limited to the purpose of an orderly display of multiple objects.
- * To determine the equality of two objects, use {@link #equals(Object)}.
- * @see #equals(Object)
- */
- public int compareTo(XcasAnnotation o) {
- return description().compareTo(o.description());
- }
-}
+package edu.mayo.bmi.utils.xcas_comparison;
+import java.util.Collection;
+import java.util.Vector;
+import java.util.Hashtable;
+import java.util.Collections;
+
+/**
+ * An <code>XcasAnnotation</code> object represents an element under the <code>CAS</code>
+ * tag in an XCAS file. It provides members and methods to store and access
+ * its type, attributes,and references.
+ * <p>
+ * Note: this class has a natural ordering that is inconsistent with equals.
+ * It is strongly recommended that the use of {@link #compareTo(XcasAnnotation)}
+ * be strictly limited to the purpose of an orderly display of multiple objects.
+ * @author Mayo Clinic
+ *
+ */
+public class XcasAnnotation implements Cloneable, Comparable<XcasAnnotation> {
+
+ private class MyVector extends Vector<XcasAnnotation> implements Cloneable {
+ private static final long serialVersionUID = -8717810064045790243L;
+ public MyVector () { super(); }
+ public boolean contains (Object obj) {
+ if (obj.getClass()!=XcasAnnotation.class) return false;
+ for (XcasAnnotation a : this) if (a.equals(obj)) return true;
+ return false;
+ }
+ public boolean containsAll (Collection<?> c) {
+ if (c==this || c.size()==0) return true;
+ for (Object o : c)
+ if (o.getClass()!=XcasAnnotation.class || !contains(o)) return false;
+ return true;
+ }
+ public boolean equals (Object obj) {
+ if (obj.getClass()!=getClass() || ((MyVector)obj).size()!=size()) return false;
+ return containsAll((MyVector)obj);
+ }
+ public String toString () {
+ StringBuffer ret = new StringBuffer("[");
+ Collections.sort(this);
+ for (XcasAnnotation a : this)
+ ret.append(a.type.equalsIgnoreCase(Const.UIMA_SOFA) ? Const.HIDDEN_TEXT : a.description()).append(",");
+ if (size()>0) ret.deleteCharAt(ret.length()-1);
+ return ret.append("]").toString();
+ }
+ public Object clone () {
+ MyVector o = null;
+ try {
+ o = (MyVector)super.clone();
+ o.clear();
+ for (XcasAnnotation a : this) //TODO is the order guaranteed to be the same?
+ o.add((XcasAnnotation)a.clone());
+ } catch (Exception e) { e.printStackTrace(); }
+ return o;
+ }
+ }
+
+ protected String type;
+ protected Hashtable<String, String> attributes;
+ protected Hashtable<String, MyVector> references;
+ protected Hashtable<String, Vector<Integer>> refIntArrays;
+
+ /**
+ * Default constructor. Its type is initialized to empty.
+ */
+ public XcasAnnotation () {
+ type = "";
+ attributes = new Hashtable<String, String>();
+ references = new Hashtable<String, MyVector>();
+ refIntArrays = new Hashtable<String, Vector<Integer>>();
+ }
+
+ /**
+ * Constructs an object with the specified type.
+ * @param t Type of the <code>XcasAnnotation</code> object to be created.
+ */
+ public XcasAnnotation (String t) { this(); type = t; }
+
+ /**
+ * Sets the type name of this annotation.
+ * @param t Type to be set.
+ */
+ public void setType (String t) { type = t; }
+
+ /**
+ * Inserts an (attribute, value) pair to this <code>XcasAnnotation</code>.
+ * @param k Name of the attribute.
+ * @param v Value of the attribute.
+ */
+ public void insertAttribute (String k, String v) { attributes.put(k, v); }
+ //TODO Check for loop in references
+ public void insertReference (String k, XcasAnnotation a) {
+ if (references.containsKey(k))
+ references.get(k).add(a);
+ else {
+ MyVector v = new MyVector();
+ v.add(a);
+ references.put(k, v);
+ }
+ }
+
+ public void insertIntReference (String k, int[] a) {
+ Vector<Integer> v = new Vector<Integer>(a.length);
+ for (int i : a) v.add(i);
+ refIntArrays.put(k, v);
+ }
+
+ /**
+ * Returns the value of the specified attribute.
+ * @param name Name of the attribute.
+ * @return Value of the specified attribute.
+ */
+ public String getAttribute (String name) { return attributes.get(name); }
+
+ /**
+ * Returns the referenced <code>XcasAnnotation</code>s of the specified attribute.
+ * @param name Name of an attribute that references to other <code>XcasAnnotation</code>.
+ * @return A <code>HashSet</code> of referenced <XcasAnnotation</code> objects.
+ */
+ public Vector<XcasAnnotation> getReference (String name) { return references.get(name); }
+
+ /**
+ * Determines whether the specified object equals to this one. Specifically,
+ * an <code>XcasAnnotation a</code> equals to another one <code>o</code>
+ * if and only if <code>o</code> is also an <code>XcasAnnotation</code> object
+ * and <code>a.type.equals(o.type) && a.attributes.equals(o.attributes) &&
+ * a.references.equals(o.references)</code>.
+ * @param obj An object to compare with this one.
+ * @return <code>true</code> if the specified object equals this one,
+ * <code>false</code> otherwise.
+ */
+ public boolean equals (Object obj) {
+ return this==obj || ( obj.getClass()==getClass() &&
+ ((XcasAnnotation)obj).type.equals(type) &&
+ ((XcasAnnotation)obj).attributes.equals(attributes) &&
+ ((XcasAnnotation)obj).references.equals(references) &&
+ ((XcasAnnotation)obj).refIntArrays.equals(refIntArrays)
+ );
+ }
+
+ public String getType () { return type; }
+ /**
+ * Returns a short description of this <code>XcasAnnotation</code>'s type,
+ * specifically, the last segment as separated by dots.
+ * @return A short type name.
+ */
+ public String shortType () { return type.substring(type.lastIndexOf('.')+1); }
+
+ /**
+ * Returns a string representation of all the attributes and references.
+ * Some long values are shortened to ellipses.
+ * @return A string containing all attributes, references and their values.
+ */
+ public String allFieldsValues () {
+ StringBuffer ret = new StringBuffer("Attributes {");
+ Vector<String> v = new Vector<String>(attributes.keySet());
+ Collections.sort(v);
+ for (String s : v)
+ ret.append(s+"="+attributes.get(s)+", ");
+ if (v.size()>0) ret.replace(ret.length()-2, ret.length(), "} References {");
+ v.clear();
+ v.addAll(references.keySet());
+ v.addAll(refIntArrays.keySet());
+ Collections.sort(v);
+ for (String s : v)
+ ret.append(s+"="+(references.containsKey(s)?references.get(s):refIntArrays.get(s))+", ");
+ if (v.size()>0) ret.delete(ret.length()-2, ret.length());
+ ret.append("}");
+ return ret.toString();
+// return "Attributes "+attributes.toString()+" References "+references.toString();
+ }
+
+ /**
+ * Returns a String representation of this object, including its type, and
+ * all attributes and references. Named such so as not to override
+ * the default much shorter String representation
+ * @return A string containing the type and all attributes, references information.
+ */
+ public String description () { return shortType()+" "+allFieldsValues(); }
+
+ /**
+ * Clones this object and its attributes, but leave references blank.
+ * @return
+ */
+ private final XcasAnnotation prepareCopy () {
+ XcasAnnotation o = null;
+ try {
+ o = (XcasAnnotation)super.clone();
+ o.attributes = new Hashtable<String, String>();
+ o.attributes.putAll(attributes);
+ o.references = new Hashtable<String, MyVector>();
+ o.refIntArrays = new Hashtable<String, Vector<Integer>>();
+ for (String s : refIntArrays.keySet())
+ o.refIntArrays.put(s, new Vector<Integer>(refIntArrays.get(s)));
+ } catch (Exception e) { e.printStackTrace(); }
+ return o;
+ }
+
+ /**
+ * Recursive, deep copy of this object, including attributes and references.
+ */
+ public Object clone () {
+ XcasAnnotation o = prepareCopy();
+ for (String s : references.keySet())
+ o.references.put(s, (MyVector)references.get(s).clone());
+ return o;
+ }
+
+ /**
+ * Clones this object, its attributes, and reference keys.
+ * @return A shallow copy of this object.
+ */
+ public final XcasAnnotation shallowCopy () {
+ XcasAnnotation o = prepareCopy();
+ for (String s : references.keySet())
+ o.references.put(s, new MyVector());
+ return o;
+ }
+
+ /**
+ * Determines the order of this and the specified <code>XcasAnnotation</code>.
+ * Note: It is strongly recommended that the use of this method be strictly
+ * limited to the purpose of an orderly display of multiple objects.
+ * To determine the equality of two objects, use {@link #equals(Object)}.
+ * @see #equals(Object)
+ */
+ public int compareTo(XcasAnnotation o) {
+ return description().compareTo(o.description());
+ }
+}
Modified: incubator/ctakes/branches/SHARPn-cTAKES/utils/src/edu/mayo/bmi/utils/xcas_comparison/XcasDiff.java
URL: http://svn.apache.org/viewvc/incubator/ctakes/branches/SHARPn-cTAKES/utils/src/edu/mayo/bmi/utils/xcas_comparison/XcasDiff.java?rev=1403989&r1=1403988&r2=1403989&view=diff
==============================================================================
--- incubator/ctakes/branches/SHARPn-cTAKES/utils/src/edu/mayo/bmi/utils/xcas_comparison/XcasDiff.java (original)
+++ incubator/ctakes/branches/SHARPn-cTAKES/utils/src/edu/mayo/bmi/utils/xcas_comparison/XcasDiff.java Wed Oct 31 05:26:43 2012
@@ -1,18 +1,11 @@
/*
- * Copyright: (c) 2009 Mayo Foundation for Medical Education and
- * Research (MFMER). All rights reserved. MAYO, MAYO CLINIC, and the
- * triple-shield Mayo logo are trademarks and service marks of MFMER.
- *
- * Except as contained in the copyright notice above, or as used to identify
- * MFMER as the author of this software, the trade names, trademarks, service
- * marks, or product names of the copyright holder shall not be used in
- * advertising, promotion or otherwise in connection with this software without
- * prior written authorization of the copyright holder.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
@@ -21,199 +14,199 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package edu.mayo.bmi.utils.xcas_comparison;
-import java.util.LinkedList;
-import java.util.Collections;
-import java.io.Writer;
-import java.io.BufferedWriter;
-import java.io.IOException;
-
-/**
- * An <code>XcasDiff</code> object represents the comparison results of
- * two XCAS files. It also provides methods to output these results.
- * @author Mayo Clinic
- *
- */
-public class XcasDiff {
-
- private XcasFile f1, f2;
- private LinkedList<XcasAnnotation> f1_uniq;
- private LinkedList<XcasAnnotation> f2_uniq;
- private LinkedList<XcasAnnotation> common;
-
- /**
- * Default constructor.
- */
- public XcasDiff () {
- f1_uniq = new LinkedList<XcasAnnotation>();
- f2_uniq = new LinkedList<XcasAnnotation>();
- common = new LinkedList<XcasAnnotation>();
- }
-
- /**
- * Construct an <code>XCASDiff</code> object from two <code>XcasFile</code>
- * objects.
- * @param xf1 An <code>XcasFile</code> object.
- * @param xf2 Another <code>XcasFile</code> object.
- */
- public XcasDiff (XcasFile xf1, XcasFile xf2) {
- this();
- f1 = xf1;
- f2 = xf2;
- recalculate();
- }
-
- /**
- * Calculates the differences or recalculates after the two files are updated.
- * Works on an copy of the original annotations. Original objects are not touched.
- * Must be called if the original XcasFile is modified elsewhere.
- */
- public final void recalculate () {
- f1_uniq.clear();
- f2_uniq.clear();
- common.clear();
- LinkedList<XcasAnnotation> l1 = f1.annotationsClone();
- LinkedList<XcasAnnotation> l2 = f2.annotationsClone();
- for (XcasAnnotation a : l1) {
- if (l2.contains(a)) { common.add(a); l2.remove(a); }
- else f1_uniq.add(a);
- }
- f2_uniq.addAll(l2);
- Collections.sort(f1_uniq);
- Collections.sort(f2_uniq);
- Collections.sort(common);
- }
-
- /**
- * Prints common elements along with their attributes in the two XCAS files
- * to <code>stdout</code>.
- */
- public void printCommon () {
- for (XcasAnnotation a : common)
- System.out.println(a.description());
- }
-
- /**
- * Prints elements that are unique to each XCAS file to <code>stdout</code>.
- */
- public void printDiff () {
- try {
- System.out.println("-------- Unique to "+f1.f.getCanonicalFile().toString()+" --------");
- printUniq(1);
- System.out.println("-------- Unique to "+f2.f.getCanonicalFile().toString()+" --------");
- printUniq(2);
- } catch (Exception e) { e.printStackTrace(); }
- }
-
- /**
- * Prints elements that are unique to XCAS file <code>i</code>.
- * @param i XCAS file number, specified when constructing this object,
- * can only be 1 or 2.
- */
- public void printUniq (int i) {
- LinkedList<XcasAnnotation> toPrint;
- XcasFile f;
- if (i==1) { toPrint = f1_uniq; f = f1; }
- else if (i==2) { toPrint = f2_uniq; f = f2; }
- else { System.err.println("Not a legal file number: "+i); return; }
- for (XcasAnnotation a : toPrint)
- System.out.println(a.shortType()+" ~@"+f.getPositionOther(a)+" "+(a.shortType().equals(Const.UIMA_SOFA)?Const.HIDDEN_TEXT:a.allFieldsValues()));
- }
-
- /**
- * Writes an HTML summary of the comparison of the two XCAS files.
- * @param w An {@link java.io.Writer} object to write to.
- */
- public void printHTML (Writer w) {
- BufferedWriter bw = new BufferedWriter(w);
- try {
- String fName1 = f1.f.getCanonicalFile().toString();
- String fName2 = f2.f.getCanonicalFile().toString();
- bw.write("<html>"); bw.newLine();
- bw.write(" <head>"); bw.newLine();
- bw.write(" <title>Comparison of "+fName1+" and "+fName2+"</title>"); bw.newLine();
- bw.write(" <script language=\"javascript\">"); bw.newLine();
- bw.write(" function toggle_agreements() {"); bw.newLine();
- bw.write(" var ele = document.getElementById('xcasdiff');"); bw.newLine();
- bw.write(" if ((ele.rows[1].style.display=='none')) {"); bw.newLine();
- bw.write(" for (i=1;i<"+(common.size()+1)+";i++) ele.rows[i].style.display='';"); bw.newLine();
- bw.write(" } else {"); bw.newLine();
- bw.write(" for (i=1;i<"+(common.size()+1)+";i++) ele.rows[i].style.display='none';"); bw.newLine();
- bw.write(" }"); bw.newLine();
- bw.write(" }"); bw.newLine();
- bw.write(" </script>"); bw.newLine();
- bw.write(" </head>"); bw.newLine();
- bw.write("<body>"); bw.newLine();
- bw.write("<p><button onClick=\"toggle_agreements()\">Toggle Aggreements</button> Click this button to show or hide agreements.</p>"); bw.newLine();
- bw.write("<p>Positions are <i>approximate</i> line and column numbers of the element in a file. Yellow background cells indicate a similar element in a file without an exact match. A \"null\" means no similar match found.</p>"); bw.newLine();
- bw.write("<p>File 1: <a href=\"file://"+fName1+"\">"+fName1+"</a><br>"); bw.newLine();
- bw.write("File 2: <a href=\"file://"+fName2+"\">"+fName2+"</a></p>"); bw.newLine();
- bw.write("<p>Agreed on "+common.size()+" elements."); bw.newLine();
- bw.write("File 1 has "+f1_uniq.size()+" unique elements, and file 2 has "+f2_uniq.size()+" unique elements.</p>"); bw.newLine();
- bw.write("<table border=\"1\" id=\"xcasdiff\">"); bw.newLine();
- bw.write("<tr>"); bw.newLine();
- bw.write("<th></th>"); bw.newLine();
- bw.write("<th>Element</th>"); bw.newLine();
- bw.write("<th>Attributes</th>"); bw.newLine();
- bw.write("<th>Position in File 1</th>"); bw.newLine();
- bw.write("<th>Position in File 2</th>"); bw.newLine();
- bw.write("</tr>"); bw.newLine();
- int i = 0;
- for (XcasAnnotation a : common) {
- bw.write("<tr>"); bw.newLine();
- if (i++==0) { bw.write("<th rowspan=\""+common.size()+"\">Agreements</th>"); bw.newLine(); }
- bw.write("<td>"+a.shortType()+"</td>"); bw.newLine();
- bw.write("<td>"+(a.type.equals(Const.UIMA_SOFA)?Const.HIDDEN_TEXT:a.allFieldsValues())+"</td>"); bw.newLine();
- bw.write("<td>"+f1.getPositionOther(a)+"</td>"); bw.newLine();
- bw.write("<td>"+f2.getPositionOther(a)+"</td>"); bw.newLine();
- }
- if (i>0) { bw.write("</tr>"); bw.newLine(); i=0; }
- for (XcasAnnotation a : f1_uniq) {
- bw.write("<tr>"); bw.newLine();
- if (i++==0) { bw.write("<th rowspan=\""+(f1_uniq.size()+f2_uniq.size())+"\">Disagreements</th>"); bw.newLine(); }
- bw.write("<td>"+a.shortType()+"</td>"); bw.newLine();
- bw.write("<td>"+(a.type.equals(Const.UIMA_SOFA)?Const.HIDDEN_TEXT:a.allFieldsValues())+"</td>"); bw.newLine();
- bw.write("<td>"+f1.getPositionOther(a)+"</td>"); bw.newLine();
- bw.write("<td bgcolor=\"yellow\">"+f2.getPositionSimilar(a)+"</td>"); bw.newLine();
- }
- for (XcasAnnotation a : f2_uniq) {
- bw.write("<tr>"); bw.newLine();
- bw.write("<td>"+a.shortType()+"</td>"); bw.newLine();
- bw.write("<td>"+(a.type.equals(Const.UIMA_SOFA)?Const.HIDDEN_TEXT:a.allFieldsValues())+"</td>"); bw.newLine();
- bw.write("<td bgcolor=\"yellow\">"+f1.getPositionSimilar(a)+"</td>"); bw.newLine();
- bw.write("<td>"+f2.getPositionOther(a)+"</td>"); bw.newLine();
- }
- if (i>0) { bw.write("</tr>"); bw.newLine(); }
- bw.write("</table>"); bw.newLine();
- bw.write("</body>"); bw.newLine();
- bw.write("</html>"); bw.newLine();
- bw.close();
- } catch (IOException e) { e.printStackTrace(); }
- }
-
- /**
- * Prints elements that are unique to each XCAS file to <code>stdout</code>.
- * First constructs an anonymous <code>XcasDiff</code> object, and calls its
- * {@link #printDiff()}. Avoid using this method if you plan to use
- * <code>XcasDiff</code> object later.
- * @param f1 An <code>XcasFile</code> object.
- * @param f2 Another <code>XcasFile</code> object.
- * @see #printDiff()
- */
- public static void printDiff (XcasFile f1, XcasFile f2) {
- new XcasDiff(f1, f2).printDiff();
- }
-
- /**
- * Writes an HTML summary of the comparison of the two specified XCAS files.
- * First constructs an anonymous <code>XcasDiff</code> object, and calls its
- * {@link #printHTML(Writer)}. Avoid using this method if you plan to use
- * <code>XcasDiff</code> object later.
- * @param f1 An <code>XcasFile</code> object.
- * @param f2 Another <code>XcasFile</code> object.
- * @param w An {@link java.io.Writer} object to write to.
- */
- public static void printHTML (XcasFile f1, XcasFile f2, Writer w) {
- new XcasDiff(f1, f2).printHTML(w);
- }
-}
+package edu.mayo.bmi.utils.xcas_comparison;
+import java.util.LinkedList;
+import java.util.Collections;
+import java.io.Writer;
+import java.io.BufferedWriter;
+import java.io.IOException;
+
+/**
+ * An <code>XcasDiff</code> object represents the comparison results of
+ * two XCAS files. It also provides methods to output these results.
+ * @author Mayo Clinic
+ *
+ */
+public class XcasDiff {
+
+ private XcasFile f1, f2;
+ private LinkedList<XcasAnnotation> f1_uniq;
+ private LinkedList<XcasAnnotation> f2_uniq;
+ private LinkedList<XcasAnnotation> common;
+
+ /**
+ * Default constructor.
+ */
+ public XcasDiff () {
+ f1_uniq = new LinkedList<XcasAnnotation>();
+ f2_uniq = new LinkedList<XcasAnnotation>();
+ common = new LinkedList<XcasAnnotation>();
+ }
+
+ /**
+ * Construct an <code>XCASDiff</code> object from two <code>XcasFile</code>
+ * objects.
+ * @param xf1 An <code>XcasFile</code> object.
+ * @param xf2 Another <code>XcasFile</code> object.
+ */
+ public XcasDiff (XcasFile xf1, XcasFile xf2) {
+ this();
+ f1 = xf1;
+ f2 = xf2;
+ recalculate();
+ }
+
+ /**
+ * Calculates the differences or recalculates after the two files are updated.
+ * Works on an copy of the original annotations. Original objects are not touched.
+ * Must be called if the original XcasFile is modified elsewhere.
+ */
+ public final void recalculate () {
+ f1_uniq.clear();
+ f2_uniq.clear();
+ common.clear();
+ LinkedList<XcasAnnotation> l1 = f1.annotationsClone();
+ LinkedList<XcasAnnotation> l2 = f2.annotationsClone();
+ for (XcasAnnotation a : l1) {
+ if (l2.contains(a)) { common.add(a); l2.remove(a); }
+ else f1_uniq.add(a);
+ }
+ f2_uniq.addAll(l2);
+ Collections.sort(f1_uniq);
+ Collections.sort(f2_uniq);
+ Collections.sort(common);
+ }
+
+ /**
+ * Prints common elements along with their attributes in the two XCAS files
+ * to <code>stdout</code>.
+ */
+ public void printCommon () {
+ for (XcasAnnotation a : common)
+ System.out.println(a.description());
+ }
+
+ /**
+ * Prints elements that are unique to each XCAS file to <code>stdout</code>.
+ */
+ public void printDiff () {
+ try {
+ System.out.println("-------- Unique to "+f1.f.getCanonicalFile().toString()+" --------");
+ printUniq(1);
+ System.out.println("-------- Unique to "+f2.f.getCanonicalFile().toString()+" --------");
+ printUniq(2);
+ } catch (Exception e) { e.printStackTrace(); }
+ }
+
+ /**
+ * Prints elements that are unique to XCAS file <code>i</code>.
+ * @param i XCAS file number, specified when constructing this object,
+ * can only be 1 or 2.
+ */
+ public void printUniq (int i) {
+ LinkedList<XcasAnnotation> toPrint;
+ XcasFile f;
+ if (i==1) { toPrint = f1_uniq; f = f1; }
+ else if (i==2) { toPrint = f2_uniq; f = f2; }
+ else { System.err.println("Not a legal file number: "+i); return; }
+ for (XcasAnnotation a : toPrint)
+ System.out.println(a.shortType()+" ~@"+f.getPositionOther(a)+" "+(a.shortType().equals(Const.UIMA_SOFA)?Const.HIDDEN_TEXT:a.allFieldsValues()));
+ }
+
+ /**
+ * Writes an HTML summary of the comparison of the two XCAS files.
+ * @param w An {@link java.io.Writer} object to write to.
+ */
+ public void printHTML (Writer w) {
+ BufferedWriter bw = new BufferedWriter(w);
+ try {
+ String fName1 = f1.f.getCanonicalFile().toString();
+ String fName2 = f2.f.getCanonicalFile().toString();
+ bw.write("<html>"); bw.newLine();
+ bw.write(" <head>"); bw.newLine();
+ bw.write(" <title>Comparison of "+fName1+" and "+fName2+"</title>"); bw.newLine();
+ bw.write(" <script language=\"javascript\">"); bw.newLine();
+ bw.write(" function toggle_agreements() {"); bw.newLine();
+ bw.write(" var ele = document.getElementById('xcasdiff');"); bw.newLine();
+ bw.write(" if ((ele.rows[1].style.display=='none')) {"); bw.newLine();
+ bw.write(" for (i=1;i<"+(common.size()+1)+";i++) ele.rows[i].style.display='';"); bw.newLine();
+ bw.write(" } else {"); bw.newLine();
+ bw.write(" for (i=1;i<"+(common.size()+1)+";i++) ele.rows[i].style.display='none';"); bw.newLine();
+ bw.write(" }"); bw.newLine();
+ bw.write(" }"); bw.newLine();
+ bw.write(" </script>"); bw.newLine();
+ bw.write(" </head>"); bw.newLine();
+ bw.write("<body>"); bw.newLine();
+ bw.write("<p><button onClick=\"toggle_agreements()\">Toggle Aggreements</button> Click this button to show or hide agreements.</p>"); bw.newLine();
+ bw.write("<p>Positions are <i>approximate</i> line and column numbers of the element in a file. Yellow background cells indicate a similar element in a file without an exact match. A \"null\" means no similar match found.</p>"); bw.newLine();
+ bw.write("<p>File 1: <a href=\"file://"+fName1+"\">"+fName1+"</a><br>"); bw.newLine();
+ bw.write("File 2: <a href=\"file://"+fName2+"\">"+fName2+"</a></p>"); bw.newLine();
+ bw.write("<p>Agreed on "+common.size()+" elements."); bw.newLine();
+ bw.write("File 1 has "+f1_uniq.size()+" unique elements, and file 2 has "+f2_uniq.size()+" unique elements.</p>"); bw.newLine();
+ bw.write("<table border=\"1\" id=\"xcasdiff\">"); bw.newLine();
+ bw.write("<tr>"); bw.newLine();
+ bw.write("<th></th>"); bw.newLine();
+ bw.write("<th>Element</th>"); bw.newLine();
+ bw.write("<th>Attributes</th>"); bw.newLine();
+ bw.write("<th>Position in File 1</th>"); bw.newLine();
+ bw.write("<th>Position in File 2</th>"); bw.newLine();
+ bw.write("</tr>"); bw.newLine();
+ int i = 0;
+ for (XcasAnnotation a : common) {
+ bw.write("<tr>"); bw.newLine();
+ if (i++==0) { bw.write("<th rowspan=\""+common.size()+"\">Agreements</th>"); bw.newLine(); }
+ bw.write("<td>"+a.shortType()+"</td>"); bw.newLine();
+ bw.write("<td>"+(a.type.equals(Const.UIMA_SOFA)?Const.HIDDEN_TEXT:a.allFieldsValues())+"</td>"); bw.newLine();
+ bw.write("<td>"+f1.getPositionOther(a)+"</td>"); bw.newLine();
+ bw.write("<td>"+f2.getPositionOther(a)+"</td>"); bw.newLine();
+ }
+ if (i>0) { bw.write("</tr>"); bw.newLine(); i=0; }
+ for (XcasAnnotation a : f1_uniq) {
+ bw.write("<tr>"); bw.newLine();
+ if (i++==0) { bw.write("<th rowspan=\""+(f1_uniq.size()+f2_uniq.size())+"\">Disagreements</th>"); bw.newLine(); }
+ bw.write("<td>"+a.shortType()+"</td>"); bw.newLine();
+ bw.write("<td>"+(a.type.equals(Const.UIMA_SOFA)?Const.HIDDEN_TEXT:a.allFieldsValues())+"</td>"); bw.newLine();
+ bw.write("<td>"+f1.getPositionOther(a)+"</td>"); bw.newLine();
+ bw.write("<td bgcolor=\"yellow\">"+f2.getPositionSimilar(a)+"</td>"); bw.newLine();
+ }
+ for (XcasAnnotation a : f2_uniq) {
+ bw.write("<tr>"); bw.newLine();
+ bw.write("<td>"+a.shortType()+"</td>"); bw.newLine();
+ bw.write("<td>"+(a.type.equals(Const.UIMA_SOFA)?Const.HIDDEN_TEXT:a.allFieldsValues())+"</td>"); bw.newLine();
+ bw.write("<td bgcolor=\"yellow\">"+f1.getPositionSimilar(a)+"</td>"); bw.newLine();
+ bw.write("<td>"+f2.getPositionOther(a)+"</td>"); bw.newLine();
+ }
+ if (i>0) { bw.write("</tr>"); bw.newLine(); }
+ bw.write("</table>"); bw.newLine();
+ bw.write("</body>"); bw.newLine();
+ bw.write("</html>"); bw.newLine();
+ bw.close();
+ } catch (IOException e) { e.printStackTrace(); }
+ }
+
+ /**
+ * Prints elements that are unique to each XCAS file to <code>stdout</code>.
+ * First constructs an anonymous <code>XcasDiff</code> object, and calls its
+ * {@link #printDiff()}. Avoid using this method if you plan to use
+ * <code>XcasDiff</code> object later.
+ * @param f1 An <code>XcasFile</code> object.
+ * @param f2 Another <code>XcasFile</code> object.
+ * @see #printDiff()
+ */
+ public static void printDiff (XcasFile f1, XcasFile f2) {
+ new XcasDiff(f1, f2).printDiff();
+ }
+
+ /**
+ * Writes an HTML summary of the comparison of the two specified XCAS files.
+ * First constructs an anonymous <code>XcasDiff</code> object, and calls its
+ * {@link #printHTML(Writer)}. Avoid using this method if you plan to use
+ * <code>XcasDiff</code> object later.
+ * @param f1 An <code>XcasFile</code> object.
+ * @param f2 Another <code>XcasFile</code> object.
+ * @param w An {@link java.io.Writer} object to write to.
+ */
+ public static void printHTML (XcasFile f1, XcasFile f2, Writer w) {
+ new XcasDiff(f1, f2).printHTML(w);
+ }
+}
Modified: incubator/ctakes/branches/SHARPn-cTAKES/utils/src/edu/mayo/bmi/utils/xcas_comparison/XcasFile.java
URL: http://svn.apache.org/viewvc/incubator/ctakes/branches/SHARPn-cTAKES/utils/src/edu/mayo/bmi/utils/xcas_comparison/XcasFile.java?rev=1403989&r1=1403988&r2=1403989&view=diff
==============================================================================
--- incubator/ctakes/branches/SHARPn-cTAKES/utils/src/edu/mayo/bmi/utils/xcas_comparison/XcasFile.java (original)
+++ incubator/ctakes/branches/SHARPn-cTAKES/utils/src/edu/mayo/bmi/utils/xcas_comparison/XcasFile.java Wed Oct 31 05:26:43 2012
@@ -1,18 +1,11 @@
/*
- * Copyright: (c) 2009 Mayo Foundation for Medical Education and
- * Research (MFMER). All rights reserved. MAYO, MAYO CLINIC, and the
- * triple-shield Mayo logo are trademarks and service marks of MFMER.
- *
- * Except as contained in the copyright notice above, or as used to identify
- * MFMER as the author of this software, the trade names, trademarks, service
- * marks, or product names of the copyright holder shall not be used in
- * advertising, promotion or otherwise in connection with this software without
- * prior written authorization of the copyright holder.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
@@ -21,227 +14,227 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package edu.mayo.bmi.utils.xcas_comparison;
-import java.util.Hashtable;
-import java.util.LinkedList;
-import java.util.Vector;
-import java.io.File;
-
-/**
- * An <code>XcasFile</code> wraps all <code>XcasAnnotations</code>s
- * in it and also contains their position information in terms of
- * line and column numbers.
- * @author Mayo Clinic
- *
- */
-public class XcasFile implements Cloneable {
-
- protected File f;
- protected Hashtable<Integer, XcasAnnotation> annotations;
- protected Hashtable<XcasAnnotation, String> positions;
-
- /**
- * Default constructor.
- */
- public XcasFile () {
- annotations = new Hashtable<Integer, XcasAnnotation>();
- positions = new Hashtable<XcasAnnotation, String>();
- }
-
- /**
- * Constructs an <code>XcasFile</code> with the specified name.
- * @param f File name.
- */
- public XcasFile (String f) { this(); this.f = new File(f); }
-
- /**
- * Constructs an <code>XcasFile</code> with the specified name.
- * @param f A File object.
- */
- public XcasFile (File f) { this(); this.f = f; }
-
- /**
- * Creates a new <code>XcasFile</code> object from the specified file.
- * Avoid using this method if you plan to parse multiple files,
- * as this method creates an anonymous <code>XcasProcessor</code> instance
- * each time called, which could be used to parse multiple files.
- * @param f A string containing the XCAS file name.
- * @return A parsed <code>XcasFile</code> object.
- */
- public static XcasFile process (String f) {
- return (new XcasProcessor()).process(f);
- }
-
- /**
- * Inserts a new annotation with the specified internal <code>id</code>
- * to this <code>XcasFile</code>.
- * @param id UIMA CAS internal <code>_id</code>.
- * @param a An <code>XcasAnnotation</code> object to add.
- * @see #addAnnotation(int, XcasAnnotation, String)
- * @see #addAnnotation(int, XcasAnnotation, int, int)
- */
- public void addAnnotation (int id, XcasAnnotation a) { annotations.put(id, a); }
-
- /**
- * Inserts a new annotation, along with its position in the file,
- * to this <code>XcasFile</code> object.
- * @param id UIMA CAS internal <code>_id</code>.
- * @param a An <code>XcasAnnotation</code> object to add.
- * @param pos Line and column number of the specified annotation,
- * in the form of <code>line_number:column_number</code>.
- */
- public void addAnnotation (int id, XcasAnnotation a, String pos) { addAnnotation(id, a); positions.put(a, pos); }
-
- /**
- * Inserts a new annotation, along with its position in the file,
- * to this <code>XcasFile</code> object.
- * @param id UIMA CAS internal <code>_id</code>.
- * @param a An <code>XcasAnnotation</code> object to add.
- * @param lineNum Line number of the specified annotation.
- * @param colNum Column number of the specified annotation.
- */
- public void addAnnotation (int id, XcasAnnotation a, int lineNum, int colNum) { addAnnotation(id, a, Integer.toString(lineNum)+":"+Integer.toString(colNum)); }
-
- /**
- * Returns the <code>XcasAnnotation</code> object associated with
- * the specified internal id.
- * @param id UIMA CAS internal <code>_id</code>.
- * @return The <code>XcasAnnotation</code> with the specified id.
- */
- public XcasAnnotation getAnnotation (int id) { return annotations.get(id); }
-
- public java.util.Collection<XcasAnnotation> getAllAnnotations () { return annotations.values(); }
- public String getFileName () { return f.getName(); }
-
- /**
- * Returns the line and column numbers of the specified <code>XcasAnnotation</code>,
- * which is included in this <code>XcasFile</code> object.
- * @param a
- * @return A string containing the line and column numbers of the specified object,
- * in the form of <code>line_number:column_number</code>.
- * @see #getPositionOwn(int)
- * @see #getPositionOther(XcasAnnotation)
- */
- public String getPositionOwn (XcasAnnotation a) { return positions.get(a); }
-
- /**
- * Returns the line and column numbers of the <code>XcasAnnotation</code>,
- * specified by the original XCAS internal <code>_id</code> field.
- * @param id UIMA CAS internal <code>_id</code>.
- * @return A string containing the line and column numbers of the specified object,
- * in the form of <code>line_number:column_number</code>.
- * @see #getPositionOwn(XcasAnnotation)
- * @see #getPositionOther(XcasAnnotation)
- */
- public String getPositionOwn (int id) { return positions.get(annotations.get(id)); }
-
- /**
- * Finds an <code>XcasAnnotation</code> with the same attributes as specified,
- * and returns its line and column numbers.
- * @param a
- * @return A string containing the line and column numbers of the specified object,
- * in the form of <code>line_number:column_number</code>.
- * @see #getPositionOwn(int)
- * @see #getPositionOwn(XcasAnnotation)
- */
- public String getPositionOther (XcasAnnotation a) {
- for (XcasAnnotation o : positions.keySet())
- if (o.equals(a)) return positions.get(o);
- return null;
- }
-
- /**
- * Returns the line and column numbers of the specified <code>XcasAnnotation</code>.
- * <p>
- * Do not use this method if you know the specified <code>XcasAnnotation</code>
- * object is in this <code>XcasFile</code>. Instead, use
- * {@link #getPositionOwn(XcasAnnotation)}, which is faster.
- * @param a An
- * @return A string containing the line and column numbers of the specified object,
- * in the form of <code>line_number:column_number</code>.
- * @see #getPositionOwn(XcasAnnotation)
- * @see #getPositionOther(XcasAnnotation)
- */
- public String getPosition (XcasAnnotation a) {
- if (positions.keySet().contains(a)) return positions.get(a);
- else return getPositionOther(a);
- }
-
- /**
- * Finds an <code>XcasAnnotation</code> of the same type as specified, and
- * a same text span, then returns its line and column number.
- * @param a An <code>XcasAnnotation</code> against which a similar
- * <code>XcasAnnotation</code> in this <code>XcasFile</code>
- * is to be matched.
- * @return A string containing the line and column numbers of the specified object,
- * in the form of <code>line_number:column_number</code>.
- * @see #getPositionOther(XcasAnnotation)
- */
- public String getPositionSimilar (XcasAnnotation a) {
- for (XcasAnnotation o : positions.keySet())
- if (o.type.equals(a.type)) {
- int oBegin = o.attributes.containsKey("begin") ? Integer.parseInt(o.getAttribute("begin")) : -1;
- int oEnd = o.attributes.containsKey("end") ? Integer.parseInt(o.getAttribute("end")) : -1;
- int aBegin = a.attributes.containsKey("begin") ? Integer.parseInt(a.getAttribute("begin")) : -2;
- int aEnd = a.attributes.containsKey("end") ? Integer.parseInt(a.getAttribute("end")) : -2;
- if (oBegin==aBegin && oEnd==aEnd) return positions.get(o);
- else if (o.attributes.containsKey("key") && a.attributes.containsKey("key") && o.getAttribute("key").equals(a.getAttribute("key")))
- return positions.get(o);
- }
- return null;
- }
-
- /**
- * Checks whether this XCAS file has an annotation with the specified id.
- * @param id UIMA CAS internal <code>_id</code>.
- * @return <code>true</code> if file has an annotation with the specified id,
- * <code>false</code> otherwise.
- */
- public boolean hasAnnotation (int id) { return annotations.containsKey(id); }
-
- /**
- * Checks whether this XCAS file has the specified <code>XcasAnnotation</code>.
- * If there is an <code>XcasAnnotation</code> object that has exactly the same
- * type, attributes, and references, return <code>true</code>.
- * @param a An <code>XcasAnnotation</code> to check.
- * @return <code>true</code> if there is one <code>XcasAnnotation</code> equals
- * the specified one, <code>false</code> otherwise.
- * @see XcasAnnotation#equals(Object)
- */
- public boolean hasAnnotation (XcasAnnotation a) { return annotations.containsValue(a); }
-
- /**
- * Checks whether the specified object has the same set of annotations. First check
- * whether the specified is an <code>XcasFile</code> object. If so, check whether
- * its annotation set is of the same size as in this <code>XcasFile</code>, then check
- * whether these two sets are equal.
- * @param obj An object to compare to.
- * @return <code>true if the specified object is an <code>XcasFile</code> object and
- * has a same set of <code>XcasAnnotations</code>, <code>false</code> otherwise.
- */
- public boolean equals (Object obj) {
- if (obj.getClass()!=getClass() || annotations.values().size()!=((XcasFile)obj).annotations.values().size()) return false;
- return annotations.values().containsAll(((XcasFile)obj).annotations.values());
- }
-
- public LinkedList<XcasAnnotation> annotationsClone () {
- LinkedList<XcasAnnotation> ret = new LinkedList<XcasAnnotation>();
- Hashtable<XcasAnnotation, XcasAnnotation> cloneMap = new Hashtable<XcasAnnotation, XcasAnnotation>();
- for (XcasAnnotation a : annotations.values()) {
- XcasAnnotation c = a.shallowCopy();
- cloneMap.put(a, c);
- ret.add(c);
- }
- for (XcasAnnotation a : annotations.values())
- for (String s : a.references.keySet())
- for (XcasAnnotation r : (Vector<XcasAnnotation>)a.references.get(s))
- ((Vector<XcasAnnotation>)cloneMap.get(a).references.get(s)).add(cloneMap.get(r));
- return ret;
- }
-
- public Object clone () {
- return null; //TODO implement clone?
- // Should not use XcasAnnotation.clone()
- // otherwise, XcasAnnotation objects referenced by multiple objects will be cloned more than once.
- }
-}
+package edu.mayo.bmi.utils.xcas_comparison;
+import java.util.Hashtable;
+import java.util.LinkedList;
+import java.util.Vector;
+import java.io.File;
+
+/**
+ * An <code>XcasFile</code> wraps all <code>XcasAnnotations</code>s
+ * in it and also contains their position information in terms of
+ * line and column numbers.
+ * @author Mayo Clinic
+ *
+ */
+public class XcasFile implements Cloneable {
+
+ protected File f;
+ protected Hashtable<Integer, XcasAnnotation> annotations;
+ protected Hashtable<XcasAnnotation, String> positions;
+
+ /**
+ * Default constructor.
+ */
+ public XcasFile () {
+ annotations = new Hashtable<Integer, XcasAnnotation>();
+ positions = new Hashtable<XcasAnnotation, String>();
+ }
+
+ /**
+ * Constructs an <code>XcasFile</code> with the specified name.
+ * @param f File name.
+ */
+ public XcasFile (String f) { this(); this.f = new File(f); }
+
+ /**
+ * Constructs an <code>XcasFile</code> with the specified name.
+ * @param f A File object.
+ */
+ public XcasFile (File f) { this(); this.f = f; }
+
+ /**
+ * Creates a new <code>XcasFile</code> object from the specified file.
+ * Avoid using this method if you plan to parse multiple files,
+ * as this method creates an anonymous <code>XcasProcessor</code> instance
+ * each time called, which could be used to parse multiple files.
+ * @param f A string containing the XCAS file name.
+ * @return A parsed <code>XcasFile</code> object.
+ */
+ public static XcasFile process (String f) {
+ return (new XcasProcessor()).process(f);
+ }
+
+ /**
+ * Inserts a new annotation with the specified internal <code>id</code>
+ * to this <code>XcasFile</code>.
+ * @param id UIMA CAS internal <code>_id</code>.
+ * @param a An <code>XcasAnnotation</code> object to add.
+ * @see #addAnnotation(int, XcasAnnotation, String)
+ * @see #addAnnotation(int, XcasAnnotation, int, int)
+ */
+ public void addAnnotation (int id, XcasAnnotation a) { annotations.put(id, a); }
+
+ /**
+ * Inserts a new annotation, along with its position in the file,
+ * to this <code>XcasFile</code> object.
+ * @param id UIMA CAS internal <code>_id</code>.
+ * @param a An <code>XcasAnnotation</code> object to add.
+ * @param pos Line and column number of the specified annotation,
+ * in the form of <code>line_number:column_number</code>.
+ */
+ public void addAnnotation (int id, XcasAnnotation a, String pos) { addAnnotation(id, a); positions.put(a, pos); }
+
+ /**
+ * Inserts a new annotation, along with its position in the file,
+ * to this <code>XcasFile</code> object.
+ * @param id UIMA CAS internal <code>_id</code>.
+ * @param a An <code>XcasAnnotation</code> object to add.
+ * @param lineNum Line number of the specified annotation.
+ * @param colNum Column number of the specified annotation.
+ */
+ public void addAnnotation (int id, XcasAnnotation a, int lineNum, int colNum) { addAnnotation(id, a, Integer.toString(lineNum)+":"+Integer.toString(colNum)); }
+
+ /**
+ * Returns the <code>XcasAnnotation</code> object associated with
+ * the specified internal id.
+ * @param id UIMA CAS internal <code>_id</code>.
+ * @return The <code>XcasAnnotation</code> with the specified id.
+ */
+ public XcasAnnotation getAnnotation (int id) { return annotations.get(id); }
+
+ public java.util.Collection<XcasAnnotation> getAllAnnotations () { return annotations.values(); }
+ public String getFileName () { return f.getName(); }
+
+ /**
+ * Returns the line and column numbers of the specified <code>XcasAnnotation</code>,
+ * which is included in this <code>XcasFile</code> object.
+ * @param a
+ * @return A string containing the line and column numbers of the specified object,
+ * in the form of <code>line_number:column_number</code>.
+ * @see #getPositionOwn(int)
+ * @see #getPositionOther(XcasAnnotation)
+ */
+ public String getPositionOwn (XcasAnnotation a) { return positions.get(a); }
+
+ /**
+ * Returns the line and column numbers of the <code>XcasAnnotation</code>,
+ * specified by the original XCAS internal <code>_id</code> field.
+ * @param id UIMA CAS internal <code>_id</code>.
+ * @return A string containing the line and column numbers of the specified object,
+ * in the form of <code>line_number:column_number</code>.
+ * @see #getPositionOwn(XcasAnnotation)
+ * @see #getPositionOther(XcasAnnotation)
+ */
+ public String getPositionOwn (int id) { return positions.get(annotations.get(id)); }
+
+ /**
+ * Finds an <code>XcasAnnotation</code> with the same attributes as specified,
+ * and returns its line and column numbers.
+ * @param a
+ * @return A string containing the line and column numbers of the specified object,
+ * in the form of <code>line_number:column_number</code>.
+ * @see #getPositionOwn(int)
+ * @see #getPositionOwn(XcasAnnotation)
+ */
+ public String getPositionOther (XcasAnnotation a) {
+ for (XcasAnnotation o : positions.keySet())
+ if (o.equals(a)) return positions.get(o);
+ return null;
+ }
+
+ /**
+ * Returns the line and column numbers of the specified <code>XcasAnnotation</code>.
+ * <p>
+ * Do not use this method if you know the specified <code>XcasAnnotation</code>
+ * object is in this <code>XcasFile</code>. Instead, use
+ * {@link #getPositionOwn(XcasAnnotation)}, which is faster.
+ * @param a An
+ * @return A string containing the line and column numbers of the specified object,
+ * in the form of <code>line_number:column_number</code>.
+ * @see #getPositionOwn(XcasAnnotation)
+ * @see #getPositionOther(XcasAnnotation)
+ */
+ public String getPosition (XcasAnnotation a) {
+ if (positions.keySet().contains(a)) return positions.get(a);
+ else return getPositionOther(a);
+ }
+
+ /**
+ * Finds an <code>XcasAnnotation</code> of the same type as specified, and
+ * a same text span, then returns its line and column number.
+ * @param a An <code>XcasAnnotation</code> against which a similar
+ * <code>XcasAnnotation</code> in this <code>XcasFile</code>
+ * is to be matched.
+ * @return A string containing the line and column numbers of the specified object,
+ * in the form of <code>line_number:column_number</code>.
+ * @see #getPositionOther(XcasAnnotation)
+ */
+ public String getPositionSimilar (XcasAnnotation a) {
+ for (XcasAnnotation o : positions.keySet())
+ if (o.type.equals(a.type)) {
+ int oBegin = o.attributes.containsKey("begin") ? Integer.parseInt(o.getAttribute("begin")) : -1;
+ int oEnd = o.attributes.containsKey("end") ? Integer.parseInt(o.getAttribute("end")) : -1;
+ int aBegin = a.attributes.containsKey("begin") ? Integer.parseInt(a.getAttribute("begin")) : -2;
+ int aEnd = a.attributes.containsKey("end") ? Integer.parseInt(a.getAttribute("end")) : -2;
+ if (oBegin==aBegin && oEnd==aEnd) return positions.get(o);
+ else if (o.attributes.containsKey("key") && a.attributes.containsKey("key") && o.getAttribute("key").equals(a.getAttribute("key")))
+ return positions.get(o);
+ }
+ return null;
+ }
+
+ /**
+ * Checks whether this XCAS file has an annotation with the specified id.
+ * @param id UIMA CAS internal <code>_id</code>.
+ * @return <code>true</code> if file has an annotation with the specified id,
+ * <code>false</code> otherwise.
+ */
+ public boolean hasAnnotation (int id) { return annotations.containsKey(id); }
+
+ /**
+ * Checks whether this XCAS file has the specified <code>XcasAnnotation</code>.
+ * If there is an <code>XcasAnnotation</code> object that has exactly the same
+ * type, attributes, and references, return <code>true</code>.
+ * @param a An <code>XcasAnnotation</code> to check.
+ * @return <code>true</code> if there is one <code>XcasAnnotation</code> equals
+ * the specified one, <code>false</code> otherwise.
+ * @see XcasAnnotation#equals(Object)
+ */
+ public boolean hasAnnotation (XcasAnnotation a) { return annotations.containsValue(a); }
+
+ /**
+ * Checks whether the specified object has the same set of annotations. First check
+ * whether the specified is an <code>XcasFile</code> object. If so, check whether
+ * its annotation set is of the same size as in this <code>XcasFile</code>, then check
+ * whether these two sets are equal.
+ * @param obj An object to compare to.
+ * @return <code>true if the specified object is an <code>XcasFile</code> object and
+ * has a same set of <code>XcasAnnotations</code>, <code>false</code> otherwise.
+ */
+ public boolean equals (Object obj) {
+ if (obj.getClass()!=getClass() || annotations.values().size()!=((XcasFile)obj).annotations.values().size()) return false;
+ return annotations.values().containsAll(((XcasFile)obj).annotations.values());
+ }
+
+ public LinkedList<XcasAnnotation> annotationsClone () {
+ LinkedList<XcasAnnotation> ret = new LinkedList<XcasAnnotation>();
+ Hashtable<XcasAnnotation, XcasAnnotation> cloneMap = new Hashtable<XcasAnnotation, XcasAnnotation>();
+ for (XcasAnnotation a : annotations.values()) {
+ XcasAnnotation c = a.shallowCopy();
+ cloneMap.put(a, c);
+ ret.add(c);
+ }
+ for (XcasAnnotation a : annotations.values())
+ for (String s : a.references.keySet())
+ for (XcasAnnotation r : (Vector<XcasAnnotation>)a.references.get(s))
+ ((Vector<XcasAnnotation>)cloneMap.get(a).references.get(s)).add(cloneMap.get(r));
+ return ret;
+ }
+
+ public Object clone () {
+ return null; //TODO implement clone?
+ // Should not use XcasAnnotation.clone()
+ // otherwise, XcasAnnotation objects referenced by multiple objects will be cloned more than once.
+ }
+}