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    }