intermediate cjeckin - nfs woes!
[vamsas.git] / src / org / vamsas / objects / utils / AppDataReference.java
1 /**
2  * 
3  */
4 package org.vamsas.objects.utils;
5 import java.util.Vector;
6
7 import org.vamsas.client.ClientHandle;
8 import org.vamsas.client.UserHandle;
9 import org.vamsas.client.simpleclient.VamsasArchive;
10 import org.vamsas.client.simpleclient.VamsasArchiveReader;
11 import org.vamsas.objects.core.*;
12 /**
13  * Form, accessors and validation for ApplicationData references in
14  * vamsas document.
15  * TODO: LATER:extend XML Schema to properly validate against the same forms required by this class
16  * TODO: VAMSAS: URNS for appDatas are supposed to be unique, aren't they ?
17  */
18 public class AppDataReference {
19   /**
20    * search interface for collecting particular types of AppDatas in a vamsas document
21    * @author jimp
22    *
23    */
24   interface IAppDSearch {
25     /**
26      * process the appData Vobject d
27      * @param d
28      * @return true if appData should be collected
29      */
30     public boolean process(AppData d);
31   }
32   /**
33    * collect all appData reference strings in a vamsas document
34    * @param doc
35    * @return vector of String objects
36    */
37   static public Vector getAppDataReferences(VamsasDocument doc) {
38     if ((doc!=null) && (doc.getApplicationDataCount()>0)) {
39       Vector apdrefs = new Vector();
40       ApplicationData[] appdatas = doc.getApplicationData();
41       for (int q=0; q<appdatas.length; q++) {
42         String refstring=appdatas[q].getDataReference();
43         if (refstring!=null) 
44           apdrefs.add(refstring);
45         User users[] = appdatas[q].getUser();
46         
47         if (users!=null)
48           for (int u=0; u<users.length; u++) {
49             refstring=users[u].getDataReference();
50             if (refstring!=null)
51               apdrefs.add(new String(refstring)); // avoid referencing.
52           }
53       }
54       if (apdrefs.size()>0)
55         return apdrefs;
56     }
57     return null;
58   }
59   /**
60    * General search through the set of AppData objects for a particular profile of Client and User handle.
61    * @param doc
62    * @param test interface implemented by the filter selecting particular AppDatas.
63    * @param cascade if true only User objects for ApplicationData objects that test.process returned true will be tested.
64    * @return set of org.vamsas.objects.core.AppData objects for which test.process returned true
65    */
66   static public Vector searchAppDatas(VamsasDocument doc, IAppDSearch test, boolean cascade) {
67     if ((doc!=null) && (doc.getApplicationDataCount()>0)) {
68       Vector apdrefs = new Vector();
69       ApplicationData[] appdatas = doc.getApplicationData();
70       for (int q=0; q<appdatas.length; q++) {
71         boolean t;
72         if (t=test.process(appdatas[q])) 
73           apdrefs.add(appdatas[q]);
74         if (t || cascade) { 
75           User users[] = appdatas[q].getUser();
76           if (users!=null)
77             for (int u=0; u<users.length; u++) 
78               if (test.process(users[u]))
79                 apdrefs.add(users[u]);
80         }
81       }
82       if (apdrefs.size()>0)
83         return apdrefs;
84     }
85     return null;
86   }
87   static public boolean equals(User p, UserHandle u) {
88     if (p.getFullname().equals(u.getFullName())
89         && p.getOrganization().equals(u.getOrganization()))
90       return true;
91     return false;
92   }
93   /**
94    * returns true if Name matches in c and p, and Urn's match (or c.getUrn()==null) and Version's match (or c.getVersion()==null)
95    * @param p
96    * @param c
97    * @return match of p on template c.
98    */
99   static public boolean equals(ApplicationData p, ClientHandle c) {
100     if (
101         ((c.getClientUrn()==null) || p.getUrn().equals(c.getClientUrn()))
102         &&
103         (p.getName().equals(c.getClientName()))
104         &&
105         ((c.getVersion()==null) || (p.getVersion().equals(c.getVersion())))
106         )
107       return true;
108     return false;
109   }
110   /**
111    * Searches document appData structure for particular combinations of client and user data
112    * @param doc the data 
113    * @param user template user data to match against
114    * @see AppDataReference.equals(org.vamsas.objects.core.User, org.vamsas.client.UserHandle)
115    * @param app
116    * @see AppDataReference.equals(org.vamsas.objects.core.ApplicationData, org.vamsas.client.ClientHandle)
117    * @return set of matching client app datas for this client and user combination
118    */
119   static public Vector getUserandApplicationsData(VamsasDocument doc, UserHandle user, ClientHandle app) {
120     if (doc==null) {
121       return null;
122     }
123     final UserHandle u = user;
124     final ClientHandle c = app;
125     
126     IAppDSearch match = new IAppDSearch() {
127       public boolean process(AppData p) {
128         if (p instanceof User) {
129           if (AppDataReference.equals((User) p, u))
130             return true;
131         } else 
132         if (p instanceof ApplicationData) {
133           if (AppDataReference.equals((ApplicationData) p, c))
134             return true;
135         }
136         return false;
137       }
138     };
139     
140     return searchAppDatas(doc, match, true); // only return AppDatas belonging to appdata app.
141   }
142   /**
143    * safely creates a new appData reference
144    * @param dest destination document Vobject
145    * @param entry base application reference to make unique 
146    */
147   public static String uniqueAppDataReference(VamsasDocument dest,String base) {
148     String urn = new String(base);    
149     for (int i=0, j=dest.getApplicationDataCount(); i<j; i++) {
150       ApplicationData o = dest.getApplicationData()[i];
151       // ensure new urn is really unique
152       int v = 1;
153       while (o.getUrn().equals(urn)) {
154         urn = base+"/"+v++;      
155       } 
156     }
157     return urn;
158   }
159 }