package jalview.io.vamsas; import jalview.datamodel.AlignmentI; import jalview.datamodel.DBRefEntry; import jalview.datamodel.SequenceI; import jalview.io.VamsasAppDatastore; import uk.ac.vamsas.objects.core.DataSet; import uk.ac.vamsas.objects.core.Sequence; /** * synchronize a vamsas dataset sequence with a jalview dataset sequence. * This class deals with all sequence features and database references associated with * the jalview sequence. * @author JimP * */ public class Datasetsequence extends DatastoreItem { String dict; private DataSet dataset; // private AlignmentI jvdset; public Datasetsequence(VamsasAppDatastore vamsasAppDatastore, SequenceI sq, String dict, DataSet dataset) { super(vamsasAppDatastore, sq, uk.ac.vamsas.objects.core.Sequence.class); this.dataset = dataset; // this.jvdset = jvdset; this.dict = dict; doSync(); } public Datasetsequence(VamsasAppDatastore vamsasAppDatastore, Sequence vdseq) { super(vamsasAppDatastore, vdseq, SequenceI.class); doJvUpdate(); } public void addFromDocument() { Sequence vseq = (Sequence) vobj; SequenceI dsseq = new jalview.datamodel.Sequence(vseq.getName(), vseq.getSequence(), (int) vseq.getStart(), (int) vseq.getEnd()); dsseq.setDescription(vseq.getDescription()); bindjvvobj(dsseq, vseq); dsseq.setVamsasId(vseq.getVorbaId().getId()); jvobj = dsseq; modified=true; } public void updateFromDoc() { Sequence sq = (Sequence) vobj; SequenceI sequence = (SequenceI) jvobj; if (!sequence.getSequenceAsString().equals(sq.getSequence())) { log.warn("Potential Client Error ! - mismatch of dataset sequence: and jalview internal dataset sequence."); } else { // verify and update principal attributes. if (sequence.getDescription() != null && (sequence.getDescription() == null || !sequence .getDescription().equals(sq.getDescription()))) { sequence.setDescription(sq.getDescription()); modified = true; } if (sequence.getSequence() == null || !sequence.getSequenceAsString().equals( sq.getSequence())) { if (sequence.getStart() != sq.getStart() || sequence.getEnd() != sq.getEnd()) { // update modified sequence. sequence.setSequence(sq.getSequence()); sequence.setStart((int)sq.getStart()); sequence.setEnd((int)sq.getEnd()); modified = true; } } if (!sequence.getName().equals(sq.getName())) { sequence.setName(sq.getName()); modified = true; } } } public void addToDocument() { SequenceI sq = (SequenceI) jvobj; Sequence sequence = new Sequence(); bindjvvobj(sq, sequence); sq.setVamsasId(sequence.getVorbaId().getId()); sequence.setSequence(sq.getSequenceAsString()); sequence.setDictionary(dict); sequence.setName(sq.getName()); sequence.setStart(sq.getStart()); sequence.setEnd(sq.getEnd()); sequence.setDescription(sq.getDescription()); dataset.addSequence(sequence); vobj = sequence; // add or update any new features/references on dataset sequence if (sq.getSequenceFeatures() != null) { int sfSize = sq.getSequenceFeatures().length; for (int sf = 0; sf < sfSize; sf++) { new jalview.io.vamsas.Sequencefeature(datastore, (jalview.datamodel.SequenceFeature) sq .getSequenceFeatures()[sf], dataset, (Sequence) vobj); } } if (sq.getDatasetSequence() == null && sq.getDBRef() != null) { // only sync database references for dataset sequences DBRefEntry[] entries = sq.getDBRef(); jalview.datamodel.DBRefEntry dbentry; for (int db = 0; db < entries.length; db++) { Rangetype dbr = new jalview.io.vamsas.Dbref(datastore, dbentry = entries[db], sq, (Sequence) vobj, dataset); } } } public void conflict() { log.warn("Conflict in dataset sequence update to document. Overwriting document"); // TODO: could try to import from document data to jalview first. and then updateToDoc(); } boolean modified = false; public void updateToDoc() { SequenceI sq = (SequenceI) jvobj; Sequence sequence = (Sequence) vobj; // verify and update principal attributes. if (sequence.getDescription() != null && (sequence.getDescription() == null || !sequence .getDescription().equals(sq.getDescription()))) { sequence.setDescription(sq.getDescription()); modified = true; } if (sequence.getSequence() == null || !sequence.getSequence().equals( sq.getSequenceAsString())) { if (sequence.getStart() != sq.getStart() || sequence.getEnd() != sq.getEnd()) { // update modified sequence. sequence.setSequence(sq.getSequenceAsString()); sequence.setStart(sq.getStart()); sequence.setEnd(sq.getEnd()); modified = true; } } if (!dict.equals(sequence.getDictionary())) { sequence.setDictionary(dict); modified = true; } if (!sequence.getName().equals(sq.getName())) { sequence.setName(sq.getName()); modified = true; } } /** * (probably could just do vobj.isModified(), but..) * @return true if document's dataset sequence was modified */ public boolean getModified() { return modified; } }