4 package org.vamsas.objects.utils;
5 import java.util.Vector;
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.*;
13 * Form, accessors and validation for ApplicationData references in
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 ?
18 public class AppDataReference {
20 * search interface for collecting particular types of AppDatas in a vamsas document
24 interface IAppDSearch {
26 * process the appData Vobject d
28 * @return true if appData should be collected
30 public boolean process(AppData d);
33 * collect all appData reference strings in a vamsas document
35 * @return vector of String objects
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();
44 apdrefs.add(refstring);
45 User users[] = appdatas[q].getUser();
48 for (int u=0; u<users.length; u++) {
49 refstring=users[u].getDataReference();
51 apdrefs.add(new String(refstring)); // avoid referencing.
60 * General search through the set of AppData objects for a particular profile of Client and User handle.
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
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++) {
72 if (t=test.process(appdatas[q]))
73 apdrefs.add(appdatas[q]);
75 User users[] = appdatas[q].getUser();
77 for (int u=0; u<users.length; u++)
78 if (test.process(users[u]))
79 apdrefs.add(users[u]);
87 static public boolean equals(User p, UserHandle u) {
88 if (p.getFullname().equals(u.getFullName())
89 && p.getOrganization().equals(u.getOrganization()))
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)
97 * @return match of p on template c.
99 static public boolean equals(ApplicationData p, ClientHandle c) {
101 ((c.getClientUrn()==null) || p.getUrn().equals(c.getClientUrn()))
103 (p.getName().equals(c.getClientName()))
105 ((c.getVersion()==null) || (p.getVersion().equals(c.getVersion())))
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)
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
119 static public Vector getUserandApplicationsData(VamsasDocument doc, UserHandle user, ClientHandle app) {
123 final UserHandle u = user;
124 final ClientHandle c = app;
126 IAppDSearch match = new IAppDSearch() {
127 public boolean process(AppData p) {
128 if (p instanceof User) {
129 if (AppDataReference.equals((User) p, u))
132 if (p instanceof ApplicationData) {
133 if (AppDataReference.equals((ApplicationData) p, c))
140 return searchAppDatas(doc, match, true); // only return AppDatas belonging to appdata app.
143 * safely creates a new appData reference
144 * @param dest destination document Vobject
145 * @param entry base application reference to make unique
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
153 while (o.getUrn().equals(urn)) {