2 * Jalview - A Sequence Alignment Editor and Viewer
\r
3 * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
\r
5 * This program is free software; you can redistribute it and/or
\r
6 * modify it under the terms of the GNU General Public License
\r
7 * as published by the Free Software Foundation; either version 2
\r
8 * of the License, or (at your option) any later version.
\r
10 * This program is distributed in the hope that it will be useful,
\r
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
13 * GNU General Public License for more details.
\r
15 * You should have received a copy of the GNU General Public License
\r
16 * along with this program; if not, write to the Free Software
\r
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
\r
22 import org.vamsas.client.Vobject;
\r
23 import org.vamsas.client.VorbaId;
\r
24 import org.vamsas.objects.core.*;
\r
25 import org.vamsas.objects.utils.DocumentStuff;
\r
26 import org.vamsas.test.simpleclient.ClientDoc;
\r
28 import jalview.bin.Cache;
\r
29 import jalview.datamodel.SequenceI;
\r
30 import jalview.gui.*;
\r
32 import java.util.HashMap;
\r
33 import java.util.HashSet;
\r
34 import java.util.Hashtable;
\r
35 import java.util.IdentityHashMap;
\r
36 import java.util.jar.*;
\r
37 import org.exolab.castor.xml.*;
\r
38 import org.exolab.castor.mapping.Mapping;
\r
43 org.exolab.castor.util.LocalConfiguration.getInstance().getProperties().setProperty(
\r
44 "org.exolab.castor.serializer", "org.apache.xml.serialize.XMLSerilazizer");
\r
49 public class VamsasDatastore
\r
51 Entry provEntry=null;
\r
53 org.exolab.castor.types.Date date
\r
54 = new org.exolab.castor.types.Date(new java.util.Date());
\r
57 IdentityHashMap jv2vobj;
\r
58 public VamsasDatastore(ClientDoc cdoc, Hashtable vobj2jv, IdentityHashMap jv2vobj, Entry provEntry) {
\r
61 this.vobj2jv = vobj2jv;
\r
62 this.jv2vobj = jv2vobj;
\r
63 this.provEntry = provEntry;
\r
66 /* public void storeJalview(String file, AlignFrame af)
\r
70 // 1. Load the mapping information from the file
\r
71 Mapping map = new Mapping(getClass().getClassLoader());
\r
72 java.net.URL url = getClass().getResource("/jalview_mapping.xml");
\r
73 map.loadMapping(url);
\r
75 // 2. Unmarshal the data
\r
76 // Unmarshaller unmar = new Unmarshaller();
\r
77 //unmar.setIgnoreExtraElements(true);
\r
78 //unmar.setMapping(map);
\r
79 // uni = (UniprotFile) unmar.unmarshal(new FileReader(file));
\r
81 // 3. marshal the data with the total price back and print the XML in the console
\r
82 Marshaller marshaller = new Marshaller( new FileWriter(file) );
\r
84 marshaller.setMapping(map);
\r
85 marshaller.marshal(af);
\r
89 e.printStackTrace();
\r
96 protected Vobject getjv2vObj(Object jvobj) {
\r
97 if (jv2vobj.containsKey(jvobj))
\r
98 return cdoc.getObject(((VorbaId)jv2vobj.get(jvobj)));
\r
102 protected Object getvObj2jv(org.vamsas.client.Vobject vobj) {
\r
103 VorbaId id = vobj.getVorbaId();
\r
105 id = cdoc.registerObject(vobj);
\r
106 Cache.log.debug("Registering new object and returning null for getvObj2jv");
\r
109 if (vobj2jv.containsKey(vobj.getVorbaId()))
\r
110 return vobj2jv.get(id);
\r
113 protected void bindjvvobj(Object jvobj, org.vamsas.client.Vobject vobj) {
\r
114 VorbaId id = vobj.getVorbaId();
\r
116 id = cdoc.registerObject(vobj);
\r
118 if (vobj2jv.containsKey(vobj.getVorbaId())||jv2vobj.containsKey(jvobj)) {
\r
119 Cache.log.error("Duplicate object binding!");
\r
121 vobj2jv.put(vobj.getVorbaId(),jvobj);// JBPNote - better implementing a hybrid invertible hash.
\r
122 jv2vobj.put(jvobj,vobj.getVorbaId());
\r
126 public void storeVAMSAS(AlignViewport av)
\r
128 long time = System.currentTimeMillis();
\r
133 jalview.datamodel.AlignmentI jal = av.getAlignment();
\r
136 ///////////////////////////////////////////
\r
137 // SAVE THE DATASET
\r
138 VAMSAS root = cdoc.getVamsasRoots()[0];
\r
139 if (jal.getDataset()==null) {
\r
140 Cache.log.warn("Creating new dataset for an alignment.");
\r
141 jal.setDataset(null); //
\r
144 DataSet dataset = (DataSet) getjv2vObj(jal.getDataset());
\r
145 if (dataset==null) {
\r
146 dataset = new DataSet();
\r
147 root.addDataSet(dataset);
\r
148 bindjvvobj(jal.getDataset(),dataset);
\r
151 // should really check root corresponds to dataset.
\r
156 for (int i = 0; i < jal.getHeight(); i++)
\r
158 SequenceI sq = jal.getDataset().getSequenceAt(i);
\r
159 sequence = (Sequence) getjv2vObj(sq);
\r
160 if (sequence==null) {
\r
161 sequence=new Sequence();
\r
162 bindjvvobj(sq, sequence);
\r
163 sq.setVamsasId(sequence.getVorbaId().getId());
\r
164 sequence.setSequence(sq.getSequence());
\r
165 sequence.setName(jal.getDataset().getSequenceAt(i).getName());
\r
166 sequence.setStart(jal.getDataset().getSequenceAt(i).getStart());
\r
167 sequence.setEnd(jal.getDataset().getSequenceAt(i).getEnd());
\r
168 dataset.addSequence(sequence);
\r
170 // verify principal attributes.
\r
174 if(jal.getDataset().getSequenceAt(i).getSequenceFeatures()!=null)
\r
176 int sfSize = jal.getDataset().getSequenceAt(i).getSequenceFeatures().length;
\r
178 for (int sf = 0; sf < sfSize; sf++)
\r
180 jalview.datamodel.SequenceFeature feature =
\r
181 (jalview.datamodel.SequenceFeature)
\r
182 jal.getDataset().getSequenceAt(i).getSequenceFeatures()[sf];
\r
184 DataSetAnnotations dsa = (DataSetAnnotations) getjv2vObj(feature);
\r
186 dsa = new DataSetAnnotations();
\r
187 bindjvvobj(feature, dsa);
\r
188 dsa.setType(feature.getType());
\r
189 dsa.setBegin(feature.getBegin());
\r
190 dsa.setEnd(feature.getEnd());
\r
191 dsa.setDescription(feature.getDescription());
\r
192 dsa.setStatus(feature.getStatus());
\r
193 if (dsa.getProvenance()==null) {
\r
194 dsa.setProvenance(new Provenance());
\r
197 dsa.getProvenance().addEntry(provEntry); // JBPNote - need to update jalview datamodel.
\r
198 dsa.setSeqRef(sequence);
\r
199 dataset.addDataSetAnnotations(dsa);
\r
206 if(jal.getDataset().getSequenceAt(i).getDBRef()!=null)
\r
208 java.util.Vector entries = jal.getDataset().getSequenceAt(i).getDBRef();
\r
209 jalview.datamodel.DBRefEntry dbentry;
\r
210 for(int db=0; db<entries.size(); db++)
\r
212 dbentry = (jalview.datamodel.DBRefEntry)entries.elementAt(db);
\r
213 dbref = (DbRef) getjv2vObj(dbentry);
\r
215 dbref = new DbRef();
\r
216 bindjvvobj(dbentry, dbref);
\r
217 dbref.setAccessionId( dbentry.getAccessionId() );
\r
218 dbref.setSource( dbentry.getSource() );
\r
219 dbref.setVersion( dbentry.getVersion() );
\r
220 dbref.setId("db"+(time++));
\r
221 sequence.addDbRef(dbref);
\r
229 /* not needed any more.
\r
230 if(jal.getDataset().getSequenceAt(i).getVamsasId()==null)
\r
231 sequence.setId("ds" + (time++));
\r
233 sequence.setId(jal.getDataset().getSequenceAt(i).getVamsasId());
\r
236 // dataset.setProvenance(getVamsasProvenance(jal.getDataset().getProvenance()));
\r
237 //////////////////////////////////////////////
\r
240 //////////////////////////////////////////////
\r
241 //Save the Alignments
\r
243 Alignment alignment = (Alignment) getjv2vObj(jal);
\r
244 if (alignment==null) {
\r
245 alignment=new Alignment();
\r
246 bindjvvobj(jal, alignment);
\r
247 if (alignment.getProvenance()==null)
\r
248 alignment.setProvenance(new Provenance());
\r
249 alignment.getProvenance().addEntry(provEntry);
\r
250 dataset.addAlignment(alignment);
\r
251 alignment.setGapChar(av.getGapCharacter() + "");
\r
252 AlignmentSequence alseq = null;
\r
253 for (int i = 0; i < jal.getHeight(); i++)
\r
255 alseq = new AlignmentSequence();
\r
257 jal.getSequenceAt(i).getSequence()
\r
259 alseq.setName(jal.getSequenceAt(i).getName());
\r
260 alseq.setStart(jal.getSequenceAt(i).getStart());
\r
261 alseq.setEnd(jal.getSequenceAt(i).getEnd());
\r
262 // how is this going to work ? find alseq in DataSet by..
\r
264 // order is conserved because we just created a new dataset.
\r
265 alseq.setRefid(dataset.getSequence(i));
\r
267 alignment.addAlignmentSequence(alseq);
\r
270 // todo: verify and update mutable alignment props.
\r
272 //////////////////////////////////////////////
\r
276 //////////////////////////////////////////////
\r
278 if (jal.getAlignmentAnnotation() != null)
\r
280 jalview.datamodel.AlignmentAnnotation[] aa = jal.getAlignmentAnnotation();
\r
282 for (int i = 0; i < aa.length; i++)
\r
284 if (aa[i].label.equals("Quality") ||
\r
285 aa[i].label.equals("Conservation") ||
\r
286 aa[i].label.equals("Consensus"))
\r
290 AlignmentAnnotations an = (AlignmentAnnotations) getjv2vObj(aa[i]);
\r
292 an = new AlignmentAnnotations();
\r
293 an.setDescription(aa[i].description);
\r
294 // JBPNote - have to deal with the many lines for one graph thing
\r
296 an.setGraph(true); //aa[i].graph);
\r
297 // JBPNote - store graphGroup in the Jalview specific bits.
\r
298 an.setLabel(aa[i].label);
\r
299 an.setProvenance(dummyProvenance());
\r
301 AnnotationElement ae;
\r
303 for (int a = 0; a < aa[i].annotations.length; a++)
\r
305 if ((aa[i] == null) || (aa[i].annotations[a] == null))
\r
310 ae = new AnnotationElement();
\r
311 ae.setDescription(aa[i].annotations[a].description);
\r
312 ae.setDisplayCharacter(aa[i].annotations[a].displayCharacter);
\r
313 ae.setValue(aa[i].annotations[a].value);
\r
315 ae.setSecondaryStructure(aa[i].annotations[a].secondaryStructure +
\r
317 an.addAnnotationElement(ae);
\r
320 alignment.addAlignmentAnnotations(an);
\r
322 // verify annotation - update (perhaps)
\r
326 ///////////////////////////////////////////////////////
\r
328 ////////////////////////////////////////////////
\r
330 ///////////////////////////////////
\r
331 // FIND ANY ASSOCIATED TREES
\r
332 if (Desktop.desktop != null)
\r
334 javax.swing.JInternalFrame[] frames = Desktop.desktop.getAllFrames();
\r
336 for (int t = 0; t < frames.length; t++)
\r
338 if (frames[t] instanceof TreePanel)
\r
340 TreePanel tp = (TreePanel) frames[t];
\r
342 if (tp.getAlignment() == jal)
\r
344 // JBPNote - can recover alignment and Vamsas Alignment for an associated tree using the getjv2vObj()
\r
346 Tree tree = (Tree) getjv2vObj(tp);
\r
349 bindjvvobj(tp,tree);
\r
350 tree.setTitle(tp.getTitle());
\r
351 Newick newick = new Newick();
\r
352 newick.setContent( tp.getTree().toString() );
\r
353 newick.setTitle( tp.getTitle() );
\r
354 tree.addNewick( newick );
\r
355 tree.setProvenance(dummyProvenance());
\r
356 alignment.addTree(tree);
\r
358 // verify any changes.
\r
366 catch (Exception ex)
\r
368 ex.printStackTrace();
\r
375 public void updateJalview()
\r
377 VAMSAS root = cdoc.getVamsasRoots()[0];
\r
380 boolean newds=false;
\r
381 for (int _ds=0,_nds=root.getDataSetCount(); _ds<_nds; _ds++) {
\r
382 /////////////////////////////////////
\r
384 DataSet dataset = vamsas.getDataSet(_ds);
\r
385 int i, iSize = dataset.getSequenceCount();
\r
386 jalview.datamodel.Alignment jdataset = (jalview.datamodel.Alignment) vobj2jv(dataset);
\r
387 if (jdataset!=null) {
\r
391 // construct new dataset
\r
392 jalview.datamodel.Sequence [] seqs = new jalview.datamodel.Sequence[iSize];
\r
394 for (i = 0; i < iSize ; i++)
\r
396 seqs[i] = new jalview.datamodel.Sequence(
\r
397 dataset.getSequence(i).getName(),
\r
398 dataset.getSequence(i).getSequence(),
\r
399 dataset.getSequence(i).getStart(),
\r
400 dataset.getSequence(i).getEnd() );
\r
401 bindjvvobj(seqs[i], dataset.getSequence(i));
\r
402 seqs[i].setVamsasId(dataset.getSequence(i).getVorbaId().getId());
\r
404 if (dataset.getDataSetAnnotations() != null)
\r
406 for (int dsa = 0; dsa < dataset.getDataSetAnnotationsCount(); dsa++)
\r
408 // could be optimised
\r
409 if (dataset.getDataSetAnnotations(dsa).getSeqRef() ==
\r
410 dataset.getSequence(i))
\r
412 jalview.datamodel.SequenceFeature sf;
\r
413 seqs[i].addSequenceFeature(sf=new jalview.datamodel.
\r
415 dataset.getDataSetAnnotations(dsa).getType(),
\r
416 dataset.getDataSetAnnotations(dsa).getDescription(),
\r
417 dataset.getDataSetAnnotations(dsa).getStatus(),
\r
418 dataset.getDataSetAnnotations(dsa).getBegin(),
\r
419 dataset.getDataSetAnnotations(dsa).getEnd(),
\r
421 bindjvvobj(sf, dataset.getDataSetAnnotations(dsa));
\r
425 dbref = dataset.getSequence(i).getDbRef();
\r
429 for(int db=0; db<dbref.length; db++)
\r
431 jalview.datamodel.DBRefEntry dbr;
\r
432 seqs[i].addDBRef(dbr= new jalview.datamodel.DBRefEntry
\r
434 dbref[db].getSource().toString(),
\r
435 dbref[db].getVersion().toString(),
\r
436 dbref[db].getAccessionId().toString()));
\r
437 bindjvvobj(dbr, dvref[db]);
\r
441 jdataset = jalview.datamodel.Alignment(seqs); // complete construction
\r
442 bindjvvobj(jdataset, dataset);
\r
444 ////////////////////////////////////////////////
\r
446 for (int _al=0,_nal=dataset.getAlignmentCount(); _al<_nal; _al++) {
\r
447 //////////////////////////////////////
\r
449 Alignment alignment = dataset.getAlignment(_al);
\r
450 iSize = alignment.getAlignmentSequenceCount();
\r
451 jalview.datamodel.Alignment jal = getvObj2jv(alignment);
\r
455 seqs = new jalview.datamodel.Sequence[iSize];
\r
457 int j, jSize = jdataset.getHeight();
\r
458 for (i = 0; i < iSize; i++)
\r
460 seqs[i] = new jalview.datamodel.Sequence(
\r
461 alignment.getAlignmentSequence(i).getName(),
\r
462 alignment.getAlignmentSequence(i).getSequence(),
\r
463 alignment.getAlignmentSequence(i).getStart(),
\r
464 alignment.getAlignmentSequence(i).getEnd());
\r
465 bindjvvobj(seqs[i], alignment.getAlignmentSequence(i));
\r
466 id = ( (Sequence) alignment.getAlignmentSequence(i).getRefid()).getVorbaId().getId();
\r
468 for(j=0; j<jSize; j++)
\r
470 if(jdataset.getSequenceAt(j).getVamsasId().equals(id))
\r
472 seqs[i].setDatasetSequence( jdataset.getSequenceAt(j) );
\r
477 jalview.datamodel.Alignment jal = new jalview.datamodel.Alignment(seqs);
\r
478 bindjvvobj(jal, alignment);
\r
479 jal.setDataset(jdataset);
\r
480 /*jal.getDataset().setProvenance(
\r
481 getJalviewProvenance(dataset.getProvenance()));
\r
483 getJalviewProvenance(alignment.getProvenance()));
\r
485 //////////////////////////////////////////////
\r
488 ////////////////////////////////////////////
\r
489 ////LOAD ANNOTATIONS
\r
490 ////////////////////
\r
491 if (alignment.getAlignmentAnnotationsCount()>0)
\r
493 AlignmentAnnotations[] an = alignment.getAlignmentAnnotations();
\r
495 for (j = 0; j < an.length; j++)
\r
497 boolean topaliBreakpoint = false;
\r
499 AnnotationElement[] ae = an[j].getAnnotationElement();
\r
500 jalview.datamodel.Annotation[] anot = getvObj2jv(ae);
\r
502 // update or stay the same.
\r
505 anot=new jalview.datamodel.Annotation[jal.
\r
507 bindjvvobj(anot, ae);
\r
509 for (int aa = 0; aa < ae.length; aa++)
\r
511 String dc = ae[aa].getDisplayCharacter()==null ? "dc" : ae[aa].getDisplayCharacter();
\r
512 String desc = ae[aa].getDescription()==null ? "desc" : ae[aa].getDescription();
\r
513 String ss = ae[aa].getSecondaryStructure()==null ? "ss" : ae[aa].getSecondaryStructure();
\r
514 float value = ae[aa].getValue();
\r
515 if(an[j].getGraph())
\r
520 anot[ae[aa].getPosition()-1] = new jalview.datamodel.
\r
521 Annotation(dc,desc,ss.charAt(0),value);
\r
523 if(desc.equals("TOPALi Partition Breakpoint"))
\r
524 topaliBreakpoint = true;
\r
527 }catch(Exception ex)
\r
529 ex.printStackTrace();
\r
530 System.out.println("problem parsing annotations\n"+ex);}
\r
532 jalview.datamodel.AlignmentAnnotation jaa = null;
\r
533 if (an[j].getGraph())
\r
535 jaa = new jalview.datamodel.AlignmentAnnotation(an[j].getLabel(),
\r
536 an[j].getDescription(), anot, 0, 0, 1);
\r
540 String label = an[j].getLabel();
\r
541 if(topaliBreakpoint)
\r
542 label = "TOPALi Partition Breakpoint";
\r
543 jaa = new jalview.datamodel.AlignmentAnnotation(label,
\r
544 an[j].getDescription(), anot);
\r
547 jal.addAnnotation(jaa);
\r
550 /////////////////////////////////
\r
552 AlignFrame alignFrame = new AlignFrame(jal);
\r
553 jalview.gui.Desktop.addInternalFrame(alignFrame, "VAMSAS LOAD",
\r
554 AlignFrame.NEW_WINDOW_WIDTH,
\r
555 AlignFrame.NEW_WINDOW_HEIGHT);
\r
558 ///////////////////////////////////////
\r
559 if (alignment.getTreeCount() > 0)
\r
561 for (int t = 0; t < alignment.getTreeCount(); t++)
\r
563 Tree tree = alignment.getTree(t);
\r
565 alignFrame.ShowNewickTree(
\r
566 new jalview.io.NewickFile(tree.getNewick(0).getContent()),
\r
567 tree.getNewick(0).getTitle(),
\r
569 t * 20 + 50, t * 20 + 50);
\r
577 catch (Exception ex)
\r
579 ex.printStackTrace();
\r
587 Provenance getVamsasProvenance(jalview.datamodel.Provenance jprov)
\r
589 jalview.datamodel.ProvenanceEntry [] entries = null;
\r
592 Provenance prov = new Provenance();
\r
593 org.exolab.castor.types.Date date = new org.exolab.castor.types.Date(
\r
594 new java.util.Date());
\r
599 entries = jprov.getEntries();
\r
600 for (int i = 0; i < entries.length; i++)
\r
602 provEntry = new Entry();
\r
605 date = new org.exolab.castor.types.Date(entries[i].getDate());
\r
607 catch (Exception ex)
\r
609 ex.printStackTrace();
\r
611 date = new org.exolab.castor.types.Date(entries[i].getDate());
\r
613 provEntry.setDate(date);
\r
614 provEntry.setUser(entries[i].getUser());
\r
615 provEntry.setAction(entries[i].getAction());
\r
616 prov.addEntry(provEntry);
\r
621 provEntry = new Entry();
\r
622 provEntry.setDate(date);
\r
623 provEntry.setUser(System.getProperty("user.name"));
\r
624 provEntry.setAction("Jalview");
\r
625 prov.addEntry(provEntry);
\r
631 jalview.datamodel.Provenance getJalviewProvenance(Provenance prov)
\r
634 jalview.datamodel.Provenance jprov = new jalview.datamodel.Provenance();
\r
635 for (int i = 0; i < prov.getEntryCount(); i++)
\r
638 prov.getEntry(i).getUser(),
\r
639 prov.getEntry(i).getAction(),
\r
640 prov.getEntry(i).getDate().toDate(),
\r
641 prov.getEntry(i).getId()
\r
648 Provenance dummyProvenance()
\r
650 Provenance prov = new Provenance();
\r
651 Entry entry = new Entry();
\r
652 entry.setAction("Jalview");
\r
653 entry.setDate(new org.exolab.castor.types.Date(new java.util.Date()));
\r
654 entry.setUser(System.getProperty("user.name"));
\r
655 prov.addEntry(entry);
\r