KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > lucane > applications > sharedfolder > SharedFolderService


1 /*
2  * Lucane - a collaborative platform
3  * Copyright (C) 2005 Vincent Fiack <vfiack@mail15.com>
4  *
5  * This library is free software; you can redistribute it and/or modify it under
6  * the terms of the GNU Lesser General Public License as published by the Free
7  * Software Foundation; either version 2.1 of the License, or (at your option)
8  * any later version.
9  *
10  * This library is distributed in the hope that it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12  * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
13  * details.
14  *
15  * You should have received a copy of the GNU Lesser General Public License
16  * along with this library; if not, write to the Free Software Foundation, Inc.,
17  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18  */

19 package org.lucane.applications.sharedfolder;
20
21 import org.lucane.server.Service;
22 import org.lucane.server.Server;
23 import org.lucane.server.acl.AccessController;
24 import org.lucane.server.database.DatabaseAbstractionLayer;
25 import org.lucane.server.database.util.Sequence;
26 import org.lucane.common.net.ObjectConnection;
27 import org.lucane.common.Message;
28 import org.lucane.common.Logging;
29 import org.lucane.common.concepts.GroupConcept;
30 import org.lucane.common.concepts.UserConcept;
31 import org.lucane.common.acl.AclInfo;
32 import org.lucane.common.acl.AclProducer;
33 import org.lucane.applications.sharedfolder.model.FileInfo;
34 import org.lucane.applications.sharedfolder.model.FolderInfo;
35 import org.lucane.applications.sharedfolder.model.SharedItem;
36
37 import java.io.*;
38 import java.sql.*;
39 import java.util.ArrayList JavaDoc;
40 import java.util.Iterator JavaDoc;
41 import java.util.Date JavaDoc;
42 import java.net.URLEncoder JavaDoc;
43 import javax.servlet.http.HttpServletResponse JavaDoc;
44
45 public class SharedFolderService extends Service
46 implements AclProducer
47 {
48     private static final String JavaDoc STORAGE_DIRECTORY = "SharedFolder";
49     private static final int BUFFER_SIZE = 10240;
50
51     private DatabaseAbstractionLayer layer;
52     private File storage;
53     private AccessController acl;
54     private Sequence fileSequence;
55     private Sequence folderSequence;
56
57     public void init(Server parent)
58     {
59         this.storage = new File(parent.getWorkingDirectory()+STORAGE_DIRECTORY);
60         this.layer = parent.getDBLayer();
61         this.acl = Server.getInstance().getAccessController();
62
63         this.fileSequence = new Sequence("files", "id");
64         this.folderSequence = new Sequence("folders", "id");
65         this.storage.mkdirs();
66     }
67
68     public void install()
69     {
70         try {
71             String JavaDoc dbDescription = getDirectory() + "db-sharedfolder.xml";
72             layer.getTableCreator().createFromXml(dbDescription);
73         } catch (Exception JavaDoc e) {
74             Logging.getLogger().severe("Unable to install SharedFolderService !");
75             e.printStackTrace();
76         }
77     }
78
79     public void process(ObjectConnection oc, Message message)
80     {
81         SharedFolderAction sfa = (SharedFolderAction)message.getData();
82         String JavaDoc user = message.getSender().getName();
83         try {
84             FileInfo fileInfo;
85             FolderInfo folderInfo;
86             Integer JavaDoc folderId;
87             Integer JavaDoc fileId;
88             ArrayList JavaDoc items;
89             Object JavaDoc[] params;
90
91             switch (sfa.getAction())
92             {
93                 case SharedFolderAction.UPLOAD_FILE:
94                     fileInfo = (FileInfo)sfa.getParam();
95                     doUploadFile(user, oc, fileInfo);
96                     oc.write("OK");
97                     break;
98                 case SharedFolderAction.CREATE_FOLDER:
99                     folderInfo = (FolderInfo)sfa.getParam();
100                     doCreateFolder(user, folderInfo);
101                     oc.write("OK");
102                     break;
103                 case SharedFolderAction.GET_FOLDER:
104                     folderId = (Integer JavaDoc)sfa.getParam();
105                     folderInfo = doGetFolder(user, folderId.intValue());
106                     oc.write("OK");
107                     oc.write(folderInfo);
108                     break;
109                 case SharedFolderAction.GET_FILE:
110                     fileId = (Integer JavaDoc)sfa.getParam();
111                     fileInfo = doGetFile(user, fileId.intValue());
112                     oc.write("OK");
113                     oc.write(fileInfo);
114                     break;
115                 case SharedFolderAction.LIST_FOLDERS:
116                     folderId = (Integer JavaDoc)sfa.getParam();
117                     items = doListFolders(user, folderId.intValue());
118                     oc.write("OK");
119                     oc.write(items);
120                     break;
121                 case SharedFolderAction.LIST_FILES:
122                     folderId = (Integer JavaDoc)sfa.getParam();
123                     items = doListFiles(user, folderId.intValue());
124                     oc.write("OK");
125                     oc.write(items);
126                     break;
127                 case SharedFolderAction.LIST_FILE_VERSIONS:
128                     fileId = (Integer JavaDoc)sfa.getParam();
129                     items = doListFileVersions(user, fileId.intValue());
130                     oc.write("OK");
131                     oc.write(items);
132                     break;
133                 case SharedFolderAction.DOWNLOAD_FILE:
134                     params = (Object JavaDoc[])sfa.getParam();
135                     doDownloadFile(user, oc, ((Integer JavaDoc)params[0]).intValue(), ((Integer JavaDoc)params[0]).intValue());
136                     break;
137                 case SharedFolderAction.UPDATE_FOLDER:
138                     folderInfo = (FolderInfo)sfa.getParam();
139                     doUpdateFolder(user, folderInfo);
140                     oc.write("OK");
141                     break;
142                 case SharedFolderAction.UPDATE_FILE:
143                     fileInfo = (FileInfo)sfa.getParam();
144                     doUpdateFile(user, fileInfo);
145                     oc.write("OK");
146                     break;
147                 case SharedFolderAction.REMOVE_FOLDER:
148                     folderId = (Integer JavaDoc)sfa.getParam();
149                     doRemoveFolder(user, folderId.intValue());
150                     oc.write("OK");
151                     break;
152                 case SharedFolderAction.REMOVE_FILE:
153                     fileId = (Integer JavaDoc)sfa.getParam();
154                     doRemoveFile(user, fileId.intValue());
155                     oc.write("OK");
156                     break;
157
158                 case SharedFolderAction.GET_ACLS:
159                     AclInfo[] acl = getAcls((String JavaDoc)sfa.getParam());
160                     oc.write("OK");
161                     oc.write(acl);
162                     break;
163                 case SharedFolderAction.GET_GROUPS:
164                     ArrayList JavaDoc groups = getAllGroups();
165                     oc.write("OK");
166                     oc.write(groups);
167                     break;
168                 case SharedFolderAction.GET_USERS:
169                     ArrayList JavaDoc users = getAllUsers();
170                     oc.write("OK");
171                     oc.write(users);
172                     break;
173                 case SharedFolderAction.ADD_ACL:
174                     params = (Object JavaDoc[])sfa.getParam();
175                     addAcl((String JavaDoc)params[0], (AclInfo)params[1]);
176                     oc.write("OK");
177                     break;
178                 case SharedFolderAction.REMOVE_ACL:
179                     params = (Object JavaDoc[])sfa.getParam();
180                     removeAcl((String JavaDoc)params[0], (AclInfo)params[1]);
181                     oc.write("OK");
182                     break;
183             }
184         } catch(Exception JavaDoc e) {
185             try {
186                 e.printStackTrace();
187                 oc.write("FAILED " + e.getMessage());
188             } catch(IOException ioe) {
189                 Logging.getLogger().warning("Error : " + ioe);
190             }
191         }
192
193         oc.close();
194     }
195
196     //-- actions
197

198     public void doUploadFile(String JavaDoc user, ObjectConnection oc, FileInfo fileInfo)
199     throws Exception JavaDoc
200     {
201         OutputStream out = insertOrUpdateFileInfo(user, fileInfo);
202
203         long length = fileInfo.getSize();
204         long bytes = 0;
205         while(bytes < length)
206         {
207             try {
208                 byte[] buffer = (byte[])oc.read();
209                 out.write(buffer);
210                 bytes += buffer.length;
211             } catch(ClassNotFoundException JavaDoc cnfe) {
212                 //should never happen, byte[] is well known
213
cnfe.printStackTrace();
214             }
215         }
216         out.close();
217     }
218
219     public void doUploadFile(String JavaDoc user, InputStream in, FileInfo fileInfo)
220     throws Exception JavaDoc
221     {
222         OutputStream out = insertOrUpdateFileInfo(user, fileInfo);
223
224         long length = fileInfo.getSize();
225         long totalBytes = 0;
226         while(totalBytes < length)
227         {
228             byte[] buffer = new byte[BUFFER_SIZE];
229             int bytes = in.read(buffer);
230             if(bytes != buffer.length);
231             {
232                 byte[] temp = new byte[bytes];
233                 System.arraycopy(buffer, 0, temp, 0, bytes);
234                 buffer = temp;
235             }
236             out.write(buffer);
237             totalBytes += bytes;
238         }
239         out.close();
240     }
241
242     private OutputStream insertOrUpdateFileInfo(String JavaDoc user, FileInfo fileInfo)
243     throws Exception JavaDoc
244     {
245         int id = fileInfo.getId();
246         if(id == FileInfo.NEW_ID)
247             id = insertFileInfo(user, fileInfo);
248         else
249         {
250             //new version, or update existing version
251
FileInfo old = doGetFile(user, id);
252             if(old.getVersion() != fileInfo.getVersion())
253                 insertFileInfo(user, fileInfo);
254             else
255                 doUpdateFile(user, fileInfo);
256         }
257
258
259         File destination = new File(storage, getStorageId(id, fileInfo.getVersion()));
260         return new DataOutputStream(new FileOutputStream(destination));
261     }
262
263
264     public int doCreateFolder(String JavaDoc user, FolderInfo folderInfo)
265     throws Exception JavaDoc
266     {
267         FolderInfo parent = doGetFolder(user, folderInfo.getParentId());
268         if(!parent.isWritable())
269                         throw new IllegalAccessException JavaDoc("User "+ user + " doesn't have write access to folder '" + parent.getName() + "'");
270
271         int id = folderSequence.getNextId();
272
273         Connection c = layer.getConnection();
274         PreparedStatement insert = c.prepareStatement(
275             "INSERT INTO folders VALUES(?, ?, ?, ?, ?, null)");
276         insert.setInt(1, id);
277         insert.setInt(2, folderInfo.getParentId());
278         insert.setString(3, folderInfo.getName());
279         insert.setString(4, folderInfo.getOwner());
280         insert.setLong(5, new Date JavaDoc().getTime());
281
282         insert.execute();
283         insert.close();
284         c.close();
285
286         return id;
287     }
288
289     public FolderInfo doGetFolder(String JavaDoc user, int folderId)
290     throws Exception JavaDoc
291     {
292         if(folderId == FolderInfo.ROOT_ID)
293             return new FolderInfo(FolderInfo.ROOT_ID, FolderInfo.ROOT_ID, "/", "", null, null, true, true);
294
295         FolderInfo info = null;
296
297         Connection c = layer.getConnection();
298         PreparedStatement select = c.prepareStatement(
299             "SELECT * FROM folders WHERE id=?");
300         select.setInt(1, folderId);
301         ResultSet rs = select.executeQuery();
302         if(rs.next())
303         {
304             int id = rs.getInt(1);
305             int parentId = rs.getInt(2);
306             String JavaDoc folderName = rs.getString(3);
307             String JavaDoc creator = rs.getString(4);
308             Date JavaDoc created = (rs.getLong(5) > 0 ? new Date JavaDoc(rs.getLong(5)) : null);
309             Date JavaDoc modified = (rs.getLong(6) > 0 ? new Date JavaDoc(rs.getLong(6)) : null);
310             boolean readable = user.equals(creator) || acl.hasAccess(getName(), getAclId(folderId, true), SharedItem.READ, user);
311             boolean writable = user.equals(creator) || acl.hasAccess(getName(), getAclId(folderId, true), SharedItem.WRITE, user);
312             info = new FolderInfo(id, parentId, folderName, creator, created, modified, readable, writable);
313         }
314         rs.close();
315         select.close();
316         c.close();
317
318         if(info == null)
319             throw new RuntimeException JavaDoc("no such folder: " + folderId);
320
321         return info;
322     }
323
324     public ArrayList JavaDoc doListFolders(String JavaDoc user, int folderId)
325     throws Exception JavaDoc
326     {
327         FolderInfo folder = doGetFolder(user, folderId);
328         if(!folder.isReadable())
329             throw new IllegalAccessException JavaDoc("User "+ user + " doesn't have read access to folder '" + folder.getName() + "'");
330
331         return reallyListFolders(user, folderId);
332     }
333
334     private ArrayList JavaDoc reallyListFolders(String JavaDoc user, int folderId)
335     throws Exception JavaDoc
336     {
337         ArrayList JavaDoc items = new ArrayList JavaDoc();
338
339         Connection c = layer.getConnection();
340         PreparedStatement select = c.prepareStatement(
341             "SELECT * FROM folders WHERE parentId=?");
342         select.setInt(1, folderId);
343         ResultSet rs = select.executeQuery();
344         while(rs.next())
345         {
346             int id = rs.getInt(1);
347             int parentId = rs.getInt(2);
348             String JavaDoc folderName = rs.getString(3);
349             String JavaDoc creator = rs.getString(4);
350             Date JavaDoc created = (rs.getLong(5) > 0 ? new Date JavaDoc(rs.getLong(5)) : null);
351             Date JavaDoc modified = (rs.getLong(6) > 0 ? new Date JavaDoc(rs.getLong(6)) : null);
352             boolean readable = user.equals(creator) || acl.hasAccess(getName(), getAclId(id, true), SharedItem.READ, user);
353             boolean writable = user.equals(creator) || acl.hasAccess(getName(), getAclId(id, true), SharedItem.WRITE, user);
354             items.add(new FolderInfo(id, parentId, folderName, creator, created, modified, readable, writable));
355         }
356         rs.close();
357         select.close();
358         c.close();
359
360         return items;
361     }
362
363     public ArrayList JavaDoc doListFiles(String JavaDoc user, int folderId)
364     throws Exception JavaDoc
365     {
366         FolderInfo folder = doGetFolder(user, folderId);
367         if(!folder.isReadable())
368             throw new IllegalAccessException JavaDoc("User "+ user + " doesn't have read access to folder '" + folder.getName() + "'");
369
370         return reallyListFiles(user, folderId);
371     }
372
373     private ArrayList JavaDoc reallyListFiles(String JavaDoc user, int folderId)
374     throws Exception JavaDoc
375     {
376         ArrayList JavaDoc items = new ArrayList JavaDoc();
377
378         Connection c = layer.getConnection();
379         PreparedStatement select = c.prepareStatement(
380             "SELECT * FROM files WHERE folderId=? order by id, version");
381         select.setInt(1, folderId);
382         ResultSet rs = select.executeQuery();
383
384         FileInfo lastFile = null;
385         boolean readable = false;
386         boolean writable = false;
387         while(rs.next())
388         {
389             int id = rs.getInt(1);
390             if(lastFile != null && lastFile.getId() != id)
391                 items.add(lastFile);
392
393             int version = rs.getInt(2);
394             int parentId = rs.getInt(3);
395             String JavaDoc folderName = rs.getString(4);
396             String JavaDoc creator = rs.getString(5);
397             Date JavaDoc created = (rs.getLong(6) > 0 ? new Date JavaDoc(rs.getLong(6)) : null);
398             Date JavaDoc modified = (rs.getLong(7) > 0 ? new Date JavaDoc(rs.getLong(7)) : null);
399             long size = rs.getLong(8);
400
401             if(lastFile == null || lastFile.getId() != id)
402             {
403                 readable = user.equals(creator) || acl.hasAccess(getName(), getAclId(id, false), SharedItem.READ, user);
404                 writable = user.equals(creator) || acl.hasAccess(getName(), getAclId(id, false), SharedItem.WRITE, user);
405             }
406             lastFile = new FileInfo(id, version, parentId, folderName, creator, created, modified, size, readable, writable);
407         }
408         rs.close();
409         select.close();
410         c.close();
411
412         if(lastFile != null)
413             items.add(lastFile);
414
415
416         return items;
417     }
418
419     public ArrayList JavaDoc doListFileVersions(String JavaDoc user, int fileId)
420     throws Exception JavaDoc
421     {
422         FileInfo fileInfo = doGetFile(user, fileId);
423         if(!fileInfo.isReadable())
424             throw new IllegalAccessException JavaDoc("User "+ user + " doesn't have read access to file '" + fileInfo.getName() + "'");
425
426
427         ArrayList JavaDoc versions = new ArrayList JavaDoc();
428
429         Connection c = layer.getConnection();
430         PreparedStatement select = c.prepareStatement(
431             "SELECT * FROM files WHERE id=? ORDER BY version");
432         select.setInt(1, fileId);
433         ResultSet rs = select.executeQuery();
434
435         boolean readable = false;
436         boolean writable = false;
437         while(rs.next())
438         {
439             int id = rs.getInt(1);
440             int version = rs.getInt(2);
441             int parentId = rs.getInt(3);
442             String JavaDoc folderName = rs.getString(4);
443             String JavaDoc creator = rs.getString(5);
444             Date JavaDoc created = (rs.getLong(6) > 0 ? new Date JavaDoc(rs.getLong(6)) : null);
445             Date JavaDoc modified = (rs.getLong(7) > 0 ? new Date JavaDoc(rs.getLong(7)) : null);
446             long size = rs.getLong(8);
447             if(versions.size() == 0)
448             {
449                 readable = user.equals(creator) || acl.hasAccess(getName(), getAclId(id, false), SharedItem.READ, user);
450                 writable = user.equals(creator) || acl.hasAccess(getName(), getAclId(id, false), SharedItem.WRITE, user);
451             }
452             versions.add(new FileInfo(id, version, parentId, folderName, creator, created, modified, size, readable, writable));
453         }
454         rs.close();
455         select.close();
456         c.close();
457
458         return versions;
459     }
460
461
462     public FileInfo doGetFile(String JavaDoc user, int fileId)
463     throws Exception JavaDoc
464     {
465         Connection c = layer.getConnection();
466         PreparedStatement select = c.prepareStatement(
467             "SELECT * FROM files WHERE id=? ORDER BY version desc");
468         select.setInt(1, fileId);
469         ResultSet rs = select.executeQuery();
470
471         FileInfo lastFile = null;
472         if(rs.next())
473         {
474             int id = rs.getInt(1);
475             int version = rs.getInt(2);
476             int parentId = rs.getInt(3);
477             String JavaDoc folderName = rs.getString(4);
478             String JavaDoc creator = rs.getString(5);
479             Date JavaDoc created = (rs.getLong(6) > 0 ? new Date JavaDoc(rs.getLong(6)) : null);
480             Date JavaDoc modified = (rs.getLong(7) > 0 ? new Date JavaDoc(rs.getLong(7)) : null);
481             long size = rs.getLong(8);
482             boolean readable = user.equals(creator) || acl.hasAccess(getName(), getAclId(id, false), SharedItem.READ, user);
483             boolean writable = user.equals(creator) || acl.hasAccess(getName(), getAclId(id, false), SharedItem.WRITE, user);
484             lastFile = new FileInfo(id, version, parentId, folderName, creator, created, modified, size, readable, writable);
485         }
486         rs.close();
487         select.close();
488         c.close();
489
490         if(lastFile == null)
491             throw new RuntimeException JavaDoc("no such file: " + fileId);
492
493         return lastFile;
494     }
495     
496     public FileInfo doGetFile(String JavaDoc user, int fileId, int fileVersion)
497     throws Exception JavaDoc
498     {
499         Connection c = layer.getConnection();
500         PreparedStatement select = c.prepareStatement(
501             "SELECT * FROM files WHERE id=? AND version=?");
502         select.setInt(1, fileId);
503         select.setInt(2, fileVersion);
504         ResultSet rs = select.executeQuery();
505
506         FileInfo lastFile = null;
507         if(rs.next())
508         {
509             int id = rs.getInt(1);
510             int version = rs.getInt(2);
511             int parentId = rs.getInt(3);
512             String JavaDoc folderName = rs.getString(4);
513             String JavaDoc creator = rs.getString(5);
514             Date JavaDoc created = (rs.getLong(6) > 0 ? new Date JavaDoc(rs.getLong(6)) : null);
515             Date JavaDoc modified = (rs.getLong(7) > 0 ? new Date JavaDoc(rs.getLong(7)) : null);
516             long size = rs.getLong(8);
517             boolean readable = user.equals(creator) || acl.hasAccess(getName(), getAclId(id, false), SharedItem.READ, user);
518             boolean writable = user.equals(creator) || acl.hasAccess(getName(), getAclId(id, false), SharedItem.WRITE, user);
519             lastFile = new FileInfo(id, version, parentId, folderName, creator, created, modified, size, readable, writable);
520         }
521         rs.close();
522         select.close();
523         c.close();
524
525         if(lastFile == null)
526             throw new RuntimeException JavaDoc("no such file: " + fileId);
527
528         return lastFile;
529     }
530
531     public void doDownloadFile(String JavaDoc user, ObjectConnection oc, int fileId, int version)
532     throws Exception JavaDoc
533     {
534         FileInfo fileInfo = doGetFile(user, fileId, version);
535         if(!fileInfo.isReadable())
536             throw new IllegalAccessException JavaDoc("User "+ user + " doesn't have read access to file '" + fileInfo.getName() + "'");
537
538         File file = new File(storage, getStorageId(fileId, version));
539         oc.write(new Long JavaDoc(file.length()));
540
541         DataInputStream dis = new DataInputStream(new FileInputStream(file));
542         while(dis.available() > 0)
543         {
544             byte[] buffer = new byte[BUFFER_SIZE];
545             int bytes = dis.read(buffer);
546             if(bytes != buffer.length);
547             {
548                 byte[] temp = new byte[bytes];
549                 System.arraycopy(buffer, 0, temp, 0, bytes);
550                 buffer = temp;
551             }
552             oc.write(buffer);
553         }
554     }
555     
556     public void doDownloadFile(String JavaDoc user, HttpServletResponse JavaDoc response, int fileId, int version)
557     throws Exception JavaDoc
558     {
559         FileInfo fileInfo = doGetFile(user, fileId, version);
560         if(!fileInfo.isReadable())
561             throw new IllegalAccessException JavaDoc("User "+ user + " doesn't have read access to file + '" + fileInfo.getName() + "'");
562
563         response.setContentType("application/octet-stream");
564         response.setHeader("Content-disposition", "attachment;filename=\""+fileInfo.getName() + '"');
565         response.setHeader("Content-length", String.valueOf(fileInfo.getSize()));
566         OutputStream out = response.getOutputStream();
567         
568         File file = new File(storage, getStorageId(fileId, version));
569         DataInputStream dis = new DataInputStream(new FileInputStream(file));
570         while(dis.available() > 0)
571         {
572             byte[] buffer = new byte[BUFFER_SIZE];
573             int bytes = dis.read(buffer);
574             if(bytes != buffer.length);
575             {
576                 byte[] temp = new byte[bytes];
577                 System.arraycopy(buffer, 0, temp, 0, bytes);
578                 buffer = temp;
579             }
580             out.write(buffer);
581         }
582     }
583
584     public void doUpdateFolder(String JavaDoc user, FolderInfo folderInfo)
585     throws Exception JavaDoc
586     {
587         FolderInfo folder = doGetFolder(user, folderInfo.getId());
588         if(!folder.isWritable())
589             throw new IllegalAccessException JavaDoc("User "+ user + " doesn't have write access to folder '" + folder.getName() + "'");
590         FolderInfo parent = doGetFolder(user, folderInfo.getParentId());
591         if(!parent.isWritable())
592             throw new IllegalAccessException JavaDoc("User "+ user + " doesn't have write access to folder '" + parent.getName() + "'");
593
594
595         Connection c = layer.getConnection();
596         PreparedStatement insert = c.prepareStatement(
597             "UPDATE folders SET parentId=?, name=?, owner=?, modified=? WHERE id=?");
598
599         insert.setInt(1, folderInfo.getParentId());
600         insert.setString(2, folderInfo.getName());
601         insert.setString(3, folderInfo.getOwner());
602         insert.setLong(4, new Date JavaDoc().getTime());
603         insert.setInt(5, folderInfo.getId());
604
605         insert.execute();
606         insert.close();
607         c.close();
608     }
609
610     public void doUpdateFile(String JavaDoc user, FileInfo fileInfo)
611     throws Exception JavaDoc
612     {
613         FileInfo file = doGetFile(user, fileInfo.getId());
614         if(!file.isWritable())
615             throw new IllegalAccessException JavaDoc("User "+ user + " doesn't have write access to file '" + file.getName() + "'");
616         FolderInfo parent = doGetFolder(user, fileInfo.getParentId());
617         if(!parent.isWritable())
618             throw new IllegalAccessException JavaDoc("User "+ user + " doesn't have write access to folder '" + parent.getName() + "'");
619
620
621         Connection c = layer.getConnection();
622
623         //update file content
624
PreparedStatement insert = c.prepareStatement(
625             "UPDATE files SET name=?, owner=?, modified=?, size=? WHERE id=? AND version=?");
626
627         insert.setString(1, fileInfo.getName());
628         insert.setString(2, fileInfo.getOwner());
629         insert.setLong(3, new Date JavaDoc().getTime());
630         insert.setLong(4, fileInfo.getSize());
631         insert.setInt(5, fileInfo.getId());
632         insert.setInt(6, fileInfo.getVersion());
633         insert.execute();
634         insert.close();
635
636         //move file, all versions
637
if(fileInfo.getParentId() != file.getParentId())
638         {
639             insert = c.prepareStatement(
640                 "UPDATE files SET folderId=? WHERE id=?");
641
642             insert.setInt(1, fileInfo.getParentId());
643             insert.setInt(2, fileInfo.getId());
644             insert.execute();
645             insert.close();
646         }
647
648         c.close();
649     }
650
651     public void doRemoveFolder(String JavaDoc user, int folderId)
652     throws Exception JavaDoc
653     {
654         FolderInfo folder = doGetFolder(user, folderId);
655         if(!folder.isWritable())
656             throw new IllegalAccessException JavaDoc("User "+ user + " doesn't have write access to folder '" + folder.getName() + "'");
657
658         reallyRemoveFolder(user, folderId);
659     }
660
661     private void reallyRemoveFolder(String JavaDoc user, int folderId)
662     throws Exception JavaDoc
663     {
664         Iterator JavaDoc folders = reallyListFolders(user, folderId).iterator();
665         while(folders.hasNext())
666         {
667             FolderInfo folderInfo = (FolderInfo)folders.next();
668             reallyRemoveFolder(user, folderInfo.getId());
669         }
670
671         Iterator JavaDoc files = reallyListFiles(user, folderId).iterator();
672         while(files.hasNext())
673         {
674             FileInfo fileInfo = (FileInfo)files.next();
675             reallyRemoveFile(fileInfo.getId());
676         }
677
678         Connection c = layer.getConnection();
679         PreparedStatement delete = c.prepareStatement(
680             "DELETE FROM folders WHERE id=?");
681
682         delete.setInt(1, folderId);
683
684         delete.execute();
685         delete.close();
686         c.close();
687     }
688
689
690     public void doRemoveFile(String JavaDoc user, int fileId)
691     throws Exception JavaDoc
692     {
693         FileInfo file = doGetFile(user, fileId);
694         if(!file.isWritable())
695             throw new IllegalAccessException JavaDoc("User "+ user + " doesn't have write access to file '" + file.getName() + "'");
696
697         reallyRemoveFile(fileId);
698     }
699
700     private void reallyRemoveFile(int fileId)
701     throws SQLException
702     {
703         Connection c = layer.getConnection();
704         PreparedStatement delete = c.prepareStatement(
705             "DELETE FROM files WHERE id=?");
706
707         delete.setInt(1, fileId);
708
709         delete.execute();
710         delete.close();
711         c.close();
712
713         File file = new File(storage, String.valueOf(fileId));
714         file.delete();
715     }
716
717     //-- ACL
718

719     public AclInfo[] getAcls(String JavaDoc itemId)
720     throws Exception JavaDoc
721     {
722         return acl.getAcls(getName(), itemId);
723     }
724
725     public ArrayList JavaDoc getAllGroups()
726     throws Exception JavaDoc
727     {
728         ArrayList JavaDoc groups = new ArrayList JavaDoc();
729         Iterator JavaDoc i = Server.getInstance().getStore().getGroupStore().getAllGroups();
730         while(i.hasNext())
731         {
732             GroupConcept concept = (GroupConcept)i.next();
733             groups.add(concept.getName());
734         }
735
736         return groups;
737     }
738
739     public ArrayList JavaDoc getAllUsers()
740     throws Exception JavaDoc
741     {
742         ArrayList JavaDoc users = new ArrayList JavaDoc();
743         Iterator JavaDoc i = Server.getInstance().getStore().getUserStore().getAllUsers();
744         while(i.hasNext())
745         {
746             UserConcept concept = (UserConcept)i.next();
747             users.add(concept.getName());
748         }
749
750         return users;
751     }
752
753     public void addAcl(String JavaDoc itemId, AclInfo aclInfo)
754     throws Exception JavaDoc
755     {
756         if(aclInfo.getGroup() != null)
757         {
758             if(aclInfo.isAllow())
759                 acl.allowGroup(getName(), itemId, aclInfo.getAccess(), aclInfo.getGroup());
760             else
761                 acl.denyGroup(getName(), itemId, aclInfo.getAccess(), aclInfo.getGroup());
762         }
763         else if(aclInfo.getUser() != null)
764         {
765             if(aclInfo.isAllow())
766                 acl.allowUser(getName(), itemId, aclInfo.getAccess(), aclInfo.getUser());
767             else
768                 acl.denyUser(getName(), itemId, aclInfo.getAccess(), aclInfo.getUser());
769         }
770     }
771
772     public void removeAcl(String JavaDoc itemId, AclInfo aclInfo)
773     throws Exception JavaDoc
774     {
775         if(aclInfo.getGroup() != null)
776             acl.removeAclForGroup(getName(), itemId, aclInfo.getAccess(), aclInfo.getGroup());
777         else if(aclInfo.getUser() != null)
778             acl.removeAclForUser(getName(), itemId, aclInfo.getAccess(), aclInfo.getUser());
779     }
780
781     //introduced for acl webapp
782
public String JavaDoc[] getAccesses()
783     {
784         return new String JavaDoc[] {SharedItem.READ, SharedItem.WRITE};
785     }
786
787     public String JavaDoc getItemName(String JavaDoc itemId) throws Exception JavaDoc
788     {
789
790         SharedItem item;
791         if(itemId.charAt(0) == 'f')
792             item = doGetFolder("", Integer.parseInt(itemId.substring(1)));
793         else
794             item = doGetFile("", Integer.parseInt(itemId));
795
796         return item.getName();
797     }
798
799     //-- private methods
800

801     private synchronized int insertFileInfo(String JavaDoc user, FileInfo fileInfo)
802     throws Exception JavaDoc
803     {
804         int id = fileInfo.getId();
805
806         if(id == FileInfo.NEW_ID)
807         {
808             FolderInfo folder = doGetFolder(user, fileInfo.getParentId());
809             if(!folder.isWritable())
810                 throw new IllegalAccessException JavaDoc("User "+ user + " doesn't have write access to folder '" + folder.getName() + "'");
811         }
812         else
813         {
814             FileInfo file = doGetFile(user, id);
815             if(!file.isWritable())
816                 throw new IllegalAccessException JavaDoc("User "+ user + " doesn't have write access to file '" + file.getName() + "'");
817
818         }
819
820
821         if(id == FileInfo.NEW_ID)
822             id = fileSequence.getNextId();
823
824         Connection c = layer.getConnection();
825         PreparedStatement insert = c.prepareStatement(
826             "INSERT INTO files VALUES(?, ?, ?, ?, ?, ?, null, ?)");
827         insert.setInt(1, id);
828         insert.setInt(2, fileInfo.getVersion());
829         insert.setInt(3, fileInfo.getParentId());
830         insert.setString(4, fileInfo.getName());
831         insert.setString(5, fileInfo.getOwner());
832         insert.setLong(6, new Date JavaDoc().getTime());
833         insert.setLong(7, fileInfo.getSize());
834
835         insert.execute();
836         insert.close();
837         c.close();
838
839         return id;
840     }
841
842     private String JavaDoc getStorageId(int fileId, int version)
843     {
844       return String.valueOf(fileId) + '.' + version;
845     }
846
847     private String JavaDoc getAclId(int id, boolean isFolder)
848     {
849         return (isFolder ? "f" : "") + id;
850     }
851 }
Popular Tags