package org.obo.annotation.view;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.obo.annotation.base.TermSet;
import org.obo.app.swing.AutocompleteSearcher;
import org.obo.app.swing.MatchType;
import org.obo.app.swing.SearchHit;
import org.obo.datamodel.OBOClass;
import org.obo.datamodel.OBOObject;
import org.obo.datamodel.Synonym;
import org.obo.util.TermUtil;
import org.oboedit.controller.SessionManager;
public class TermSearcher implements AutocompleteSearcher<OBOObject> {
private final List<SearchHit<OBOObject>> matches = new ArrayList<SearchHit<OBOObject>>();
private final TermSet terms;
private static final MatchType NAME_MATCH = new MatchType() {
@Override
public String getName() {
return "";
}
};
private static final MatchType SYNONYM_MATCH = new MatchType() {
@Override
public String getName() {
return "Synonym";
}
};
private static final Comparator<TermHit> COMPARATOR = new Comparator<TermHit>() {
@Override
public int compare(TermHit o1, TermHit o2) {
return o1.getMatchText().compareTo(o2.getMatchText());
}
};
public TermSearcher(TermSet terms) {
this.terms = terms;
}
@Override
public List<SearchHit<OBOObject>> getMatches() {
return this.matches;
}
@Override
public void setSearch(String input) {
this.matches.clear();
final List<TermHit> startsWith = new ArrayList<TermHit>();
final List<TermHit> containedIn = new ArrayList<TermHit>();
final String lowerInput = input.toLowerCase();
for (OBOObject term : this.terms.getTerms()) {
if ((term.getName() != null)) {
final int position = term.getName().toLowerCase().indexOf(lowerInput);
if (position == 0) {
startsWith.add(new TermHit(term, term.getName(), NAME_MATCH));
} else if (position > -1) {
containedIn.add(new TermHit(term, term.getName(), NAME_MATCH));
}
}
for (Synonym synonym : term.getSynonyms()) {
if (synonym.getText() != null) {
final int position = synonym.getText().toLowerCase().indexOf(lowerInput);
if (position == 0) {
startsWith.add(new TermHit(term, synonym.getText(), SYNONYM_MATCH));
} else if (position > -1) {
containedIn.add(new TermHit(term, synonym.getText(), SYNONYM_MATCH));
}
}
}
}
Collections.sort(startsWith, COMPARATOR);
Collections.sort(containedIn, COMPARATOR);
this.matches.addAll(startsWith);
this.matches.addAll(containedIn);
}
@Override
public String toString(OBOObject valueObject) {
return valueObject == null ? null : valueObject.getName();
}
@Override
public SearchHit<OBOObject> getExactHit(String text) {
Collection<OBOClass> terms = TermUtil.getTerms(SessionManager.getManager().getSession());
for (OBOClass term : terms) {
if ((term.getName() != null) && term.getName().equals(text)) {
return new TermHit(term, term.getName(), new MatchType() {
@Override
public String getName() {
return "Name";
}
});
}
}
return null;
}
@Override
public Class<OBOObject> getHitClass() {
return OBOObject.class;
}
@Override
public SearchHit<OBOObject> getAsHit(OBOObject item) {
return new TermHit(item, "", new MatchType() {
@Override
public String getName() {
return "";
}
});
}
@Override
public boolean isSame(String text, OBOObject item) {
return item != null ? text.equals(item.getName()) : false;
}
}