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.iaa.matcher;
029    
030    import java.util.Set;
031    
032    import edu.uchsc.ccp.iaa.Annotation;
033    import edu.uchsc.ccp.iaa.IAA;
034    
035    public class OverlappingSpanMatcher implements Matcher {
036    
037            public Annotation match(Annotation annotation, String compareSetName, Set<Annotation> excludeAnnotations, IAA iaa,
038                            MatchResult matchResult) {
039    
040                    Annotation spanAndClassMatch = ClassAndSpanMatcher.match(annotation, compareSetName, iaa, excludeAnnotations);
041                    if (spanAndClassMatch != null) {
042                            matchResult.setResult(MatchResult.NONTRIVIAL_MATCH);
043                            return spanAndClassMatch;
044                    }
045    
046                    Set<Annotation> classMatches = ClassMatcher.matches(annotation, compareSetName, iaa, excludeAnnotations);
047                    if (classMatches.size() > 0) {
048                            Annotation match = Annotation.getShortestAnnotation(classMatches);
049                            matchResult.setResult(MatchResult.NONTRIVIAL_MATCH);
050                            return match;
051                    }
052    
053                    Set<Annotation> overlappingAnnotations = iaa.getOverlappingAnnotations(annotation, compareSetName);
054                    if (overlappingAnnotations.size() > 0) {
055                            Annotation match = Annotation.getShortestAnnotation(overlappingAnnotations);
056                            matchResult.setResult(MatchResult.NONTRIVIAL_MATCH);
057                            return match;
058                    }
059    
060                    matchResult.setResult(MatchResult.NONTRIVIAL_NONMATCH);
061                    return null;
062            }
063    
064            public String getName() {
065                    return "Overlapping spans matcher";
066            }
067    
068            public String getDescription() {
069                    return "Annotations match if they have their spans overlap.";
070            }
071    
072            public boolean returnsTrivials() {
073                    return false;
074            }
075    
076    }