KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > za > org > coefficient > modules > fileUpload > FileUpload


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

19
20 package za.org.coefficient.modules.fileUpload;
21
22 import net.sf.hibernate.Hibernate;
23 import net.sf.hibernate.Session;
24 import net.sf.hibernate.HibernateException;
25 import net.sf.hibernate.type.Type;
26
27 import org.apache.commons.fileupload.FileUploadException;
28
29 import za.org.coefficient.authentication.CoefficientUser;
30 import za.org.coefficient.authentication.Role;
31 import za.org.coefficient.core.Constants;
32 import za.org.coefficient.core.Project;
33 import za.org.coefficient.interfaces.CoefficientContext;
34 import za.org.coefficient.modules.BaseProjectModule;
35 import za.org.coefficient.modules.project.ProjectConstants;
36 import za.org.coefficient.servlet.GenericDownloadServlet;
37 import za.org.coefficient.util.common.BaseMultipartRequest;
38 import za.org.coefficient.util.common.FileDownloadData;
39 import za.org.coefficient.util.common.UploadedFile;
40 import net.sf.hibernate.util.HibernateUtil;
41 import za.org.coefficient.util.ejb.SecurityUtil;
42 import za.org.coefficient.util.ejb.VelocityScreenUtil;
43
44 import java.io.File JavaDoc;
45 import java.io.FileOutputStream JavaDoc;
46 import java.io.FileInputStream JavaDoc;
47 import java.io.IOException JavaDoc;
48
49 import java.util.HashMap JavaDoc;
50 import java.util.TreeMap JavaDoc;
51 import java.util.Iterator JavaDoc;
52 import java.util.List JavaDoc;
53 import java.util.Locale JavaDoc;
54 import java.util.Arrays JavaDoc;
55 import java.util.ArrayList JavaDoc;
56
57 /**
58  * @pojo2ejb.class
59  * name="FileUpload"
60  * jndi-prefix="za/org/coefficient/project/"
61  * interface-extends="za.org.coefficient.interfaces.Module"
62  * interface-local-extends="za.org.coefficient.interfaces.ModuleLocal"
63  *
64  * @web.resource-env-ref
65  * name="za/org/coefficient/project/FileUpload"
66  * type="za.org.coefficient.modules.fileUpload.FileUpload"
67  * @web.resource-env-ref
68  * name="FileUpload"
69  * type="za.org.coefficient.modules.fileUpload.FileUpload"
70  */

