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    
029    package edu.uchsc.ccp.knowtator.textsource;
030    
031    import java.util.ArrayList;
032    import java.util.Collections;
033    import java.util.List;
034    
035    import edu.stanford.smi.protege.model.Cls;
036    import edu.stanford.smi.protege.model.Instance;
037    import edu.stanford.smi.protege.model.KnowledgeBase;
038    import edu.uchsc.ccp.knowtator.Span;
039    
040    public class DefaultTextSource implements TextSource {
041    
042            public static final String CLS_NAME = "knowtator text source";
043    
044            protected String text;
045    
046            protected String name;
047    
048            protected String protegeClsName;
049    
050            /** Creates a new instance of TextSource */
051            public DefaultTextSource() {
052            }
053    
054            public DefaultTextSource(String name, String text) {
055                    this.text = text;
056                    this.name = name;
057                    this.protegeClsName = CLS_NAME;
058            }
059    
060            public DefaultTextSource(String name, String text, String protegeClsName) {
061                    this.text = text;
062                    this.name = name;
063                    this.protegeClsName = protegeClsName;
064            }
065    
066            /**
067             * It might be prudent for extensions of this class to override this method
068             * such that the member variable text is not used - esp. if the texts are
069             * large and there are many of them.
070             * 
071             */
072            public String getText() throws TextSourceAccessException {
073                    return text;
074            }
075    
076            public String getName() {
077                    return name;
078            }
079    
080            public String getProtegeClsName() {
081                    return this.protegeClsName;
082            }
083    
084            public Instance createTextSourceInstance(KnowledgeBase knowledgeBase) {
085                    Cls textSourceCls = knowledgeBase.getCls(getProtegeClsName());
086    
087                    Instance textSourceInstance = knowledgeBase.createInstance(getName(), textSourceCls, true);
088                    return textSourceInstance;
089            }
090    
091            public int hashCode() {
092                    return (text + "|" + name).hashCode();
093            }
094    
095            public boolean equals(Object object) {
096                    if (object instanceof DefaultTextSource) {
097                            DefaultTextSource ts = (DefaultTextSource) object;
098                            try {
099                                    if (name.equals(ts.getName()) && text.equals(ts.getText()))
100                                            return true;
101                            } catch (Exception ex) {
102                                    return false;
103                            }
104                    }
105    
106                    return false;
107            }
108    
109            public String toString() {
110                    return name;
111            }
112    
113            public String getText(List<Span> annotationSpans) throws TextSourceAccessException {
114                    return getText(annotationSpans, getText());
115            }
116    
117            public static String getText(List<Span> annotationSpans, String text) throws TextSourceAccessException {
118                    StringBuffer spanText = new StringBuffer();
119    
120                    List<Span> spans = new ArrayList<Span>(annotationSpans);
121                    Collections.sort(spans);
122    
123                    if (spans.size() > 0) {
124                            spanText.append(text.substring(Math.max(0, spans.get(0).getStart()), Math.min(text.length(), spans.get(0)
125                                            .getEnd())));
126                    }
127                    if (spans.size() == 1)
128                            return spanText.toString();
129    
130                    for (int i = 1; i < spans.size(); i++) {
131                            spanText.append(" ... ");
132                            spanText.append(text.substring(Math.max(0, spans.get(i).getStart()), Math.min(text.length(), spans.get(i)
133                                            .getEnd())));
134                    }
135                    return spanText.toString();
136            }
137    
138    }