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