+++ /dev/null
-package org.vamsas.test.simpleclient;
-
-import java.io.File;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.PrintWriter;
-import java.text.DateFormat;
-import java.util.Date;
-import java.util.Hashtable;
-import java.util.Vector;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.vamsas.client.simpleclient.VamsasArchive;
-import org.vamsas.client.simpleclient.VamsasArchiveReader;
-import org.vamsas.objects.core.Alignment;
-import org.vamsas.objects.core.ApplicationData;
-import org.vamsas.objects.core.Entry;
-import org.vamsas.objects.core.Instance;
-import org.vamsas.objects.core.Provenance;
-import org.vamsas.objects.core.VAMSAS;
-import org.vamsas.objects.core.VamsasDocument;
-import org.vamsas.objects.utils.ProvenanceStuff;
-
-public class ArchiveWriter {
-
- /**
- * Test program for writing archive files.
- * form is ArchiveWriter new/modified argive command list
- */
-
- static Log log = LogFactory.getLog(ArchiveWriter.class);
-
- private static void mergeVecs(Object[] destvec, Object[] svec1, Object[] svec2) {
- int i;
- for (i=0; i<svec1.length; i++)
- destvec[i] = svec1[i];
- for (int j=0; j<svec2.length; i++, j++)
- destvec[i] = svec2[j];
- }
- // Merge appDataReferences require transfer of jar entries, perhaps with a renaming of the entry.
- // Merge appDatas require eventually unique URNS
- // TODO: merging global appdata from different documents where same app has written them causes conflict
-
- public static Hashtable hashOfAppDatas(Hashtable ht, Instance[] appdatas) {
- if (ht==null)
- ht = new Hashtable();
- for (int i=0, j=appdatas.length; i<j; i++) {
- if (!ht.containsKey(appdatas[i].getUrn())) {
- Hashtable aphash = new Hashtable();
- ht.put(appdatas[i].getUrn(), aphash);
- aphash.put(appdatas[i], appdatas[i].getDataReference());
- } else {
- // ensure urns and references are unique
-
-
- }
-
- }
- return ht;
- }
- /**
- * safely copies an appData from one archive to another.
- * @param darc destination archive
- * @param dest destination document Vobject
- * @param sarc source archive reader
- * @param entry application data to be copied from source archive
- */
- public static void addAppDataEntry(VamsasArchive darc, VamsasDocument dest, VamsasArchiveReader sarc, ApplicationData entry) {
- // TODO: fix instances
- // check uniqueness of instance's[] entry.urn amongst dest.ApplicationData[].getInstances[].urn
- // check uniqueness of entry.user[].urn amongst dest.ApplicationData[].user[].urn
- // check uniqueness of entry.user
- // entry.getAppDataChoice().getData() or getDataReference is unique
- ApplicationData newo = new ApplicationData();
- for (int i=0, j=dest.getApplicationDataCount(); i<j; i++) {
- ApplicationData o = dest.getApplicationData()[i];
- // ensure new urn is really unique
- //String urn = entry.getUrn();
- int v = 1;
- //while (o.getUrn().equals(urn)) {
- // urn = entry.getUrn()+v++;
- // }
- // uniqueness of urn
- // check each user ApplicationData
- // uniqueness (again)
- // copy over valid objects
- //
- }
- }
- /**
- * Copy new datasets and appdatas from one vamsas document to another.
- * @param darc
- * @param dest
- * @param sarc
- * @param source
- * @return true if merge was successful.
- */
- public static boolean mergeDocs(VamsasArchive darc, VamsasDocument dest, VamsasArchiveReader sarc, VamsasDocument source) {
- log.debug("mergeDocs entered.");
- // search for appDatas in cdoc
- VAMSAS[] newr = new VAMSAS[dest.getVAMSASCount()+source.getVAMSASCount()];
- mergeVecs(newr, dest.getVAMSAS(), source.getVAMSAS());
- dest.setVAMSAS(newr);
- /** TODO: LATER: should verify that all ids really are unique in newly merged document. If not then what ?
- * investigate possibility of having an id translation between appDatas and the core document -
- * the mapping is stored when an external application performs a merge, but when the owning
- * Application accesses the Vobject, the vorba_id is updated to the new one when it writes its
- * references in to its appdata again
- */
- if (source.getApplicationDataCount()>0) {
- ApplicationData[] newdat = new ApplicationData[source.getApplicationDataCount()+dest.getApplicationDataCount()];
- ApplicationData[] sappd = source.getApplicationData();
- // check refs and update/modify if necessary
- for (int i=0; i<sappd.length; i++) {
- addAppDataEntry(darc, dest, sarc, sappd[i]);
- }
-
- }
-
- return true; // success
- }
-
- private static CommandProcessor cproc;
- static {
- cproc.addCommand("new", 0, "no args");
- cproc.addCommand("add", 1, "Need another vamsas document archive filename as argument.");
- cproc.addCommand("repair", 0, "no args");
- cproc.addCommand("list", 0, "no args");
- cproc.addCommand("monitor", 0, "no args");
- }
-
- public static void main(String argv[]) {
- /**
- * TODO: switches for setting user identities for writing to vamsas document
- */
- if (argv.length<1) {
- log.fatal("Usage : <archive to create> [(commands)]");
- return;
- }
- File newarch = new File(argv[0]);
- int argpos = 0;
- try {
- // test fully fledged doc construction
- VamsasArchive varc = new VamsasArchive(newarch, true);
- VamsasDocument docroot;
- docroot = new VamsasDocument();
- docroot.setProvenance(ProvenanceStuff.newProvenance("ArchiveWriter", "user", "Created new Vamsas Document"));
- while (++argpos<argv.length) {
- File archive = new File(argv[argpos]);
- InputStream istream;
- if (archive.exists()) {
- VamsasArchiveReader vdoc = new VamsasArchiveReader(archive);
- if (vdoc.isValid()) {
- istream = vdoc.getVamsasDocumentStream();
- if (istream!=null) {
- VamsasDocument cdocroot = VamsasDocument.unmarshal(new InputStreamReader(istream));
- if (cdocroot!=null)
- mergeDocs(varc, docroot, vdoc, cdocroot);
- } else
- log.warn("Unexpectedly null document stream from existing document "+archive);
- } else {
- // updating an oldformat stream ?
- if ((istream = vdoc.getVamsasXmlStream())!=null) {
- // make a new vamsas document from the vamsas.xml entry
- VAMSAS root = VAMSAS.unmarshal(new InputStreamReader(istream)); // TODO: verify only one VAMSAS element per vamsas.xml entry.
- docroot.getProvenance().addEntry(ProvenanceStuff.newProvenanceEntry("ArchiveWriter", "user", "added vamsas.xml from "+argv[argpos-1]));
- docroot.addVAMSAS(root);
- }
- }
- } else {
- // Begin a new vamsas document
- PrintWriter docwriter = varc.getDocumentOutputStream();
- }
- }
- } catch (Exception e) {
- log.error("Whilst manipulating "+argv[0], e);
- }
- }
-}