/*
* This file is part of the Vamsas Client version 0.2.
* Copyright 2010 by Jim Procter, Iain Milne, Pierre Marguerite,
* Andrew Waterhouse and Dominik Lindner.
*
* Earlier versions have also been incorporated into Jalview version 2.4
* since 2008, and TOPALi version 2 since 2007.
*
* The Vamsas Client is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Vamsas Client is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the Vamsas Client. If not, see .
*/
package uk.ac.vamsas.test.simpleclient.simpleapp;
import java.io.*;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.IdentityHashMap;
import java.util.Vector;
import java.util.jar.*;
import org.exolab.castor.xml.*;
import org.exolab.castor.mapping.Mapping;
import uk.ac.vamsas.client.Vobject;
import uk.ac.vamsas.client.VorbaId;
import uk.ac.vamsas.objects.core.*;
import uk.ac.vamsas.objects.utils.DocumentStuff;
import uk.ac.vamsas.test.simpleclient.ClientDoc;
/*
*
* static {
* org.exolab.castor.util.LocalConfiguration.getInstance().getProperties().setProperty(
* "org.exolab.castor.serializer", "org.apache.xml.serialize.XMLSerilazizer"); }
*
*/
public class VamsasDatastore {
org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory
.getLog(VamsasDatastore.class);
Entry provEntry = null;
org.exolab.castor.types.Date date = new org.exolab.castor.types.Date(
new java.util.Date());
ClientDoc cdoc;
Hashtable vobj2jv;
IdentityHashMap jv2vobj;
public VamsasDatastore(ClientDoc cdoc, Hashtable vobj2jv,
IdentityHashMap jv2vobj, Entry provEntry) {
this.cdoc = cdoc;
this.vobj2jv = vobj2jv;
this.jv2vobj = jv2vobj;
this.provEntry = provEntry;
}
/*
* public void storeJalview(String file, AlignFrame af) { try { // 1. Load the
* mapping information from the file Mapping map = new
* Mapping(getClass().getClassLoader()); java.net.URL url =
* getClass().getResource("/jalview_mapping.xml"); map.loadMapping(url); // 2.
* Unmarshal the data // Unmarshaller unmar = new Unmarshaller();
* //unmar.setIgnoreExtraElements(true); //unmar.setMapping(map); // uni =
* (UniprotFile) unmar.unmarshal(new FileReader(file)); // 3. marshal the data
* with the total price back and print the XML in the console Marshaller
* marshaller = new Marshaller( new FileWriter(file) );
*
* marshaller.setMapping(map); marshaller.marshal(af); } catch (Exception e) {
* e.printStackTrace(); } }
*/
/**
* @return the Vobject bound to Jalview datamodel object
*/
protected Vobject getjv2vObj(Object jvobj) {
if (jv2vobj.containsKey(jvobj))
return cdoc.getObject((VorbaId) jv2vobj.get(jvobj));
return null;
}
/**
*
* @param vobj
* @return Jalview datamodel object bound to the vamsas document object
*/
protected Object getvObj2jv(uk.ac.vamsas.client.Vobject vobj) {
VorbaId id = vobj.getVorbaId();
if (id == null) {
id = cdoc.registerObject(vobj);
log.debug("Registering new object and returning null for getvObj2jv");
return null;
}
if (vobj2jv.containsKey(vobj.getVorbaId()))
return vobj2jv.get(vobj.getVorbaId());
return null;
}
protected void bindjvvobj(Object jvobj, uk.ac.vamsas.client.Vobject vobj) {
VorbaId id = vobj.getVorbaId();
if (id == null) {
id = cdoc.registerObject(vobj);
if (id == null || vobj.getVorbaId() == null)
log.error("Failed to get id for "
+ (vobj.isRegisterable() ? "registerable" : "unregisterable")
+ " object " + vobj);
}
if (vobj2jv.containsKey(vobj.getVorbaId()) || jv2vobj.containsKey(jvobj)) {
log.error("Duplicate object binding! " + vobj + " id "
+ vobj.getVorbaId().getId() + " to " + jvobj);
} else {
vobj2jv.put(vobj.getVorbaId(), jvobj);// JBPNote - better implementing a
// hybrid invertible hash.
jv2vobj.put(jvobj, vobj.getVorbaId());
}
}
/**
* put the alignment viewed by AlignViewport into cdoc.
*
* @param av
*/
public void storeVAMSAS(Object fromAppsDatamodel) {
boolean nw = false;
VAMSAS root = null; // will be resolved based on Dataset Parent.
DataSet dataset = (DataSet) getjv2vObj(fromAppsDatamodel);
if (dataset == null) {
root = cdoc.getVamsasRoots()[0]; // default vamsas root for modifying.
dataset = new DataSet();
root.addDataSet(dataset);
bindjvvobj(fromAppsDatamodel, dataset);
dataset.setProvenance(dummyProvenance());
dataset.getProvenance().addEntry(provEntry);
nw = true;
} else {
root = (VAMSAS) dataset.getV_parent();
}
// etc...
}
private Property newProperty(String name, String type, String content) {
Property vProperty = new Property();
vProperty.setName(name);
if (type != null)
vProperty.setType(type);
vProperty.setContent(content);
return vProperty;
}
/**
* get start 0 && dseta.getPosCount() > 0)
throw new Error(
"Invalid vamsas RangeType - cannot resolve both lists of Pos and Seg from choice!");
if (dseta.getSegCount() > 0) {
se = getSegRange(dseta.getSeg(0), true);
for (int s = 1, sSize = dseta.getSegCount(); s < sSize; s++) {
int nse[] = getSegRange(dseta.getSeg(s), true);
if (se[0] > nse[0])
se[0] = nse[0];
if (se[1] < nse[1])
se[1] = nse[1];
}
}
if (dseta.getPosCount() > 0) {
// could do a polarity for pos range too. and pass back indication of
// discontinuities.
int pos = dseta.getPos(0).getI();
se = new int[] { pos, pos };
for (int p = 0, pSize = dseta.getPosCount(); p < pSize; p++) {
pos = dseta.getPos(p).getI();
if (se[0] > pos)
se[0] = pos;
if (se[1] < pos)
se[1] = pos;
}
}
return se;
}
return null;
}
/**
* map from a rangeType's internal frame to the referenced object's coordinate
* frame.
*
* @param dseta
* @return int [] { ref(pos)...} for all pos in rangeType's frame.
*/
private int[] getMapping(RangeType dseta) {
Vector posList = new Vector();
if (dseta != null) {
int[] se = null;
if (dseta.getSegCount() > 0 && dseta.getPosCount() > 0)
throw new Error(
"Invalid vamsas RangeType - cannot resolve both lists of Pos and Seg from choice!");
if (dseta.getSegCount() > 0) {
for (int s = 0, sSize = dseta.getSegCount(); s < sSize; s++) {
se = getSegRange(dseta.getSeg(s), false);
int se_end = se[1 - se[2]] + (se[2] == 0 ? 1 : -1);
for (int p = se[se[2]]; p != se_end; p += se[2] == 0 ? 1 : -1) {
posList.add(new Integer(p));
}
}
} else if (dseta.getPosCount() > 0) {
int pos = dseta.getPos(0).getI();
for (int p = 0, pSize = dseta.getPosCount(); p < pSize; p++) {
pos = dseta.getPos(p).getI();
posList.add(new Integer(pos));
}
}
}
if (posList != null && posList.size() > 0) {
int[] range = new int[posList.size()];
for (int i = 0; i < range.length; i++)
range[i] = ((Integer) posList.elementAt(i)).intValue();
posList.clear();
return range;
}
return null;
}
/**
*
* @return default initial provenance list for a VamsasDatastore created
* vamsas object.
*/
Provenance dummyProvenance() {
return dummyProvenance(null);
}
Entry dummyPEntry(String action) {
Entry entry = new Entry();
entry.setApp(this.provEntry.getApp());
if (action != null)
entry.setAction(action);
else
entry.setAction("created.");
entry.setDate(new java.util.Date());
entry.setUser(this.provEntry.getUser());
return entry;
}
Provenance dummyProvenance(String action) {
Provenance prov = new Provenance();
prov.addEntry(dummyPEntry(action));
return prov;
}
void addProvenance(Provenance p, String action) {
p.addEntry(dummyPEntry(action));
}
}