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 }