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