001 /*
002
003 $Id: ShareMap.java,v 1.11 2003/03/31 13:17:43 culdesac Exp $
004
005 */
006
007 package sharpster.daemon.sharemanagement;
008
009 import sharpster.common.*;
010 import sharpster.daemon.filemanagement.FileManager;
011
012 import net.jxta.id.*;
013 import java.util.LinkedList;
014 import net.jxta.document.*;
015 import java.io.FileInputStream;
016 import java.io.FileOutputStream;
017 import java.io.StringWriter;
018 import java.io.*;
019 import java.util.Enumeration;
020 import java.util.ListIterator;
021
022 /**
023 * Class to contain cross references between files and users.
024 */
025 public class ShareMap {
026 /**
027 * Private class used to contain the information about each share.
028 */
029 private class ShareData {
030 public ID user;
031 public ID file;
032 public PluginData pluginData;
033 public int access;
034 }
035
036 /**
037 * A list of all shares.
038 */
039 private LinkedList shareList;
040
041 /**
042 * Constructor
043 */
044 public ShareMap() {
045 shareList = new LinkedList();
046 }
047
048 /**
049 * Creates a share between a user and a file using the specified access and plugin data.
050 */
051 public boolean add(ID userID, ID fileID, int access, PluginData pluginData) {
052 ShareData data;
053
054 if(userID == null || fileID == null) return false;
055
056 for(int i=0;i<shareList.size();i++) {
057 ShareData temp = (ShareData)shareList.get(i);
058 String user1id = temp.user.toString();
059 String user2id = userID.toString();
060
061 if(user1id.equals(user2id)) {
062 user1id = temp.file.toString();
063 user2id = fileID.toString();
064
065 if(user1id.equals(user2id)) {
066 temp.access = access;
067 temp.pluginData = pluginData;
068 return false;
069 }
070 }
071 }
072
073 data = new ShareData();
074 data.user = userID;
075 data.file = fileID;
076 data.access = access;
077 data.pluginData = pluginData;
078
079 shareList.add(data);
080
081 return true;
082 }
083
084 /**
085 * Remove all shares that are using the specified file.
086 */
087 public void removeAllFiles(ID fileID) {
088 if(fileID == null) return;
089
090 ListIterator iterator = shareList.listIterator(0);
091 while(iterator.hasNext()) {
092 ShareData temp = (ShareData)iterator.next();
093 String file1 = temp.file.toString();
094 String file2 = fileID.toString();
095 if(file1.equals(file2)) iterator.remove();
096 }
097 }
098
099 public void synchronizeShares(FileManager fm) {
100 ListIterator iterator = shareList.listIterator(0);
101 while(iterator.hasNext()) {
102 ShareData temp = (ShareData)iterator.next();
103 if(fm.getFilePath(temp.file) == null) iterator.remove();
104 }
105 }
106
107 /**
108 * Remove the share that are specified by the userID and the fileID.
109 */
110 public boolean remove(ID userID, ID fileID) {
111 if(userID == null || fileID == null) return false;
112
113 for(int i=0;i<shareList.size();i++) {
114 ShareData temp = (ShareData)shareList.get(i);
115 String user1id = temp.user.toString();
116 String user2id = userID.toString();
117
118 if(user1id.equals(user2id)) {
119 user1id = temp.file.toString();
120 user2id = fileID.toString();
121
122 if(user1id.equals(user2id)) {
123 shareList.remove(temp);
124 return true;
125 }
126 }
127 }
128
129 return false;
130 }
131
132 /**
133 * Get all files that are shared to a specified user.
134 */
135 public ID[] getAllShares(ID userID) {
136 LinkedList shares = new LinkedList();
137 ID[] shareArray;
138
139 if(userID==null) return null;
140
141 for(int i=0;i<shareList.size();i++) {
142 ShareData temp = (ShareData)shareList.get(i);
143 String user1id = temp.user.toString();
144 String user2id = userID.toString();
145
146 if(user1id.equals(user2id)) {
147 shares.add(temp.file);
148 }
149 }
150
151 shareArray = new ID[shares.size()];
152 for(int i=0;i<shares.size();i++) {
153 shareArray[i] = (ID)shares.get(i);
154 }
155 return shareArray;
156 }
157
158 /**
159 * Checks if a reference between a user and a file exist (if the share exists).
160 */
161 public boolean shareExists(ID userID, ID fileID) {
162 ShareData data;
163
164 for(int i=0;i<shareList.size();i++) {
165 ShareData temp = (ShareData)shareList.get(i);
166 if(temp.user.equals(userID) && temp.file.equals(fileID)) {
167 return true;
168 }
169 }
170
171 return false;
172 }
173
174 /**
175 * Returns the access rights for a given share (specified by a user and a file).
176 */
177 public int getShareAccess(ID userID, ID fileID) {
178 ShareData data;
179
180 for(int i=0;i<shareList.size();i++) {
181 ShareData temp = (ShareData)shareList.get(i);
182 if(temp.user.equals(userID) && temp.file.equals(fileID)) {
183 return temp.access;
184 }
185 }
186
187 return 0;
188 }
189
190 /**
191 * Returns the plugin data for a given share (specified by a user and a file).
192 */
193 public PluginData getSharePluginData(ID userID, ID fileID) {
194 ShareData data;
195
196 for(int i=0;i<shareList.size();i++) {
197 ShareData temp = (ShareData)shareList.get(i);
198 if(temp.user.equals(userID) && temp.file.equals(fileID)) {
199 return temp.pluginData;
200 }
201 }
202
203 return null;
204 }
205
206 /**
207 * Saves the share information to the given file.
208 */
209 public boolean saveToFile(String filepath) {
210 try {
211 StructuredDocument document = (StructuredTextDocument)
212 StructuredDocumentFactory.newStructuredDocument(new MimeMediaType("text/xml"),
213 "shares");
214
215 Element element, shareElement;
216
217 //System.out.println("Saving share list "+shareList.size());
218
219 for(int i=0;i<shareList.size();i++) {
220 ShareData data = (ShareData)shareList.get(i);
221
222 shareElement = document.createElement("share");
223 document.appendChild(shareElement);
224
225 element = document.createElement("user-id", data.user.toString());
226 shareElement.appendChild(element);
227
228 element = document.createElement("file-id", data.file.toString());
229 shareElement.appendChild(element);
230
231 element = document.createElement("access", String.valueOf(data.access));
232 shareElement.appendChild(element);
233
234 ByteArrayOutputStream stream = new ByteArrayOutputStream();
235 ObjectOutputStream output = new ObjectOutputStream(stream);
236 output.writeObject(data.pluginData);
237 output.flush();
238 byte[] str1 = stream.toByteArray();
239 String str2 = Base64.encode(str1);
240 output.close();
241 stream.close();
242
243 element = document.createElement("plugin-data", str2);
244 shareElement.appendChild(element);
245 }
246
247 FileOutputStream output = new FileOutputStream(filepath);
248 StructuredTextDocument doc = (StructuredTextDocument)document;
249 doc.sendToStream(output);
250 output.close();
251 }
252 catch(Exception e) {
253 //e.printStackTrace();
254 return false;
255 }
256
257 return true;
258 }
259
260 /**
261 * Saves the share information to the given file.
262 */
263 public boolean loadFromFile(String filepath) {
264 try {
265 FileInputStream input = new FileInputStream(filepath);
266 StructuredDocument document = (StructuredTextDocument)
267 StructuredDocumentFactory.newStructuredDocument(new MimeMediaType("text/xml"), input);
268
269 Enumeration shares = document.getChildren();
270
271 ID userID=null, fileID=null;
272 int access=0;
273 PluginData pluginData=null;
274
275 while(shares.hasMoreElements()) {
276 Element share = (Element)shares.nextElement();
277 Enumeration parameters = share.getChildren();
278 while(parameters.hasMoreElements()) {
279 Element parameter = (Element)parameters.nextElement();
280
281 String key = (String)parameter.getKey();
282 if(key.equals("user-id")) {
283 userID = IDFactory.fromURL(IDFactory.jxtaURL((String)parameter.getValue()));
284 }
285 else if(key.equals("file-id")) {
286 fileID = IDFactory.fromURL(IDFactory.jxtaURL((String)parameter.getValue()));
287 }
288 else if(key.equals("access")) {
289 access = Integer.parseInt((String)parameter.getValue());
290 }
291 else if(key.equals("plugin-data")) {
292 String str1 = (String)parameter.getValue();
293 byte[] str2 = Base64.decode(str1);
294 ByteArrayInputStream stream = new ByteArrayInputStream(str2);
295 ObjectInputStream in = new ObjectInputStream(stream);
296 pluginData = (PluginData)in.readObject();
297 input.close();
298 stream.close();
299 }
300 }
301
302 add(userID,fileID,access,pluginData);
303 }
304 input.close();
305 }
306 catch(Exception e) {
307 //e.printStackTrace();
308 return false;
309 }
310 return true;
311 }
312 }