001    /*
002     * The contents of this file are subject to the Mozilla Public
003     * License Version 1.1 (the "License"); you may not use this file
004     * except in compliance with the License. You may obtain a copy of
005     * the License at http://www.mozilla.org/MPL/
006     *
007     * Software distributed under the License is distributed on an "AS
008     * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
009     * implied. See the License for the specific language governing
010     * rights and limitations under the License.
011     *
012     * The Original Code is Knowtator.
013     *
014     * The Initial Developer of the Original Code is University of Colorado.  
015     * Copyright (C) 2005 - 2008.  All Rights Reserved.
016     *
017     * Knowtator was developed by the Center for Computational Pharmacology
018     * (http://compbio.uchcs.edu) at the University of Colorado Health 
019     *  Sciences Center School of Medicine with support from the National 
020     *  Library of Medicine.  
021     *
022     * Current information about Knowtator can be obtained at 
023     * http://knowtator.sourceforge.net/
024     *
025     * Contributor(s):
026     *   Philip V. Ogren <philip@ogren.info> (Original Author)
027     */
028    package edu.uchsc.ccp.knowtator.util;
029    
030    import java.awt.Color;
031    import java.util.ArrayList;
032    import java.util.Collection;
033    import java.util.HashSet;
034    import java.util.Set;
035    
036    import edu.stanford.smi.protege.model.Cls;
037    import edu.stanford.smi.protege.model.Instance;
038    import edu.stanford.smi.protege.model.KnowledgeBase;
039    import edu.stanford.smi.protege.model.Project;
040    import edu.stanford.smi.protege.model.SimpleInstance;
041    import edu.stanford.smi.protege.model.Slot;
042    import edu.stanford.smi.protege.util.CollectionUtilities;
043    import edu.uchsc.ccp.knowtator.AnnotationUtil;
044    import edu.uchsc.ccp.knowtator.DisplayColors;
045    import edu.uchsc.ccp.knowtator.InvalidSpanException;
046    import edu.uchsc.ccp.knowtator.KnowtatorManager;
047    import edu.uchsc.ccp.knowtator.KnowtatorProjectUtil;
048    import edu.uchsc.ccp.knowtator.MentionUtil;
049    import edu.uchsc.ccp.knowtator.Span;
050    import edu.uchsc.ccp.knowtator.TextSourceUtil;
051    
052    /**
053     * This class simply iterates over annotations and mentions in a Knowtator
054     * project and accesses the slot values of each. The annotations are a flat data
055     * structure so it is sufficient to simply iterate through them. The mentions
056     * are recursively defined so iterating over them is slightly more complicated.
057     * 
058     * This code doesn't really do anything. If you were going to export the code to
059     * xml or to UIMA you would want to do something with the data structures as you
060     * accessed them.
061     * 
062     * This code does compile but it has not been run or tested. It is, however,
063     * mostly code stolen from MergeAnnotations.java which does run and has been
064     * "tested".
065     */
066    
067    public class ExportAnnotations {
068    
069            Project project;
070    
071            KnowledgeBase kb;
072    
073            KnowtatorProjectUtil kpu;
074    
075            KnowtatorManager manager;
076    
077            AnnotationUtil annotationUtil;
078    
079            TextSourceUtil textSourceUtil;
080    
081            MentionUtil mentionUtil;
082    
083            DisplayColors displayColors;
084    
085            java.util.List<Instance> annotations;
086    
087            java.util.List<Instance> mentions;
088    
089            public ExportAnnotations(Project project) throws Exception {
090                    this.project = project;
091                    kb = project.getKnowledgeBase();
092                    kpu = new KnowtatorProjectUtil(kb);
093                    manager = new KnowtatorManager(kpu);
094                    annotationUtil = manager.getAnnotationUtil();
095                    textSourceUtil = new TextSourceUtil(annotationUtil, kpu);
096                    textSourceUtil.init();
097                    annotationUtil.setTextSourceUtil(textSourceUtil);
098                    mentionUtil = manager.getMentionUtil();
099                    displayColors = manager.getDisplayColors();
100    
101                    annotations = new ArrayList<Instance>(kb.getInstances(kpu.getAnnotationCls()));
102    
103                    mentions = new ArrayList<Instance>(kb.getInstances(kpu.getMentionCls()));
104    
105                    System.out.println("annotations.size()= " + annotations.size());
106                    System.out.println("mentions.size()= " + mentions.size());
107    
108                    exportAnnotations();
109                    exportMentions();
110    
111            }
112    
113            public void exportAnnotations() {
114                    for (Instance ann : annotations) {
115                            SimpleInstance annotation = (SimpleInstance) ann;
116                            SimpleInstance mention = annotationUtil.getMention(annotation);
117                            System.out.println("mention = " + mention);
118    
119                            SimpleInstance annotator = annotationUtil.getAnnotator(annotation);
120                            String annotatorID = annotator.getName();
121                            System.out.println("annotatorID=" + annotatorID);
122    
123                            String annotatorName = annotator.getBrowserText();
124                            System.out.println("annotatorName=" + annotatorName);
125    
126                            String comment = annotationUtil.getComment(annotation);
127                            System.out.println("comment=" + comment);
128    
129                            // ?? how to get to Date object
130                            String dateString = annotationUtil.getCreationDate(annotation);
131                            System.out.println("dateString=" + dateString);
132    
133                            Color annotationColor = displayColors.getColor(annotation);
134                            System.out.println("annotationColor=" + annotationColor);
135    
136                            try {
137                                    java.util.List<Span> spans = annotationUtil.getSpans(annotation);
138                                    System.out.println("spans=" + spans);
139                            } catch (InvalidSpanException ise) {
140                            }
141    
142                            String spannedText = annotationUtil.getText(annotation);
143                            System.out.println("spannedText=" + spannedText);
144    
145                            SimpleInstance textSourceInstance = annotationUtil.getTextSource(annotation);
146                            String textSourceID = textSourceInstance.getName();
147                            System.out.println("textSourceID=" + textSourceID);
148    
149                            Collection<SimpleInstance> annotationSets = (Collection<SimpleInstance>) annotation.getOwnSlotValues(kpu
150                                            .getSetSlot());
151                            for (SimpleInstance setInstance : annotationSets) {
152                                    String setName = setInstance.getName();
153                                    System.out.println("setName=" + setName);
154                            }
155                    }
156            }
157    
158            public void exportMentions() {
159                    Set<SimpleInstance> exportedMentions = new HashSet<SimpleInstance>();
160                    for (Instance mntn : mentions) {
161                            SimpleInstance mention = (SimpleInstance) mntn;
162                            exportMention(mention, exportedMentions);
163                    }
164            }
165    
166            private SimpleInstance exportMention(SimpleInstance mention, Set<SimpleInstance> exportedMentions) {
167                    if (!exportedMentions.contains(mention)) {
168                            if (mentionUtil.isClassMention(mention)) {
169                                    Cls mentionCls = mentionUtil.getMentionCls(mention);
170                                    String mentionClsName = "";
171                                    System.out.println("mentionClsName=" + mentionClsName);
172    
173                                    if (mentionCls != null)
174                                            mentionClsName = mentionCls.getName();
175                                    exportedMentions.add(mention);
176    
177                                    Collection<SimpleInstance> slotMentions = (Collection<SimpleInstance>) mention.getOwnSlotValues(kpu
178                                                    .getSlotMentionSlot());
179                                    for (SimpleInstance slotMention : slotMentions) {
180                                            exportMention(slotMention, exportedMentions);
181                                    }
182                            } else if (mentionUtil.isInstanceMention(mention)) {
183                                    SimpleInstance instance = mentionUtil.getMentionInstance(mention);
184                                    String instanceName = "";
185                                    System.out.println("instanceName=" + instanceName);
186    
187                                    if (instance != null)
188                                            instanceName = instance.getName();
189                                    exportedMentions.add(mention);
190    
191                                    Collection<SimpleInstance> slotMentions = (Collection<SimpleInstance>) mention.getOwnSlotValues(kpu
192                                                    .getSlotMentionSlot());
193                                    for (SimpleInstance slotMention : slotMentions) {
194                                            exportMention(slotMention, exportedMentions);
195                                    }
196                            } else if (mentionUtil.isSlotMention(mention)) {
197                                    Slot slot = mentionUtil.getSlotMentionSlot(mention);
198                                    String slotName = slot.getName();
199                                    System.out.println("slotName=" + slotName);
200    
201                                    exportedMentions.add(mention);
202    
203                                    Collection slotValues = mention.getOwnSlotValues(kpu.getMentionSlotValueSlot());
204    
205                                    if (slotValues != null && slotValues.size() > 0) {
206                                            Object value = CollectionUtilities.getFirstItem(slotValues);
207                                            if (value instanceof SimpleInstance) {
208                                                    for (Object slotValue : slotValues) {
209                                                            SimpleInstance slotValueInstance = (SimpleInstance) slotValue;
210                                                            exportMention(slotValueInstance, exportedMentions);
211                                                    }
212                                            } else {
213                                                    // value is some primitive such as int, String, boolean
214                                            }
215                                    }
216                            }
217    
218                            Collection<SimpleInstance> mentionAnnotations = (Collection<SimpleInstance>) mention.getOwnSlotValues(kpu
219                                            .getMentionAnnotationSlot());
220                            if (mentionAnnotations != null) {
221                                    for (SimpleInstance mentionAnnotation : mentionAnnotations) {
222                                            System.out.println("mentionAnnotation=" + mentionAnnotation);
223    
224                                            // do something
225                                    }
226                            }
227                    }
228                    return mention;
229            }
230    }