1 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 ; 45 import java.io.FileOutputStream ; 46 import java.io.FileInputStream ; 47 import java.io.IOException ; 48 49 import java.util.HashMap ; 50 import java.util.TreeMap ; 51 import java.util.Iterator ; 52 import java.util.List ; 53 import java.util.Locale ; 54 import java.util.Arrays ; 55 import java.util.ArrayList ; 56 57 71 public class FileUpload extends BaseProjectModule { 72 74 static { 75 try { 76 Class [] 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 92 public String getMainMethod() { 93 return "interpretAction"; 95 } 96 97 public String getModuleDescription() { 98 return "For file uploads/downloads related to projects"; 99 } 100 101 public String getModuleDisplayName() { 102 return "File Upload"; 103 } 104 105 public String getSummaryForProject(CoefficientContext ctx) 106 throws Exception { 107 108 Session sess = HibernateUtil.getSession(); 109 Integer folderCnt = 111 (Integer )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 if(folderCnt.intValue() != 0) { 119 folderCnt = new Integer (folderCnt.intValue() - 1); 120 } 121 122 Integer uploadCnt = 124 (Integer )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 HibernateUtil.finalizeSession(); 133 Long parentFolderID = getRootFolderId(ctx); 135 136 HashMap map = new HashMap (); 137 map.put("parentFolderID", parentFolderID); 138 map.put("folderCnt", folderCnt); 139 map.put("uploadCnt", uploadCnt); 140 map.put("projectName", ProjectConstants.PROJECT_NAME); 141 StringBuffer sb = 142 VelocityScreenUtil.getProcessedScreen("getSummaryForProject.vm", map); 143 return sb.toString(); 144 } 145 146 public CoefficientContext showSummaryForProject(CoefficientContext ctx) 147 throws Exception { 148 HashMap map = new HashMap (); 149 map.put("content", getSummaryForProject(ctx)); 150 StringBuffer 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 retVal = (Integer ) 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 HibernateUtil.finalizeSession(); 167 return retVal.intValue(); 168 } 169 170 public void setCurrent(CoefficientContext ctx, Project project) 171 throws HibernateException { 172 try { 173 long thisItemID = 0; 175 try { 176 thisItemID = Long.parseLong(ctx.getParameter("itemID")); 177 } catch (Exception 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 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 (thisItemID)); 196 197 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 if (ctx.getParameterAsLongPrimitive("version", 0) < item 217 .getVersion()) { 218 throw new net.sf.hibernate.StaleObjectStateException(item 219 .getClass(), item.getID()); 220 } 221 222 ProjectUpload upload = 224 (ProjectUpload) HibernateUtil.load(ProjectUpload.class, 225 new Long (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 HashMap forwardMap = new HashMap (); 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 261 public Long getRootFolderId(CoefficientContext ctx) 262 throws HibernateException { 263 browse(ctx, ctx.getProject(), false); 265 266 List 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 278 public String getSizeString(int fileSize) { 279 String 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 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 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 inS = new FileInputStream (diskFile); 333 inS.read(data); 334 inS.close(); 335 } catch (Exception e) { 336 e.printStackTrace(); 337 throw new RuntimeException ("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 e) { 346 e.printStackTrace(); 347 return null; 348 } 349 } 350 351 public String getUploadVersionString(ProjectUpload upload) { 352 return trimToOneDecimalPlace("" + upload.getVersion()); 353 } 354 355 public void addEntity(CoefficientContext ctx, Project project) { 356 HashMap map = new HashMap (); 357 map.put("module", this); 358 map.put("project", project); 359 360 try { 361 ProjectFolder parentFolder = null; 363 String parentFolderID = ctx.getParameter("parentFolderID"); 364 if ((parentFolderID == null) 365 || (parentFolderID.compareToIgnoreCase("") == 0)) { List 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 if (rootFolders.size() > 0) { 374 ctx.setError("Root folder already exists for this project!"); 375 376 return; 377 } 378 } else { long thisParentFolderID = 0; 380 try { 381 thisParentFolderID = Long.parseLong(parentFolderID); 382 } catch (Exception e) { 383 ctx.setError("Badly formatted parentFolderID!"); 384 385 return; 386 } 387 parentFolder = 388 (ProjectFolder) HibernateUtil.load(ProjectFolder.class, 389 new Long (thisParentFolderID)); 390 } 391 392 if ((parentFolder == null) && (parentFolderID != null) 394 && (parentFolderID.compareToIgnoreCase("") != 0)) { 395 ctx.setError("Specified Parent Folder does not exist!"); 396 397 return; 398 } 399 400 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 Role championRole = 417 SecurityUtil.getRoleForDescription(SecurityUtil.PROJECT_CHAMPION_ROLE_DESC); 418 long maxReadRole = championRole.getRoleValue(); long maxWriteRole = championRole.getRoleValue(); 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 String entityType = ctx.getParameter("entityType"); 442 if (entityType == null) { 443 entityType = "folder"; } 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 subAction = ctx.getParameter("subAction"); 459 if ((subAction != null) 460 && (subAction.compareToIgnoreCase("create") == 0)) { 461 ProjectEntity lastFolder; 463 if (entityType.compareToIgnoreCase("folder") == 0) { 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 HibernateUtil.saveOrUpdate(folder); 476 lastFolder = folder; 477 } else { 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 HibernateUtil.saveOrUpdate(item); 490 lastFolder = parentFolder; 491 } 492 493 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 HashMap forwardMap = new HashMap (); 502 forwardMap.put("folderID", 503 ((lastFolder == null) ? null : lastFolder.getID())); 504 forwardMap.put("action", "browse"); 505 ctx.setForward("fileUpload", "interpretAction", forwardMap); 506 507 513 } else { 514 map.put("roles", 516 filterRoles(ctx.getCurrentUser(), SecurityUtil.getRoles(), 517 project)); 518 map.put("parentFolder", parentFolder); 519 map.put("entityType", entityType); 520 StringBuffer 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 map = new HashMap (); 536 map.put("module", this); 537 map.put("project", project); 538 539 try { 540 ProjectFolder thisFolder = null; 542 String folderID = ctx.getParameter("folderID"); 543 if ((folderID == null) || (folderID.compareToIgnoreCase("") == 0)) { List 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 if (rootFolders.size() > 1) { 552 ctx.setError("Project contains more than one root folder!"); 553 554 return; 555 } 556 if (rootFolders.size() == 0) { 558 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 { long thisFolderID = 0; 576 try { 577 thisFolderID = Long.parseLong(folderID); 578 } catch (Exception e) { 579 ctx.setError("Badly formatted folderID!"); 580 581 return; 582 } 583 thisFolder = 584 (ProjectFolder) HibernateUtil.load(ProjectFolder.class, 585 new Long (thisFolderID)); 586 } 587 588 if (thisFolder == null) { 590 ctx.setError("Folder does not exist!"); 591 592 return; 593 } 594 595 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 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 List 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 List 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 (isUserAllowed(ctx, 650 thisFolder.getMaxWriteRole().getRoleValue()) ? 1 : 0)); 651 652 String fullpath = getFullPathForFolder(thisFolder, ""); 654 fullpath = fullpath.substring(0, fullpath.length() - 1); map.put("fullpath", fullpath); 656 657 if(showScreen) { 658 StringBuffer 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 canExecuteForRole(CoefficientContext ctx, String methodName, 672 Role usersHighestRole) { 673 return null; 674 } 675 676 680 public CoefficientContext createRootFolderItemIfNotExist(CoefficientContext ctx) 681 throws HibernateException { 682 browse(ctx, ctx.getProject(), true); 684 List 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 List items = 693 HibernateUtil.find("FROM " + ProjectFolderItem.class.getName() 694 + " as item WHERE " + "item.parentFolder.ID = ? AND " 695 + "item.name = ?", 696 new Object [] { 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 { 713 try { 714 List 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 e) { 737 ctx.setError("Badly formatted entityID!"); 738 739 return; 740 } 741 742 boolean isItem = false; 743 synchronized (this) { 744 String entityType = ctx.getParameter("entityType"); 745 if (entityType.compareToIgnoreCase("item") == 0) { 746 entity = 747 (ProjectFolderItem) HibernateUtil.load(ProjectFolderItem.class, 748 new Long (entityID)); 749 isItem = true; 750 } else if (entityType.compareToIgnoreCase("folder") == 0) { 751 entity = 752 (ProjectFolder) HibernateUtil.load(ProjectFolder.class, 753 new Long (entityID)); 754 } else { 755 ctx.setError("Unknown entity type: '" + entityType + "'"); 756 757 return; 758 } 759 760 ProjectFolder lastFolder = entity.getParentFolder(); 761 762 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 try { 778 if (isItem) { 779 deleteProjectFolderItem(entity.getID()); 780 } else { 781 deleteProjectFolder(entity.getID()); 782 } 783 } catch (IOException e) { 784 ctx.setError("Could not delete file on server!"); 785 e.printStackTrace(); 786 787 return; 788 } 789 790 791 HashMap forwardMap = new HashMap (); 793 forwardMap.put("folderID", 794 ((lastFolder == null) ? null : lastFolder.getID())); 795 forwardMap.put("action", "browse"); 796 ctx.setForward("fileUpload", "interpretAction", forwardMap); 797 } 798 799 } 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 e) { 818 ctx.setError("Badly formatted uploadID!"); 819 return; 820 } 821 upload = (ProjectUpload) HibernateUtil.load(ProjectUpload.class, new Long (thisFileID)); 822 823 if (!(isUserAllowed(ctx, upload.getFolderItem().getMaxWriteRole().getRoleValue()))) { 825 ctx.setError("You do not have permission to delete this file!"); 826 return; 827 } 828 829 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 File diskFile = 840 new File(Constants.FILEUPLOAD_SAVE_PATH + upload.getID() + ".up"); 841 diskFile.delete(); 842 HibernateUtil.delete(upload); 843 844 HashMap forwardMap = new HashMap (); 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 map = new HashMap (); 859 map.put("module", this); 860 map.put("project", project); 861 862 try { 863 String entityID = ctx.getParameter("entityID"); 865 long thisEntityID = 0; 866 try { 867 thisEntityID = Long.parseLong(entityID); 868 } catch (Exception e) { 869 ctx.setError("Badly formed entityID!"); 870 871 return; 872 } 873 874 ProjectEntity entity = null; 876 ProjectFolder lastFolder; 877 boolean isItem = false; 878 String 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 (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 (entityID)); 891 lastFolder = (ProjectFolder) entity; 892 } else { 893 ctx.setError("Unknown entity type: '" + entityType + "'"); 894 895 return; 896 } 897 898 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 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 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 HashMap forwardMap = new HashMap (); 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 map.put("roles", 963 filterRoles(ctx.getCurrentUser(), 964 SecurityUtil.getRoles(), project)); 965 map.put("entity", entity); 966 map.put("entityType", entityType); 967 StringBuffer sb = 968 VelocityScreenUtil.getProcessedScreen("editEntity.vm", 969 map); 970 ctx.setModuleContent(sb.toString(), getModuleDisplayName()); 971 } 972 } 973 974 } 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 990 public boolean hasCurrentUpload(CoefficientContext ctx) 991 throws HibernateException { 992 List 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 [] { 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 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); } 1041 return ctx; 1042 } 1043 1044 public void showItem(CoefficientContext ctx, Project project) { 1045 HashMap map = new HashMap (); 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 e) { 1055 ctx.setError("Badly formatted itemID!"); 1056 1057 return; 1058 } 1059 thisItem = 1060 (ProjectFolderItem) HibernateUtil.load(ProjectFolderItem.class, 1061 new Long (thisFolderItemID)); 1062 1063 if (thisItem == null) { 1065 ctx.setError("Folder Item does not exist!"); 1066 1067 return; 1068 } 1069 1070 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 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 List 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 (isUserAllowed(ctx, 1104 thisItem.getMaxWriteRole().getRoleValue()) ? 1 : 0)); 1105 1106 String fullpath = 1108 getFullPathForFolder(thisItem.getParentFolder(), ""); 1109 fullpath += thisItem.getName(); map.put("fullpath", fullpath); 1111 map.put("dateFormat", 1112 new java.text.SimpleDateFormat (Constants.SYSTEM_DATE_FORMAT)); 1113 1114 StringBuffer 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 1130 public CoefficientContext unsetCurrentUpload(CoefficientContext ctx) 1131 throws HibernateException { 1132 List 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 [] { 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 map = new HashMap (); 1153 map.put("module", this); 1154 map.put("project", project); 1155 1156 try { 1157 ProjectFolderItem thisItem = null; 1158 ProjectFolder parentFolder = null; 1159 Long thisFolderItemID = null; 1160 Long parentFolderId = null; 1161 1162 List uploads = new ArrayList (); 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 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 if (thisItem == null) { 1183 ctx.setError("Folder Item does not exist!"); 1184 1185 return; 1186 } 1187 if (!(isUserAllowed(ctx, thisItem.getMaxReadRole().getRoleValue()))) { 1189 ctx.setError("You do not have permission to view this item!"); 1190 1191 return; 1192 } 1193 1194 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 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 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 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 String 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 manVer = 1265 trimToOneDecimalPlace(request.getParameter( 1266 "manualVer")); 1267 thisVersion = Double.parseDouble(manVer); 1268 if (manVer.compareTo("" + thisVersion) != 0) { 1269 thisVersion += 0.1; } 1271 } catch (NumberFormatException 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(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 HibernateUtil.saveOrUpdate(thisItem); 1308 newItem = true; 1309 } 1310 1311 1312 Locale language = new Locale (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 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 out = new FileOutputStream (diskFile); 1353 out.write(content); 1354 out.flush(); 1355 out.close(); 1356 } catch (IOException 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 thisItem.setCurrentVersion(upload); 1368 HibernateUtil.saveOrUpdate(thisItem); 1369 1370 HashMap forwardMap = new HashMap (); 1371 forwardMap.put("itemID", thisItem.getID()); 1372 forwardMap.put("action", "showItem"); 1373 ctx.setForward("fileUpload", "interpretAction", forwardMap); 1374 1375 return; 1376 } else { 1377 String 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 languages = new TreeMap (); 1388 Locale [] 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 String fullpath = null; 1397 if(thisItem == null) { 1398 fullpath = getFullPathForFolder(parentFolder, ""); 1399 } else { 1400 fullpath = getFullPathForFolder(thisItem.getParentFolder(), ""); 1401 fullpath += thisItem.getName(); } 1403 map.put("fullpath", fullpath); 1404 1405 StringBuffer 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 HashMap map = new HashMap (); 1420 map.put("module", this); 1421 StringBuffer sb = VelocityScreenUtil.getProcessedScreen("test.vm", map); 1422 1423 ctx.setModuleContent(sb.toString(), getModuleDisplayName()); 1425 return ctx; 1426 } 1427 1428 1431 private String getFullPathForFolder(ProjectFolder folder, String 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 ID) 1462 throws HibernateException, IOException { 1463 ProjectFolder folder = 1464 (ProjectFolder) HibernateUtil.load(ProjectFolder.class, ID); 1465 1466 List items = 1468 HibernateUtil.find("FROM " + ProjectFolderItem.class.getName() 1469 + " as item WHERE " + "item.parentFolder.ID = ?", ID, 1470 Hibernate.LONG); 1471 for (Iterator i = items.iterator(); i.hasNext();) { 1472 deleteProjectFolderItem(((ProjectFolderItem) i.next()).getID()); 1473 } 1474 1475 List subFolders = 1477 HibernateUtil.find("FROM " + ProjectFolder.class.getName() 1478 + " as subfolder WHERE " + "subfolder.parentFolder.ID = ?", ID, 1479 Hibernate.LONG); 1480 for (Iterator i = subFolders.iterator(); i.hasNext();) { 1481 deleteProjectFolder(((ProjectFolder) i.next()).getID()); 1482 } 1483 HibernateUtil.delete(folder); 1484 } 1485 1486 private void deleteProjectFolderItem(Long ID) 1487 throws HibernateException, IOException { 1488 ProjectFolderItem item = 1489 (ProjectFolderItem) HibernateUtil.load(ProjectFolderItem.class, ID); 1490 1491 List uploads = 1493 HibernateUtil.find("FROM " + ProjectUpload.class.getName() 1494 + " as upload WHERE " + "upload.folderItem.ID = ?", ID, 1495 Hibernate.LONG); 1496 item.setCurrentVersion(null); 1498 HibernateUtil.saveOrUpdate(item); 1499 for (Iterator 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 filterRoles(CoefficientUser user, List roles, Project project) { 1511 if (user == null) { 1512 return null; 1513 } 1514 1515 ArrayList filteredRoles = new ArrayList (roles); 1516 1517 long highestRole = 1518 SecurityUtil.getHighestRoleForUser(user, project) 1519 .getRoleValue(); 1520 for (Iterator 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 trimToOneDecimalPlace(String floatString) { 1531 int pos = floatString.lastIndexOf("."); 1532 1533 return floatString.substring(0, pos + 2); 1534 } 1535} 1536 | Popular Tags |