package org.phenoscape.util;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.obo.annotation.base.OBOUtil;
import org.obo.annotation.base.OBOUtil.Differentium;
import org.obo.datamodel.Link;
import org.obo.datamodel.LinkedObject;
import org.obo.datamodel.OBOClass;
import org.obo.datamodel.OBOProperty;
import org.obo.datamodel.OBOSession;
/**
* A class for creating serializable representations of OBOClasses (terms or post-compositions) for use in copy/paste.
*/
public class TermTransferObject implements Serializable {
private final Object genus;
private final List<SerializableDifferentium> serializableDifferentia = new ArrayList<SerializableDifferentium>();
public TermTransferObject(OBOClass term) {
if ((term != null) && (OBOUtil.isPostCompTerm(term))) {
final OBOClass genusTerm = OBOUtil.getGenusTerm(term);
if (OBOUtil.isPostCompTerm(genusTerm)) {
this.genus = new TermTransferObject(genusTerm);
} else {
this.genus = genusTerm.getID();
}
for (Link link : OBOUtil.getAllDifferentia(term)) {
final SerializableDifferentium diff = new SerializableDifferentium();
diff.setRelation(link.getType().getID());
final LinkedObject parent = link.getParent();
if (parent instanceof OBOClass) {
diff.setTerm(new TermTransferObject((OBOClass)parent));
} else {
log().error("Differentium is not an OBOClass: " + parent);
}
this.serializableDifferentia.add(diff);
}
} else {
this.genus = term.getID();
}
}
public OBOClass getTerm(OBOSession session) {
if (this.serializableDifferentia.isEmpty()) {
return this.getGenus(session);
} else {
final OBOClass genusTerm = this.getGenus(session);
final List<Differentium> differentia = new ArrayList<Differentium>();
for (SerializableDifferentium diff : this.serializableDifferentia) {
differentia.add(this.convert(diff, session));
}
return OBOUtil.createPostComposition(genusTerm, differentia);
}
}
private OBOClass getGenus(OBOSession session) {
if (this.genus instanceof String) {
return (OBOClass)(session.getObject((String)this.genus));
} else {
return ((TermTransferObject)this.genus).getTerm(session);
}
}
private Differentium convert(SerializableDifferentium diff, OBOSession session) {
final Differentium differentium = new Differentium();
differentium.setRelation((OBOProperty)(session.getObject(diff.getRelation())));
differentium.setTerm(diff.getTerm().getTerm(session));
return differentium;
}
private static class SerializableDifferentium implements Serializable {
private String relation;
private TermTransferObject term;
public String getRelation() {
return this.relation;
}
public void setRelation(String relation) {
this.relation = relation;
}
public TermTransferObject getTerm() {
return this.term;
}
public void setTerm(TermTransferObject term) {
this.term = term;
}
}
private Logger log() {
return Logger.getLogger(this.getClass());
}
}