71 public class FileUpload extends BaseProjectModule {
72     //~ Static fields/initializers =============================================
73

74     static {
75         try {
76             Class JavaDoc[] presistentClasses =
77             { ProjectFolder.class, ProjectFolderItem.class, ProjectUpload.class };
78             HibernateUtil.configureHibernateForClasses(presistentClasses);
79         } catch (HibernateException he) {
80             he.printStackTrace();
81         }
82         
83         GenericDownloadServlet.addProvider("fileUpload", "FileUpload",
84                                            "getUpload");
85     }
86
87     private static final int sizeKb = 1024;
88     private static final int sizeMb = 1024 * sizeKb;
89
90     //~ Methods ================================================================
91

92     public String JavaDoc getMainMethod() {
93         // NOTE: this can be any method of this class that makes sense
94
return "interpretAction";
95     }
96
97     public String JavaDoc getModuleDescription() {
98         return "For file uploads/downloads related to projects";
99     }
100
101     public String JavaDoc getModuleDisplayName() {
102         return "File Upload";
103     }
104
105     public String JavaDoc getSummaryForProject(CoefficientContext ctx)
106         throws Exception JavaDoc {
107
108         Session sess = HibernateUtil.getSession();
109         // Find out the count of the folders associated with the project
110
Integer JavaDoc folderCnt =
111             (Integer JavaDoc)sess.iterate("select count(*) from "
112                                   + ProjectFolder.class.getName()
113                                   + " as prjFolder where prjFolder.project.id = ?",
114                                   ctx.getProject().getId(),
115                                   Hibernate.LONG).next();
116
117         // Don't show the root folder as a count, it is only confusing.
118
if(folderCnt.intValue() != 0) {
119             folderCnt = new Integer JavaDoc(folderCnt.intValue() - 1);
120         }
121
122         // Find out the count of the uploads associated with the project
123
Integer JavaDoc uploadCnt =
124             (Integer JavaDoc)sess.iterate("select count(*) from "
125                                   + ProjectFolderItem.class.getName()
126                                   + " as upload where upload.parentFolder.project.id = ?",
127                                   ctx.getProject().getId(),
128                                   Hibernate.LONG).next();
129
130         // TODO: remove this when the hibernate util is all fixed up, this won't
131
// be needed.
132
HibernateUtil.finalizeSession();
133         // Find out the root folders ID
134
Long JavaDoc parentFolderID = getRootFolderId(ctx);
135
136         HashMap JavaDoc map = new HashMap JavaDoc();
137         map.put("parentFolderID", parentFolderID);
138         map.put("folderCnt", folderCnt);
139         map.put("uploadCnt", uploadCnt);
140         map.put("projectName", ProjectConstants.PROJECT_NAME);
141         StringBuffer JavaDoc sb =
142             VelocityScreenUtil.getProcessedScreen("getSummaryForProject.vm", map);
143         return sb.toString();
144     }
145
146     public CoefficientContext showSummaryForProject(CoefficientContext ctx)
147         throws Exception JavaDoc {
148         HashMap JavaDoc map = new HashMap JavaDoc();
149         map.put("content", getSummaryForProject(ctx));
150         StringBuffer JavaDoc sb =
151             VelocityScreenUtil.getProcessedScreen("showSummaryForProject.vm",
152                                                   map);
153         ctx.setModuleContent(sb.toString(), getModuleDisplayName());
154         return ctx;
155     }
156
157     public int getAllUploadsSize(CoefficientContext ctx)
158         throws HibernateException {
159         Session sess = HibernateUtil.getSession();
160         Integer JavaDoc retVal = (Integer JavaDoc) sess.iterate("select count(uploads) from "
161                 + ProjectUpload.class.getName() + " as uploads where "
162                 + "uploads.folderItem.parentFolder.project.id = ?",
163                 ctx.getProject().getId(), Hibernate.LONG).next();
164         // TODO: remove this when the hibernate util is all fixed up, this won't
165
// be needed.
166
HibernateUtil.finalizeSession();
167         return retVal.intValue();
168     }
169
170     public void setCurrent(CoefficientContext ctx, Project project)
171         throws HibernateException {
172         try {
173             // UploadData data = null;
174
long thisItemID = 0;
175             try {
176                 thisItemID = Long.parseLong(ctx.getParameter("itemID"));
177             } catch (Exception JavaDoc e) {
178                 ctx.setError("Badly formatted itemID!");
179                 return;
180             }
181             long thisUploadID = 0;
182             try {
183                 thisUploadID =
184                     Long.parseLong(ctx.getParameter("projectUploadID"));
185             } catch (Exception JavaDoc e) {
186                 ctx.setError("Badly formatted projectUploadID!");
187                 return;
188             }
189
190             ProjectFolderItem item = null;
191
192             synchronized (this) {
193                 item =
194                     (ProjectFolderItem) HibernateUtil.load(ProjectFolderItem.class,
195                         new Long JavaDoc(thisItemID));
196
197                 // check if user can write to item
198
if (!(isUserAllowed(ctx, item.getMaxWriteRole().getRoleValue()))) {
199                     ctx.setError(
200                         "You do not have permission to make the upload current!");
201
202                     return;
203                 }
204
205                 if (item.getParentFolder()
206                         .getProject()
207                         .getId()
208                         .longValue() != project.getId()
209                                                .longValue()) {
210                     ctx.setError("Item does not belong to this project!");
211
212                     return;
213                 }
214
215                 // check version
216
if (ctx.getParameterAsLongPrimitive("version", 0) < item
217                     .getVersion()) {
218                     throw new net.sf.hibernate.StaleObjectStateException(item
219                         .getClass(), item.getID());
220                 }
221
222                 // get upload
223
ProjectUpload upload =
224                     (ProjectUpload) HibernateUtil.load(ProjectUpload.class,
225                         new Long JavaDoc(thisUploadID));
226
227                 if (upload.getFolderItem()
228                           .getID()
229                           .longValue() != item.getID()
230                                               .longValue()) {
231                     ctx.setError("Upload is not part of this item!");
232
233                     return;
234                 }
235
236                 item.setCurrentVersion(upload);
237                 HibernateUtil.saveOrUpdate(item);
238             }
239
240             // end synchronized block
241
// forward to view item screen
242
HashMap JavaDoc forwardMap = new HashMap JavaDoc();
243             forwardMap.put("itemID", item.getID());
244             forwardMap.put("action", "showItem");
245             ctx.setForward("fileUpload", "interpretAction", forwardMap);
246         } catch (HibernateException he) {
247             if (he instanceof net.sf.hibernate.StaleObjectStateException) {
248                 throw he;
249             }
250             ctx.setError("Error storing/reading data");
251             he.printStackTrace();
252
253             return;
254         }
255     }
256
257     /**
258      *
259      * This is a workflow utility method
260      */

261     public Long JavaDoc getRootFolderId(CoefficientContext ctx)
262         throws HibernateException {
263         // invoke browse to force creation of a root folder if there is none
264
browse(ctx, ctx.getProject(), false);
265
266         List JavaDoc rootFolders =
267             HibernateUtil.find("FROM " + ProjectFolder.class.getName()
268                 + " as ProjectFolder WHERE " + "ProjectFolder.parentFolder IS "
269                 + "NULL AND " + "ProjectFolder.project.id= ?",
270                 ctx.getProject().getId(), Hibernate.LONG);
271
272         return ((ProjectFolder) rootFolders.get(0)).getID();
273     }
274
275     /**
276      * To get a string describing the size of a file
277      */

278     public String JavaDoc getSizeString(int fileSize) {
279         String JavaDoc size;
280         if (fileSize >= sizeMb) {
281             size = "" + ((float) fileSize / (float) sizeMb);
282
283             return trimToOneDecimalPlace(size) + " MB";
284         } else if (fileSize >= sizeKb) {
285             size = "" + ((float) fileSize / (float) sizeKb);
286
287             return trimToOneDecimalPlace(size) + " kb";
288         } else {
289             return fileSize + " bytes";
290         }
291     }
292
293     public FileDownloadData getUpload(CoefficientContext ctx) {
294         Long JavaDoc id = ctx.getParameterAsLong("uploadID");
295         CoefficientUser user = ctx.getCurrentUser();
296         Project project = ctx.getProject();
297         try {
298             FileDownloadData retVal = null;
299             if (project == null) {
300                 return null;
301             }
302             ProjectUpload upload =
303                 (ProjectUpload) HibernateUtil.load(ProjectUpload.class, id);
304             if (upload == null) {
305                 return null;
306             }
307
308             // check premissions
309
long maxAllowedRole =
310                 upload.getFolderItem()
311                       .getMaxReadRole()
312                       .getRoleValue();
313             if ((user == null)
314                 && (SecurityUtil.getRoleForDescription(
315                     SecurityUtil.GUEST_ROLE_DESC)
316                                 .getRoleValue() > maxAllowedRole)) {
317                 return null;
318             }
319             long maxRole =
320                 SecurityUtil.getHighestRoleForUser(user, project)
321                             .getRoleValue();
322             if (maxRole > maxAllowedRole) {
323                 return null;
324             }
325
326             if(upload != null) {
327                 byte[] data = new byte[upload.getFileSize()];
328                 try {
329                     File diskFile =
330                         new File(Constants.FILEUPLOAD_SAVE_PATH + upload.getID()
331                                  + ".up");
332                     FileInputStream JavaDoc inS = new FileInputStream JavaDoc(diskFile);
333                     inS.read(data);
334                     inS.close();
335                 } catch (Exception JavaDoc e) {
336                     e.printStackTrace();
337                     throw new RuntimeException JavaDoc ("Could not read file from server!");
338                 }
339                 retVal = new FileDownloadData();
340                 retVal.setBytes(data);
341                 retVal.setFilename(upload.getFilename());
342                 retVal.setMimeType(upload.getMimeType());
343             }
344             return retVal;
345         } catch (Exception JavaDoc e) {
346             e.printStackTrace();
347             return null;
348         }
349     }
350
351     public String JavaDoc getUploadVersionString(ProjectUpload upload) {
352         return trimToOneDecimalPlace("" + upload.getVersion());
353     }
354
355     public void addEntity(CoefficientContext ctx, Project project) {
356         HashMap JavaDoc map = new HashMap JavaDoc();
357         map.put("module", this);
358         map.put("project", project);
359
360         try {
361             // try and find folder
362
ProjectFolder parentFolder = null;
363             String JavaDoc parentFolderID = ctx.getParameter("parentFolderID");
364             if ((parentFolderID == null)
365                 || (parentFolderID.compareToIgnoreCase("") == 0)) { // try to get root folder
366
List JavaDoc rootFolders =
367                     HibernateUtil.find("FROM " + ProjectFolder.class.getName()
368                         + " as ProjectFolder WHERE "
369                         + "ProjectFolder.parentFolder IS NULL AND ProjectFolder.project.id = ?",
370                         project.getId(), Hibernate.LONG);
371
372                 // check if there is more than one root folder
373
if (rootFolders.size() > 0) {
374                     ctx.setError("Root folder already exists for this project!");
375
376                     return;
377                 }
378             } else { // get the specified folder
379
long thisParentFolderID = 0;
380                 try {
381                     thisParentFolderID = Long.parseLong(parentFolderID);
382                 } catch (Exception JavaDoc e) {
383                     ctx.setError("Badly formatted parentFolderID!");
384
385                     return;
386                 }
387                 parentFolder =
388                     (ProjectFolder) HibernateUtil.load(ProjectFolder.class,
389                         new Long JavaDoc(thisParentFolderID));
390             }
391
392             // check if folder exists
393
if ((parentFolder == null) && (parentFolderID != null)
394                 && (parentFolderID.compareToIgnoreCase("") != 0)) {
395                 ctx.setError("Specified Parent Folder does not exist!");
396
397                 return;
398             }
399
400             /**
401              * Its possible that the url can be altered to access folders belonging
402              * to other projects - we just need to check that the folder we've been
403              * given matches the project
404              */

405             if ((parentFolder != null)
406                 && (parentFolder.getProject()
407                                 .getId()
408                                 .longValue() != project.getId()
409                                                        .longValue())) {
410                 ctx.setError("Parent Folder does not belong to this project!");
411
412                 return;
413             }
414
415             // check permissions
416
Role championRole =
417                 SecurityUtil.getRoleForDescription(SecurityUtil.PROJECT_CHAMPION_ROLE_DESC);
418             long maxReadRole = championRole.getRoleValue(); // champion by default
419
long maxWriteRole = championRole.getRoleValue(); // champion by default
420
if (parentFolder != null) {
421                 maxReadRole = parentFolder.getMaxReadRole()
422                                           .getRoleValue();
423                 maxWriteRole = parentFolder.getMaxWriteRole()
424                                            .getRoleValue();
425             }
426
427             if (!isUserAllowed(ctx, maxReadRole)) {
428                 ctx.setError(
429                     "You don't have read permissions for this folder level of the project!");
430
431                 return;
432             }
433             if (!isUserAllowed(ctx, maxWriteRole)) {
434                 ctx.setError(
435                     "You don't have write permissions for this folder level of the project!");
436
437                 return;
438             }
439
440             // check the entity type
441
String JavaDoc entityType = ctx.getParameter("entityType");
442             if (entityType == null) {
443                 entityType = "folder"; // default
444
}
445             if (entityType.compareToIgnoreCase("item") == 0) {
446                 if (parentFolder == null) {
447                     ctx.setError(
448                         "Can't create an item for this project before creating root folder!");
449
450                     return;
451                 }
452             } else if (entityType.compareToIgnoreCase("folder") != 0) {
453                 ctx.setError("Unknown entity type: '" + entityType + "'");
454
455                 return;
456             }
457
458             String JavaDoc subAction = ctx.getParameter("subAction");
459             if ((subAction != null)
460                 && (subAction.compareToIgnoreCase("create") == 0)) {
461                 // actually create the entity and browse to it
462
ProjectEntity lastFolder;
463                 if (entityType.compareToIgnoreCase("folder") == 0) { // save a folder
464
ProjectFolder folder = new ProjectFolder();
465                     folder.setUserComment(ctx.getParameter("comment"));
466                     folder.setMaxReadRole(SecurityUtil.getRoleForValue(
467                             Integer.parseInt(ctx.getParameter("maxReadRole"))));
468                     folder.setMaxWriteRole(SecurityUtil.getRoleForValue(
469                             Integer.parseInt(ctx.getParameter("maxWriteRole"))));
470                     folder.setName(ctx.getParameter("name"));
471                     folder.setProject(project);
472                     folder.setParentFolder(parentFolder);
473                     folder.setCoefficientUser(ctx.getCurrentUser());
474                     // Persist
475
HibernateUtil.saveOrUpdate(folder);
476                     lastFolder = folder;
477                 } else { // save an item THIS DOES NOT HAPPEN ANYMORE
478
ProjectFolderItem item = new ProjectFolderItem();
479                     item.setUserComment(ctx.getParameter("comment"));
480                     item.setMaxReadRole(SecurityUtil.getRoleForValue(
481                             Integer.parseInt(ctx.getParameter("maxReadRole"))));
482                     item.setMaxWriteRole(SecurityUtil.getRoleForValue(
483                             Integer.parseInt(ctx.getParameter("maxWriteRole"))));
484                     item.setName(ctx.getParameter("name"));
485                     item.setParentFolder(parentFolder);
486                     item.setCoefficientUser(ctx.getCurrentUser());
487
488                     // Persist
489
HibernateUtil.saveOrUpdate(item);
490                     lastFolder = parentFolder;
491                 }
492
493                 // show created screen
494
map.put("parentFolder", parentFolder);
495                 map.put("entityType", entityType);
496                 map.put("name", ctx.getParameter("name"));
497                 map.put("folderToBrowseTo", lastFolder.getID());
498
499
500                 // forward to view item screen
501
HashMap JavaDoc forwardMap = new HashMap JavaDoc();
502                 forwardMap.put("folderID",
503                     ((lastFolder == null) ? null : lastFolder.getID()));
504                 forwardMap.put("action", "browse");
505                 ctx.setForward("fileUpload", "interpretAction", forwardMap);
506
507                 /*
508                   StringBuffer sb =
509                   VelocityScreenUtil.getProcessedScreen("entityCreated.vm",
510                   map);
511                   ctx.setModuleContent(sb.toString(), getModuleDisplayName());
512                 */

513             } else {
514                 // show create entity form
515
map.put("roles",
516                     filterRoles(ctx.getCurrentUser(), SecurityUtil.getRoles(),
517                         project));
518                 map.put("parentFolder", parentFolder);
519                 map.put("entityType", entityType);
520                 StringBuffer JavaDoc sb =
521                     VelocityScreenUtil.getProcessedScreen("createEntity.vm", map);
522                 ctx.setModuleContent(sb.toString(), getModuleDisplayName());
523             }
524
525         } catch (HibernateException he) {
526             ctx.setError("Error storing/reading data");
527             he.printStackTrace();
528
529             return;
530         }
531     }
532
533     public void browse(CoefficientContext ctx, Project project,
534                        boolean showScreen) {
535         HashMap JavaDoc map = new HashMap JavaDoc();
536         map.put("module", this);
537         map.put("project", project);
538
539         try {
540             // try and find folder
541
ProjectFolder thisFolder = null;
542             String JavaDoc folderID = ctx.getParameter("folderID");
543             if ((folderID == null) || (folderID.compareToIgnoreCase("") == 0)) { // try to get root folder
544
List JavaDoc rootFolders =
545                     HibernateUtil.find("FROM " + ProjectFolder.class.getName()
546                         + " as ProjectFolder WHERE "
547                         + "ProjectFolder.parentFolder IS NULL AND ProjectFolder.project.id= ?",
548                         project.getId(), Hibernate.LONG);
549
550                 // check if there is more than one root folder
551
if (rootFolders.size() > 1) {
552                     ctx.setError("Project contains more than one root folder!");
553
554                     return;
555                 }
556                 if (rootFolders.size() == 0) { // root must be created
557

558                     // create root folder
559
ProjectFolder root = new ProjectFolder();
560                     root.setMaxReadRole(SecurityUtil.getRoleForDescription(
561                             SecurityUtil.GUEST_ROLE_DESC));
562                     root.setMaxWriteRole(SecurityUtil.getRoleForDescription(
563                             SecurityUtil.PROJECT_CHAMPION_ROLE_DESC));
564                     root.setName("files");
565                     root.setProject(project);
566                     root.setUserComment(
567                         "This is the root file upload folder for the "
568                         + project.getName() + " project");
569                     HibernateUtil.saveOrUpdate(root);
570                     thisFolder = root;
571                 } else {
572                     thisFolder = (ProjectFolder) rootFolders.get(0);
573                 }
574             } else { // get the specified folder
575
long thisFolderID = 0;
576                 try {
577                     thisFolderID = Long.parseLong(folderID);
578                 } catch (Exception JavaDoc e) {
579                     ctx.setError("Badly formatted folderID!");
580
581                     return;
582                 }
583                 thisFolder =
584                     (ProjectFolder) HibernateUtil.load(ProjectFolder.class,
585                         new Long JavaDoc(thisFolderID));
586             }
587
588             // check if folder exists
589
if (thisFolder == null) {
590                 ctx.setError("Folder does not exist!");
591
592                 return;
593             }
594
595             // check if user can view folder
596
if (!(isUserAllowed(ctx, thisFolder.getMaxReadRole().getRoleValue()))) {
597                 ctx.setError(
598                     "You do not have permission to view this folder/item!");
599
600                 return;
601             }
602
603             /**
604              * Its possible that the url can be altered to access folders belonging
605              * to other projects - we just need to check that the folder we've been
606              * given matches the project
607              */

608             if (thisFolder.getProject()
609                           .getId()
610                           .longValue() != project.getId()
611                                                  .longValue()) {
612                 ctx.setError("Folder does not belong to this project!");
613
614                 return;
615             }
616
617             // get subfolders
618
List JavaDoc subFolders =
619                 HibernateUtil.find("FROM " + ProjectFolder.class.getName()
620                     + " as subFolder WHERE "
621                     + "subFolder.parentFolder = ? order by subFolder.name ",
622                     thisFolder.getID(), Hibernate.LONG);
623             for (int i = 0; i < subFolders.size(); i++) {
624                 if (!isUserAllowed(ctx,
625                         (((ProjectFolder) subFolders
626                           .get(i)).getMaxReadRole().getRoleValue()))) {
627                     subFolders.remove(i);
628                 }
629             }
630             map.put("subFolders", subFolders);
631
632             // get folderItems
633
List JavaDoc folderItems =
634                 HibernateUtil.find("FROM " + ProjectFolderItem.class.getName()
635                     + " as folderItem WHERE "
636                     + "folderItem.parentFolder = ? order by folderItem.name",
637                     thisFolder.getID(), Hibernate.LONG);
638             for (int i = 0; i < folderItems.size(); i++) {
639                 if (!isUserAllowed(ctx,
640                         (((ProjectFolderItem) folderItems
641                           .get(i)).getMaxReadRole().getRoleValue()))) {
642                     folderItems.remove(i);
643                 }
644             }
645             map.put("folderItems", folderItems);
646
647             map.put("thisFolder", thisFolder);
648             map.put("canWrite",
649                 new Integer JavaDoc(isUserAllowed(ctx,
650                         thisFolder.getMaxWriteRole().getRoleValue()) ? 1 : 0));
651
652             // get full path and put in context
653
String JavaDoc fullpath = getFullPathForFolder(thisFolder, "");
654             fullpath = fullpath.substring(0, fullpath.length() - 1); // remove traling slash
655
map.put("fullpath", fullpath);
656
657             if(showScreen) {
658                 // make browse screen
659
StringBuffer JavaDoc sb =
660                     VelocityScreenUtil.getProcessedScreen("browse.vm", map);
661                 ctx.setModuleContent(sb.toString(), getModuleDisplayName());
662             }
663         } catch (HibernateException he) {
664             ctx.setError("Error storing/reading data");
665             he.printStackTrace();
666
667             return;
668         }
669     }
670
671     public String JavaDoc canExecuteForRole(CoefficientContext ctx, String JavaDoc methodName,
672         Role usersHighestRole) {
673         return null;
674     }
675
676     /**
677      *
678      * This is a workflow utility method
679      */

680     public CoefficientContext createRootFolderItemIfNotExist(CoefficientContext ctx)
681         throws HibernateException {
682         // invoke browse to force creation of a root folder if there is none
683
browse(ctx, ctx.getProject(), true);
684         List JavaDoc rootFolders =
685             HibernateUtil.find("FROM " + ProjectFolder.class.getName()
686                 + " as ProjectFolder WHERE " + "ProjectFolder.parentFolder IS "
687                 + "NULL AND " + "ProjectFolder.project.id= ?",
688                 ctx.getProject().getId(), Hibernate.LONG);
689         ProjectFolder root = ((ProjectFolder) rootFolders.get(0));
690
691         // check if item exists
692
List JavaDoc items =
693             HibernateUtil.find("FROM " + ProjectFolderItem.class.getName()
694                 + " as item WHERE " + "item.parentFolder.ID = ? AND "
695                 + "item.name = ?",
696                 new Object JavaDoc[] { root.getID(), ctx.getParameter("name") },
697                 new Type[] { Hibernate.LONG, Hibernate.STRING });
698         if (items.size() == 0) {
699             ProjectFolderItem item = new ProjectFolderItem();
700             item.setParentFolder(root);
701             item.setName(ctx.getParameter("name"));
702             item.setUserComment(ctx.getParameter("comment"));
703             item.setMaxReadRole(SecurityUtil.getRoleForValue(
704                     ctx.getParameterAsInt("maxReadRole", 0)));
705             item.setMaxWriteRole(SecurityUtil.getRoleForValue(
706                     ctx.getParameterAsInt("maxWriteRole", 0)));
707             HibernateUtil.saveOrUpdate(item);
708         }
709         return ctx;
710     }
711
712     public CoefficientContext deleteAllForProject(CoefficientContext ctx) throws IOException JavaDoc {
713         try {
714             List JavaDoc rootFolders =
715                 HibernateUtil.find("FROM " + ProjectFolder.class.getName()
716                     + " as ProjectFolder WHERE "
717                     + "ProjectFolder.parentFolder IS NULL AND ProjectFolder.project.id= ?",
718                     ctx.getProject().getId(), Hibernate.LONG);
719             if (rootFolders.size() == 0) {
720                 return ctx;
721             }
722             deleteProjectFolder(((ProjectFolder) rootFolders.get(0)).getID());
723         } catch (HibernateException he) {
724             he.printStackTrace();
725         }
726         return ctx;
727     }
728
729     public void deleteEntity(CoefficientContext ctx, Project project)
730         throws HibernateException {
731         try {
732             ProjectEntity entity = null;
733             long entityID = 0;
734             try {
735                 entityID = Long.parseLong(ctx.getParameter("entityID"));
736             } catch (Exception JavaDoc e) {
737                 ctx.setError("Badly formatted entityID!");
738
739                 return;
740             }
741
742             boolean isItem = false;
743             synchronized (this) {
744                 String JavaDoc entityType = ctx.getParameter("entityType");
745                 if (entityType.compareToIgnoreCase("item") == 0) {
746                     entity =
747                         (ProjectFolderItem) HibernateUtil.load(ProjectFolderItem.class,
748                             new Long JavaDoc(entityID));
749                     isItem = true;
750                 } else if (entityType.compareToIgnoreCase("folder") == 0) {
751                     entity =
752                         (ProjectFolder) HibernateUtil.load(ProjectFolder.class,
753                             new Long JavaDoc(entityID));
754                 } else {
755                     ctx.setError("Unknown entity type: '" + entityType + "'");
756
757                     return;
758                 }
759
760                 ProjectFolder lastFolder = entity.getParentFolder();
761
762                 // check if user can delete the entity
763
if (!(isUserAllowed(ctx, entity.getMaxWriteRole().getRoleValue()))) {
764                     ctx.setError(
765                         "You do not have permission to perform the delete!");
766
767                     return;
768                 }
769
770                 if (ctx.getParameterAsLongPrimitive("version", 0) < entity
771                     .getVersion()) {
772                     throw new net.sf.hibernate.StaleObjectStateException(entity
773                         .getClass(), entity.getID());
774                 }
775
776                 // delete
777
try {
778                     if (isItem) {
779                         deleteProjectFolderItem(entity.getID());
780                     } else {
781                         deleteProjectFolder(entity.getID());
782                     }
783                 } catch (IOException JavaDoc e) {
784                     ctx.setError("Could not delete file on server!");
785                     e.printStackTrace();
786
787                     return;
788                 }
789
790
791                 // forward to view item screen
792
HashMap JavaDoc forwardMap = new HashMap JavaDoc();
793                 forwardMap.put("folderID",
794                     ((lastFolder == null) ? null : lastFolder.getID()));
795                 forwardMap.put("action", "browse");
796                 ctx.setForward("fileUpload", "interpretAction", forwardMap);
797             }
798
799             // end synchronization
800
} catch (HibernateException he) {
801             if (he instanceof net.sf.hibernate.StaleObjectStateException) {
802                 throw he;
803             }
804             ctx.setError("Error storing/reading data");
805             he.printStackTrace();
806
807             return;
808         }
809     }
810
811     public void deleteFile(CoefficientContext ctx, Project project) {
812         try {
813             ProjectUpload upload = null;
814             long thisFileID = 0;
815             try {
816                 thisFileID = Long.parseLong(ctx.getParameter("uploadID"));
817             } catch (Exception JavaDoc e) {
818                 ctx.setError("Badly formatted uploadID!");
819                 return;
820             }
821             upload = (ProjectUpload) HibernateUtil.load(ProjectUpload.class, new Long JavaDoc(thisFileID));
822
823             // check if user can delete the file
824
if (!(isUserAllowed(ctx, upload.getFolderItem().getMaxWriteRole().getRoleValue()))) {
825                 ctx.setError("You do not have permission to delete this file!");
826                 return;
827             }
828
829             // delete (watch out that current version of folder item does not point to file to be deleted)
830
ProjectFolderItem item = upload.getFolderItem();
831             if ((item.getCurrentVersion() != null)
832                 && (item.getCurrentVersion().getID().longValue() == upload.getID().longValue())) {
833                 item.setCurrentVersion(null);
834                 HibernateUtil.saveOrUpdate(item);
835             }
836
837             // try to delete file
838
// try {
839
File diskFile =
840                 new File(Constants.FILEUPLOAD_SAVE_PATH + upload.getID() + ".up");
841             diskFile.delete();
842             HibernateUtil.delete(upload);
843
844             // forward to view item screen
845
HashMap JavaDoc forwardMap = new HashMap JavaDoc();
846             forwardMap.put("itemID", upload.getFolderItem().getID());
847             forwardMap.put("action", "showItem");
848             ctx.setForward("fileUpload", "interpretAction", forwardMap);
849         } catch (HibernateException he) {
850             ctx.setError("Error storing/reading data");
851             he.printStackTrace();
852             return;
853         }
854     }
855
856     public void editEntity(CoefficientContext ctx, Project project)
857         throws HibernateException {
858         HashMap JavaDoc map = new HashMap JavaDoc();
859         map.put("module", this);
860         map.put("project", project);
861
862         try {
863             // get the id
864
String JavaDoc entityID = ctx.getParameter("entityID");
865             long thisEntityID = 0;
866             try {
867                 thisEntityID = Long.parseLong(entityID);
868             } catch (Exception JavaDoc e) {
869                 ctx.setError("Badly formed entityID!");
870
871                 return;
872             }
873
874             // check the entity type and get the Entity
875
ProjectEntity entity = null;
876             ProjectFolder lastFolder;
877             boolean isItem = false;
878             String JavaDoc entityType = ctx.getParameter("entityType");
879
880             synchronized (this) {
881                 if (entityType.compareToIgnoreCase("item") == 0) {
882                     entity =
883                         (ProjectFolderItem) HibernateUtil.load(ProjectFolderItem.class,
884                             new Long JavaDoc(entityID));
885                     lastFolder = entity.getParentFolder();
886                     isItem = true;
887                 } else if (entityType.compareToIgnoreCase("folder") == 0) {
888                     entity =
889                         (ProjectFolder) HibernateUtil.load(ProjectFolder.class,
890                             new Long JavaDoc(entityID));
891                     lastFolder = (ProjectFolder) entity;
892                 } else {
893                     ctx.setError("Unknown entity type: '" + entityType + "'");
894
895                     return;
896                 }
897
898                 /**
899                  * Its possible that the url can be altered to access folders belonging
900                  * to other projects - we just need to check that the folder we've been
901                  * given matches the project
902                  */

903                 if (lastFolder.getProject()
904                               .getId()
905                               .longValue() != project.getId()
906                                                      .longValue()) {
907                     ctx.setError("Folder does not belong to this project!");
908
909                     return;
910                 }
911
912                 // check permissions
913
long maxReadRole = entity.getMaxReadRole()
914                                          .getRoleValue();
915                 long maxWriteRole = entity.getMaxWriteRole()
916                                           .getRoleValue();
917
918                 if (!isUserAllowed(ctx, maxReadRole)) {
919                     ctx.setError(
920                         "You don't have read permissions for this folder level of the project!");
921
922                     return;
923                 }
924                 if (!isUserAllowed(ctx, maxWriteRole)) {
925                     ctx.setError(
926                         "You don't have write permissions for this folder level of the project!");
927
928                     return;
929                 }
930
931                 String JavaDoc subAction = ctx.getParameter("subAction");
932                 if ((subAction != null)
933                     && (subAction.compareToIgnoreCase("save") == 0)) {
934                     if (ctx.getParameterAsLongPrimitive("version", 0) < entity
935                         .getVersion()) {
936                         throw new net.sf.hibernate.StaleObjectStateException(entity
937                             .getClass(), entity.getID());
938                     }
939
940                     entity.setUserComment(ctx.getParameter("comment"));
941                     entity.setName(ctx.getParameter("name"));
942                     entity.setMaxReadRole(SecurityUtil.getRoleForValue(
943                             Integer.parseInt(ctx.getParameter("maxReadRole"))));
944                     entity.setMaxWriteRole(SecurityUtil.getRoleForValue(
945                             Integer.parseInt(ctx.getParameter("maxWriteRole"))));
946                     HibernateUtil.saveOrUpdate(entity);
947
948                     // go back to browse
949
HashMap JavaDoc forwardMap = new HashMap JavaDoc();
950                     if (isItem) {
951                         forwardMap.put("itemID", entity.getID());
952                         forwardMap.put("action", "showItem");
953                     } else {
954                         forwardMap.put("folderID", lastFolder.getID());
955                         forwardMap.put("action", "browse");
956                     }
957                     ctx.setForward("fileUpload", "interpretAction", forwardMap);
958
959                     return;
960                 } else {
961                     // show edit entity form
962
map.put("roles",
963                         filterRoles(ctx.getCurrentUser(),
964                             SecurityUtil.getRoles(), project));
965                     map.put("entity", entity);
966                     map.put("entityType", entityType);
967                     StringBuffer JavaDoc sb =
968                         VelocityScreenUtil.getProcessedScreen("editEntity.vm",
969                             map);
970                     ctx.setModuleContent(sb.toString(), getModuleDisplayName());
971                 }
972             }
973
974             // end synchronization
975
} catch (HibernateException he) {
976             if (he instanceof net.sf.hibernate.StaleObjectStateException) {
977                 throw he;
978             }
979             ctx.setError("Error storing/reading data");
980             he.printStackTrace();
981
982             return;
983         }
984     }
985
986     /**
987      *
988      * This is a workflow utility method
989      */

990     public boolean hasCurrentUpload(CoefficientContext ctx)
991         throws HibernateException {
992         List JavaDoc items =
993             HibernateUtil.find("FROM " + ProjectFolderItem.class.getName()
994                 + " as item WHERE " + "item.name = ? AND "
995                 + "item.parentFolder.project.id= ? AND "
996                 + "item.parentFolder.ID = ?",
997                 new Object JavaDoc[] {
998                     ctx.getParameter("name"), ctx.getProject()
999                                                  .getId(), getRootFolderId(ctx)
1000                },
1001                new Type[] { Hibernate.STRING, Hibernate.LONG, Hibernate.LONG });
1002        if (items.size() == 0) {
1003            return false;
1004        }
1005        if (((ProjectFolderItem) items.get(0)).getCurrentVersion() != null) {
1006            return true;
1007        }
1008
1009        HibernateUtil.finalizeSession();
1010        return false;
1011    }
1012
1013    public CoefficientContext interpretAction(CoefficientContext ctx)
1014        throws HibernateException {
1015        Project project = ctx.getProject();
1016        if (project == null) {
1017            ctx.setError("No Project!");
1018            return ctx;
1019        }
1020
1021        String JavaDoc action = ctx.getParameter("action");
1022        if ((action == null) || (action.compareToIgnoreCase("browse") == 0)) {
1023            browse(ctx, project, true);
1024        } else if (action.compareToIgnoreCase("showItem") == 0) {
1025            showItem(ctx, project);
1026        } else if (action.compareToIgnoreCase("addEntity") == 0) {
1027            addEntity(ctx, project);
1028        } else if (action.compareToIgnoreCase("editEntity") == 0) {
1029            editEntity(ctx, project);
1030        } else if (action.compareToIgnoreCase("deleteEntity") == 0) {
1031            deleteEntity(ctx, project);
1032        } else if (action.compareToIgnoreCase("uploadFile") == 0) {
1033            uploadFile(ctx, project);
1034        } else if (action.compareToIgnoreCase("deleteFile") == 0) {
1035            deleteFile(ctx, project);
1036        } else if (action.compareToIgnoreCase("setCurrent") == 0) {
1037            setCurrent(ctx, project);
1038        } else {
1039            browse(ctx, project, true); // default action
1040
}
1041        return ctx;
1042    }
1043
1044    public void showItem(CoefficientContext ctx, Project project) {
1045        HashMap JavaDoc map = new HashMap JavaDoc();
1046        map.put("module", this);
1047        map.put("project", project);
1048
1049        try {
1050            ProjectFolderItem thisItem = null;
1051            long thisFolderItemID = 0;
1052            try {
1053                thisFolderItemID = Long.parseLong(ctx.getParameter("itemID"));
1054            } catch (Exception JavaDoc e) {
1055                ctx.setError("Badly formatted itemID!");
1056
1057                return;
1058            }
1059            thisItem =
1060                (ProjectFolderItem) HibernateUtil.load(ProjectFolderItem.class,
1061                    new Long JavaDoc(thisFolderItemID));
1062
1063            // check if folder exists
1064
if (thisItem == null) {
1065                ctx.setError("Folder Item does not exist!");
1066
1067                return;
1068            }
1069
1070            // check if user can view folder
1071
if (!(isUserAllowed(ctx, thisItem.getMaxReadRole().getRoleValue()))) {
1072                ctx.setError(
1073                    "You do not have permission to view this folder/item!");
1074
1075                return;
1076            }
1077
1078            /**
1079             * Its possible that the url can be altered to access folders belonging
1080             * to other projects - we just need to check that the folder we've been
1081             * given matches the project
1082             */

1083            if (thisItem.getParentFolder()
1084                        .getProject()
1085                        .getId()
1086                        .longValue() != project.getId()
1087                                               .longValue()) {
1088                ctx.setError("Folder Item does not belong to this project!");
1089
1090                return;
1091            }
1092
1093            // get project uploads
1094
List JavaDoc uploads =
1095                HibernateUtil.find("FROM " + ProjectUpload.class.getName()
1096                    + " as upload WHERE "
1097                    + "upload.folderItem.ID = ? ORDER BY upload.ID DESC",
1098                    thisItem.getID(), Hibernate.LONG);
1099            map.put("uploads", uploads);
1100
1101            map.put("thisItem", thisItem);
1102            map.put("canWrite",
1103                new Integer JavaDoc(isUserAllowed(ctx,
1104                        thisItem.getMaxWriteRole().getRoleValue()) ? 1 : 0));
1105
1106            // get full path and put in context
1107
String JavaDoc fullpath =
1108                getFullPathForFolder(thisItem.getParentFolder(), "");
1109            fullpath += thisItem.getName(); // remove traling slash
1110
map.put("fullpath", fullpath);
1111            map.put("dateFormat",
1112                    new java.text.SimpleDateFormat JavaDoc(Constants.SYSTEM_DATE_FORMAT));
1113            
1114            // make browse screen
1115
StringBuffer JavaDoc sb =
1116                VelocityScreenUtil.getProcessedScreen("viewItem.vm", map);
1117            ctx.setModuleContent(sb.toString(), getModuleDisplayName());
1118        } catch (HibernateException he) {
1119            ctx.setError("Error storing/reading data");
1120            he.printStackTrace();
1121
1122            return;
1123        }
1124    }
1125
1126    /**
1127     *
1128     * This is a workflow utility method
1129     */

1130    public CoefficientContext unsetCurrentUpload(CoefficientContext ctx)
1131        throws HibernateException {
1132        List JavaDoc items =
1133            HibernateUtil.find("FROM " + ProjectFolderItem.class.getName()
1134                + " as item WHERE " + "item.name = ? AND "
1135                + "item.parentFolder.project.id= ? AND "
1136                + "item.parentFolder.ID = ?",
1137                new Object JavaDoc[] {
1138                    ctx.getParameter("name"), ctx.getProject()
1139                                                 .getId(), getRootFolderId(ctx)
1140                },
1141                new Type[] { Hibernate.STRING, Hibernate.LONG, Hibernate.LONG });
1142        if (items.size() == 0) {
1143            return ctx;
1144        }
1145        ProjectFolderItem item = ((ProjectFolderItem) items.get(0));
1146        item.setCurrentVersion(null);
1147        HibernateUtil.saveOrUpdate(item);
1148        return ctx;
1149    }
1150
1151    public void uploadFile(CoefficientContext ctx, Project project) {
1152        HashMap JavaDoc map = new HashMap JavaDoc();
1153        map.put("module", this);
1154        map.put("project", project);
1155
1156        try {
1157            ProjectFolderItem thisItem = null;
1158            ProjectFolder parentFolder = null;
1159            Long JavaDoc thisFolderItemID = null;
1160            Long JavaDoc parentFolderId = null;
1161
1162            List JavaDoc uploads = new ArrayList JavaDoc();
1163            try {
1164                thisFolderItemID = ctx.getParameterAsLong("itemID");
1165                if(thisFolderItemID == null) {
1166                    parentFolderId = ctx.getParameterAsLong("parentFolderID");
1167                    if(parentFolderId == null) {
1168                        ctx.setError("No item id or parent folder id provided!");
1169                        return;
1170                    }
1171                }
1172            } catch (Exception JavaDoc e) {
1173                ctx.setError("Why the hell am I here??!!");
1174                e.printStackTrace();
1175                return;
1176            }
1177            if(thisFolderItemID != null) {
1178                thisItem =
1179                    (ProjectFolderItem) HibernateUtil.load(ProjectFolderItem.class,
1180                                                     thisFolderItemID);
1181                // check if folder exists
1182
if (thisItem == null) {
1183                    ctx.setError("Folder Item does not exist!");
1184                    
1185                    return;
1186                }
1187                // check if user can view item
1188
if (!(isUserAllowed(ctx, thisItem.getMaxReadRole().getRoleValue()))) {
1189                    ctx.setError("You do not have permission to view this item!");
1190
1191                    return;
1192                }
1193
1194                // check if user can write to item
1195
if (!(isUserAllowed(ctx, thisItem.getMaxReadRole().getRoleValue()))) {
1196                    ctx.setError(
1197                                 "You do not have permission to write to this item!");
1198
1199                    return;
1200                }
1201
1202                /**
1203                 * Its possible that the url can be altered to access folders belonging
1204                 * to other projects - we just need to check that the folder we've been
1205                 * given matches the project
1206                 */

1207                if (thisItem.getParentFolder()
1208                    .getProject()
1209                    .getId()
1210                    .longValue() != project.getId()
1211                    .longValue()) {
1212                    ctx.setError("Folder Item does not belong to this project!");
1213
1214                    return;
1215                }
1216                // get last project uploads
1217
uploads = HibernateUtil.find("FROM " + ProjectUpload.class.getName()
1218                  + " as upload WHERE "
1219                  + "upload.folderItem.ID = ? order by upload.timestamp DESC",
1220                  thisItem.getID(), Hibernate.LONG);
1221
1222            } else {
1223                parentFolder = (ProjectFolder)HibernateUtil.load(ProjectFolder.class,
1224                                                           parentFolderId);
1225                map.put("parentFolder", parentFolder);
1226                map.put("roles", filterRoles(ctx.getCurrentUser(),
1227                                             SecurityUtil.getRoles(), project));
1228            }
1229
1230            ProjectUpload lastUpload = null;
1231            if (uploads.size() > 0) {
1232                lastUpload = (ProjectUpload) uploads.get(0);
1233            }
1234            double lastVer = 0.0;
1235            if (lastUpload != null) {
1236                lastVer = lastUpload.getVersion();
1237            }
1238
1239            String JavaDoc subAction = ctx.getParameter("subAction");
1240
1241            if ((subAction != null)
1242                && (subAction.compareToIgnoreCase("save") == 0)) {
1243
1244                boolean newItem = false;
1245                BaseMultipartRequest request = null;
1246                try {
1247                    request = ctx.getMultipartRequest();
1248                } catch (FileUploadException fe) {
1249                    ctx.setError(
1250                        "Error getting mutlipart request - file cannot be uploaded!");
1251
1252                    return;
1253                }
1254
1255                // work out version
1256
String JavaDoc revision = request.getParameter("version");
1257                double thisVersion = lastVer;
1258                if (revision.compareToIgnoreCase("minor") == 0) {
1259                    thisVersion += 0.1;
1260                } else if (revision.compareToIgnoreCase("major") == 0) {
1261                    thisVersion += 1.0;
1262                } else {
1263                    try {
1264                        String JavaDoc manVer =
1265                            trimToOneDecimalPlace(request.getParameter(
1266                                    "manualVer"));
1267                        thisVersion = Double.parseDouble(manVer);
1268                        if (manVer.compareTo("" + thisVersion) != 0) {
1269                            thisVersion += 0.1; // to make up for loss of significance from parsing
1270
}
1271                    } catch (NumberFormatException JavaDoc e) {
1272                        ctx.setError("Bad version!");
1273
1274                        return;
1275                    }
1276                }
1277
1278                ProjectUpload upload = new ProjectUpload();
1279                UploadedFile file = null;
1280                try {
1281                    file = request.getFileParameter("upload");
1282                } catch (FileUploadException fue) {
1283                    ctx.setError("Error uploading file!");
1284
1285                    return;
1286                }
1287                byte[] content = file.getContent();
1288                if (content.length == 0) {
1289                    ctx.setError("Empty file!");
1290
1291                    return;
1292                }
1293
1294                // If the item does not yet exist we need to create it
1295
if(thisItem == null) {
1296                    thisItem = new ProjectFolderItem();
1297                    thisItem.setUserComment(ctx.getParameter("comment"));
1298                    thisItem.setMaxReadRole(SecurityUtil.getRoleForValue(
1299                            Integer.parseInt(ctx.getParameter("maxReadRole"))));
1300                    thisItem.setMaxWriteRole(SecurityUtil.getRoleForValue(
1301                            Integer.parseInt(ctx.getParameter("maxWriteRole"))));
1302                    thisItem.setName(ctx.getParameter("title"));
1303                    thisItem.setParentFolder(parentFolder);
1304                    thisItem.setCoefficientUser(ctx.getCurrentUser());
1305
1306                    // Persist
1307
HibernateUtil.saveOrUpdate(thisItem);
1308                    newItem = true;
1309                }
1310
1311
1312                Locale JavaDoc language = new Locale JavaDoc(ctx.getParameter("language"));
1313                upload.setLanguage(language);
1314                upload.setUrl(ctx.getParameter("url"));
1315                upload.setShowUploader("on".equals(ctx.getParameter("show_name")));
1316                upload.setFileSize(content.length);
1317                upload.setFolderItem(thisItem);
1318                upload.setUserComment(request.getParameter("comment"));
1319                upload.setMimeType(file.getContentType());
1320                upload.setCoefficientUser(ctx.getCurrentUser());
1321                upload.setVersion(thisVersion);
1322                upload.setFilename(file.getFilename());
1323
1324                // save the data
1325
/* // Data now saved to files... not database
1326                           UploadData data = new UploadData();
1327                           data.setData(content);
1328                           data.setProjectUpload(upload);
1329                           HibernateUtil.save(data);
1330                */

1331                HibernateUtil.save(upload);
1332
1333                try {
1334                    if (Constants.FILEUPLOAD_SAVE_PATH.compareTo("?") == 0) {
1335                        ctx.setError(
1336                            "The server is not properly configured for file uploads! The path to save files to has not been specified! Contact site administrator.");
1337
1338                        return;
1339                    }
1340                    File diskFile =
1341                        new File(Constants.FILEUPLOAD_SAVE_PATH
1342                            + upload.getID() + ".up");
1343                    File pathFile = new File(Constants.FILEUPLOAD_SAVE_PATH);
1344
1345                    if (!(pathFile.exists() || pathFile.mkdirs())
1346                        || (!diskFile.createNewFile())) {
1347                        ctx.setError(
1348                            "Could not create the file on the server! Contact site administrator.");
1349
1350                        return;
1351                    }
1352                    FileOutputStream JavaDoc out = new FileOutputStream JavaDoc(diskFile);
1353                    out.write(content);
1354                    out.flush();
1355                    out.close();
1356                } catch (IOException JavaDoc e) {
1357                    HibernateUtil.delete(upload);
1358                    if(newItem) {
1359                        HibernateUtil.delete(thisItem);
1360                    }
1361                    e.printStackTrace();
1362                    ctx.setError("Unable to save file to disk! Contact site administrator.");
1363                    return;
1364                }
1365
1366                // update current version for item
1367
thisItem.setCurrentVersion(upload);
1368                HibernateUtil.saveOrUpdate(thisItem);
1369
1370                HashMap JavaDoc forwardMap = new HashMap JavaDoc();
1371                forwardMap.put("itemID", thisItem.getID());
1372                forwardMap.put("action", "showItem");
1373                ctx.setForward("fileUpload", "interpretAction", forwardMap);
1374
1375                return;
1376            } else {
1377                String JavaDoc nextVer = trimToOneDecimalPlace("" + (lastVer + 0.1));
1378                if (nextVer.compareTo(trimToOneDecimalPlace("" + lastVer)) == 0) {
1379                    nextVer = trimToOneDecimalPlace("" + (lastVer + 0.2));
1380                }
1381                map.put("nextVer", nextVer);
1382                map.put("maxSize",
1383                    getSizeString(Integer.parseInt(
1384                            Constants.MAX_FILE_UPLOAD_SIZE_BYTES)));
1385                map.put("thisItem", thisItem);
1386
1387                TreeMap JavaDoc languages = new TreeMap JavaDoc();
1388                Locale JavaDoc [] locales = Locale.getAvailableLocales();
1389                for(int i = 0; i < locales.length; i++) {
1390                    languages.put(locales[i].getDisplayLanguage(), locales[i].getLanguage());
1391                }
1392                map.put("languages", languages);
1393                map.put("defaultLang", Locale.getDefault().getDisplayLanguage());
1394
1395                // get full path and put in context
1396
String JavaDoc fullpath = null;
1397                if(thisItem == null) {
1398                    fullpath = getFullPathForFolder(parentFolder, "");
1399                } else {
1400                    fullpath = getFullPathForFolder(thisItem.getParentFolder(), "");
1401                    fullpath += thisItem.getName(); // remove traling slash
1402
}
1403                map.put("fullpath", fullpath);
1404
1405                StringBuffer JavaDoc sb =
1406                    VelocityScreenUtil.getProcessedScreen("upload.vm", map);
1407                ctx.setModuleContent(sb.toString(), getModuleDisplayName());
1408            }
1409        } catch (HibernateException he) {
1410            ctx.setError("Error storing/reading data");
1411            he.printStackTrace();
1412
1413            return;
1414        }
1415    }
1416
1417    protected CoefficientContext showFileSelectScreen(CoefficientContext ctx) {
1418        // Get html content
1419
HashMap JavaDoc map = new HashMap JavaDoc();
1420        map.put("module", this);
1421        StringBuffer JavaDoc sb = VelocityScreenUtil.getProcessedScreen("test.vm", map);
1422
1423        // Set the html into the context
1424
ctx.setModuleContent(sb.toString(), getModuleDisplayName());
1425        return ctx;
1426    }
1427
1428    /**
1429     * method to recursively get the full pathname of a projectfolder
1430     */

1431    private String JavaDoc getFullPathForFolder(ProjectFolder folder, String JavaDoc path) {
1432        path = folder.getName() + "/" + path;
1433        if (folder.getParentFolder() == null) {
1434            return path;
1435        }
1436        path = getFullPathForFolder(folder.getParentFolder(), path);
1437
1438        return path;
1439    }
1440
1441    private boolean isUserAllowed(CoefficientContext ctx, long maxAllowedRole) {
1442        if (ctx.getCurrentUser() == null) {
1443            if (SecurityUtil.getRoleForDescription(SecurityUtil.GUEST_ROLE_DESC)
1444                            .getRoleValue() <= maxAllowedRole) {
1445                return true;
1446            } else {
1447                return false;
1448            }
1449        }
1450        long maxRole =
1451            SecurityUtil.getHighestRoleForUser(ctx.getCurrentUser(),
1452                ctx.getProject())
1453                        .getRoleValue();
1454        if (maxRole > maxAllowedRole) {
1455            return false;
1456        } else {
1457            return true;
1458        }
1459    }
1460
1461    private void deleteProjectFolder(Long JavaDoc ID)
1462        throws HibernateException, IOException JavaDoc {
1463        ProjectFolder folder =
1464            (ProjectFolder) HibernateUtil.load(ProjectFolder.class, ID);
1465
1466        // get Project uploads
1467
List JavaDoc items =
1468            HibernateUtil.find("FROM " + ProjectFolderItem.class.getName()
1469                + " as item WHERE " + "item.parentFolder.ID = ?", ID,
1470                Hibernate.LONG);
1471        for (Iterator JavaDoc i = items.iterator(); i.hasNext();) {
1472            deleteProjectFolderItem(((ProjectFolderItem) i.next()).getID());
1473        }
1474
1475        // get subfolders
1476
List JavaDoc subFolders =
1477            HibernateUtil.find("FROM " + ProjectFolder.class.getName()
1478                + " as subfolder WHERE " + "subfolder.parentFolder.ID = ?", ID,
1479                Hibernate.LONG);
1480        for (Iterator JavaDoc i = subFolders.iterator(); i.hasNext();) {
1481            deleteProjectFolder(((ProjectFolder) i.next()).getID());
1482        }
1483        HibernateUtil.delete(folder);
1484    }
1485
1486    private void deleteProjectFolderItem(Long JavaDoc ID)
1487        throws HibernateException, IOException JavaDoc {
1488        ProjectFolderItem item =
1489            (ProjectFolderItem) HibernateUtil.load(ProjectFolderItem.class, ID);
1490
1491        // get Project uploads
1492
List JavaDoc uploads =
1493            HibernateUtil.find("FROM " + ProjectUpload.class.getName()
1494                + " as upload WHERE " + "upload.folderItem.ID = ?", ID,
1495                Hibernate.LONG);
1496        // to avoid any fk constraint violations
1497
item.setCurrentVersion(null);
1498        HibernateUtil.saveOrUpdate(item);
1499        for (Iterator JavaDoc i = uploads.iterator(); i.hasNext();) {
1500            ProjectUpload upload = (ProjectUpload) i.next();
1501            File diskFile =
1502                new File(Constants.FILEUPLOAD_SAVE_PATH + upload.getID()
1503                    + ".up");
1504            diskFile.delete();
1505            HibernateUtil.delete(upload);
1506        }
1507        HibernateUtil.delete(item);
1508    }
1509
1510    private List JavaDoc filterRoles(CoefficientUser user, List JavaDoc roles, Project project) {
1511        if (user == null) {
1512            return null;
1513        }
1514
1515        ArrayList JavaDoc filteredRoles = new ArrayList JavaDoc(roles);
1516
1517        long highestRole =
1518            SecurityUtil.getHighestRoleForUser(user, project)
1519                        .getRoleValue();
1520        for (Iterator JavaDoc i = roles.iterator(); i.hasNext();) {
1521            Role role = (Role) i.next();
1522            if (role.getRoleValue() < highestRole) {
1523                filteredRoles.remove(role);
1524            }
1525        }
1526
1527        return filteredRoles;
1528    }
1529
1530    private String JavaDoc trimToOneDecimalPlace(String JavaDoc floatString) {
1531        int pos = floatString.lastIndexOf(".");
1532
1533        return floatString.substring(0, pos + 2);
1534    }
1535}
1536
Popular Tags