7154361549f371e4aab89ff218d54e1288ee9cc5
[vamsas.git] / src / uk / ac / vamsas / test / simpleclient / VamsasArchive.java
1 package uk.ac.vamsas.test.simpleclient;
2
3 import java.io.File;
4 import java.io.ObjectOutputStream;
5
6 import org.apache.commons.logging.Log;
7 import org.apache.commons.logging.LogFactory;
8
9 import uk.ac.vamsas.client.simpleclient.Lock;
10 import uk.ac.vamsas.client.simpleclient.SessionFile;
11 import uk.ac.vamsas.client.simpleclient.SimpleDocument;
12 import uk.ac.vamsas.client.simpleclient.VamsasArchiveReader;
13 import uk.ac.vamsas.client.simpleclient.VamsasFile;
14 import uk.ac.vamsas.objects.core.ApplicationData;
15 import uk.ac.vamsas.objects.core.User;
16 import uk.ac.vamsas.objects.core.VAMSAS;
17 import uk.ac.vamsas.objects.core.VamsasDocument;
18 import uk.ac.vamsas.test.objects.Core;
19
20 public class VamsasArchive {
21   /**
22    * test the org.vamsas.simpleclient.vamsasArchive class
23    */
24   static Log log = LogFactory.getLog(VamsasArchive.class);
25   public static ApplicationData makeDemoAppdata(uk.ac.vamsas.client.simpleclient.VamsasArchive va, String apname, String userName, String userOrg) {
26     if (va==null)
27       return null;
28     VamsasArchiveReader vread=null;
29     try {
30       vread = va.getOriginalArchiveReader();
31     }
32     catch (Exception e) {
33       log.error("Failed to get original archive reader!",e);
34       return null;
35     }
36     ApplicationData appdata = new ApplicationData();
37     appdata.setName("uk.ac.vamsas.test.simpleclient.VamsasArchive");
38     appdata.setData(new String("this is some test data.").getBytes());
39     User apuser = new User();
40     apuser.setFullname(userName);
41     apuser.setOrganization(userOrg);
42     String appdata_ref = "vamsas:"+apname+"/"+apuser.getOrganization()+"/"+apuser.getFullname();
43     SimpleDocument sdoc = new SimpleDocument("test.simpleclient.VamsasArchive");
44     if (vread!=null) {
45       VamsasDocument orignalnew;
46       try {
47         orignalnew = sdoc.getVamsasDocument(vread);
48         log.info("*** Dump follows ***");
49         
50         ArchiveReports.reportDocument(orignalnew, vread, false, System.out);
51         log.info("*** Dump precedes ***");
52       } catch (Exception e) {
53         log.info("makeDemoAppdata: Problems accessing original document");
54       }
55       
56       log.info("Reading (and avoiding references to) original data");
57       if (vread.getAppdataStream(appdata_ref)!=null) {
58         // transfer over
59         try {
60           va.transferAppDataEntry(appdata_ref);
61         } catch (Exception e) {
62           log.warn("Exception when transferring appdata reference : "+appdata_ref, e);
63         }
64         int i=0;
65         while (vread.getAppdataStream(appdata_ref+"/"+Integer.toString(++i))!=null) {
66           try {
67             // copy over another duplicate.
68             va.transferAppDataEntry(appdata_ref+"/"+Integer.toString(i));
69           } catch (Exception e) {
70             log.warn("Exception when transferring appdata reference : "+appdata_ref, e);
71           }
72         }
73         // this one must be unique!
74         appdata_ref+="/"+Integer.toString(i);
75       }
76     }
77     
78     log.info("Adding new data stuff.");
79     log.info("Writing an apdata reference using AppDataStream interface.");
80     apuser.setDataReference(appdata_ref);
81     appdata.addUser(apuser);
82     appdata.setVersion("noggin");
83     //TODO: write instance appdata  appdata.setUrn("program:/the.nog/");
84     try {
85       ObjectOutputStream ost = new ObjectOutputStream(va.getAppDataStream(appdata_ref));
86       ost.writeObject(appdata);
87       ost.close();
88     } catch (Exception e) {
89       log.warn("Couldn't write appdata reference "+appdata_ref);
90     }
91     return appdata;
92   }
93   public static void main(String args[]) {
94     
95     try {
96       File av;
97       if (args.length>0)
98         av = new File(args[0]);
99       else
100         av = new File("test/vamsas.zip");
101       log.info("Opening archive "+av);
102       uk.ac.vamsas.client.simpleclient.VamsasArchive varchive = new uk.ac.vamsas.client.simpleclient.VamsasArchive(av, true);
103       
104       VAMSAS[] roots = (VAMSAS[]) varchive.getOriginalRoots();
105       
106       if (roots!=null) {
107         log.info("Report on Original roots in archive:");
108         ArchiveReports.rootReport(roots, true, System.out);
109       }
110       log.info("Getting current vamsas document.");
111       VamsasDocument doc = varchive.getVamsasDocument();
112       ArchiveReports.reportDocument(doc, varchive.getOriginalArchiveReader(), true, System.out); // not modified document so references will still be valid
113       // do some stuff
114       log.info("Retrieving backup");
115       File backup = varchive.backupFile();
116       if (backup==null)
117         log.info(av+" is a New Archive.");
118       else 
119         log.info(av+" has been backed up as "+backup);
120       File newf=new File(av.getAbsolutePath()+"_new.zip");
121       VamsasFile sfile = new VamsasFile(newf);
122       /* if (newf.exists()) {
123         int q=1;
124         do {
125           newf=new File(av.getAbsolutePath()+"_"+q+++"_new.zip");
126         }
127         while (newf.exists()); 
128       } */
129       if (newf.exists()) {
130         log.info("Removing existing "+newf);
131         newf.delete();
132       }
133         
134       log.info("Now writing new Archive into "+newf.getAbsolutePath());
135       uk.ac.vamsas.client.simpleclient.VamsasArchive va=null;
136       { // hold lock over deletion and write of new archive.
137         //Lock wlock = sfile.getLock();
138         //newf.delete(); // clear out old file.
139         sfile.getLock();
140         va = new uk.ac.vamsas.client.simpleclient.VamsasArchive(newf, true, true, sfile);
141         // open another and...
142         ApplicationData appdata = makeDemoAppdata(va, 
143             "uk.ac.vamsas.test.simpleclient.VamsasArchive", "arnold Bugger esq", "disOrganised");
144         log.info("Preparing to write new document.");
145         doc.addApplicationData(appdata);
146         doc.addVAMSAS(Core.getDemoVamsas());
147         va.putVamsasDocument(doc); // gets stream and puts it.
148         va.closeArchive();
149         sfile.unLock();
150       }
151       log.info("Dump of new vamsas document :");
152       log.info("Testing update: ");
153       {
154         Lock lock=sfile.getLock();
155         if (lock==null)
156           while ((lock=sfile.getLock())==null) {
157             log.info("Waiting for lock.");
158             Thread.sleep(100);
159           }
160         VamsasArchiveReader vreader = new VamsasArchiveReader(sfile.getVamsasFile());// lock); // cannot do new JarFile on a locked file. // newf);
161         SimpleDocument sdoc = new SimpleDocument("testing new vamsas write");
162         ArchiveReports.reportDocument(sdoc.getVamsasDocument(vreader), vreader, true, System.out);
163         sfile.unLock();
164       }
165       // backup.delete(); // tidy up
166       
167       log.info("Now Cancelling write to original archive "+av);
168       if (varchive.cancelArchive())
169         log.info("Successfully cancelled.");
170       else
171         log.info("Didn't cancel.");
172       long t=System.currentTimeMillis()+200; while (t>System.currentTimeMillis());
173       log.info("Now testing archive update.");
174       va = new uk.ac.vamsas.client.simpleclient.VamsasArchive(newf, false, true, sfile);
175       doc = va.getVamsasDocument();
176       doc.addVAMSAS(Core.getDemoVamsas());
177       doc.addApplicationData(makeDemoAppdata(va, 
178           "uk.ac.vamsas.test.simpleclient.VamsasArchive", "another old Bugger esq", "rescinded"));
179       if (va.transferRemainingAppDatas())
180         log.info("Remain appdatas were transferred.");
181       else
182         log.warn("No appdatas were transferred. This is wrong.");
183       va.putVamsasDocument(doc);
184       va.closeArchive();
185       sfile.unLock();
186       log.info("Testing update: ");
187       {
188         Lock lock=sfile.getLock();
189         if (lock==null)
190           while ((lock=sfile.getLock())==null)
191             log.info("Waiting for lock.");
192         // VamsasArchiveReader vreader = new VamsasArchiveReader(lock);
193         VamsasArchiveReader vreader = new VamsasArchiveReader(newf);
194         
195         SimpleDocument sdoc = new SimpleDocument("testing vamsas update");
196         VamsasDocument finaldoc = sdoc.getVamsasDocument(vreader);
197         if (finaldoc!=null)
198           ArchiveReports.reportDocument(finaldoc, vreader, true, System.out);
199         else 
200           log.error("Null Document Read from "+newf);
201       }
202     } catch (Exception e) {
203       e.printStackTrace(System.err);
204     }
205   }
206 }