1 // 2 // $Id$ 3 // 4 // jupload - A file upload applet. 5 // 6 // Copyright 2010 The JUpload Team 7 // 8 // Created: 27 janv. 2010 9 // Creator: etienne_sf 10 // Last modified: $Date$ 11 // 12 // This program is free software; you can redistribute it and/or modify 13 // it under the terms of the GNU General Public License as published by 14 // the Free Software Foundation; either version 2 of the License, or 15 // (at your option) any later version. 16 // 17 // This program is distributed in the hope that it will be useful, 18 // but WITHOUT ANY WARRANTY; without even the implied warranty of 19 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 // GNU General Public License for more details. 21 // 22 // You should have received a copy of the GNU General Public License 23 // along with this program; if not, write to the Free Software 24 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 25 26 package wjhk.jupload2.upload; 27 28 import java.util.ArrayList; 29 30 import wjhk.jupload2.policies.UploadPolicy; 31 32 /** 33 * This file contains a packet of files, which will be sent in one request to 34 * the server. 35 * 36 * @author etienne_sf 37 */ 38 @SuppressWarnings("serial") 39 public class UploadFilePacket extends ArrayList<UploadFileData> { 40 41 /** 42 * The uploadPolicy, useful to get the max number of files and max packet 43 * size ... and perhaps other parameters in the future. 44 */ 45 UploadPolicy uploadPolicy = null; 46 47 /** 48 * The sum of the size of all files in the packet. 49 */ 50 long nbBytes = 0; 51 52 /** The maximum number of bytes in one packet to the server */ 53 long maxNbBytes = -1; 54 55 /** The maximum number of files in one packet to the server */ 56 long maxNbFiles = -1; 57 58 /** 59 * The standard constructor. 60 * 61 * @param uploadPolicy 62 */ 63 UploadFilePacket(UploadPolicy uploadPolicy) { 64 // nbFilesPerRequest may be very very big. Let's have a more realistic 65 // value, in this case (to avoid outOfMemoryError) 66 super(Math.min(uploadPolicy.getNbFilesPerRequest(), uploadPolicy 67 .getContext().getUploadPanel().getFilePanel().getFilesLength())); 68 this.uploadPolicy = uploadPolicy; 69 this.maxNbBytes = this.uploadPolicy.getMaxChunkSize(); 70 this.maxNbFiles = Math.min(uploadPolicy.getNbFilesPerRequest(), 71 uploadPolicy.getContext().getUploadPanel().getFilePanel() 72 .getFilesLength()); 73 } 74 75 /** 76 * Checks if this packet can accept this file, according to the current 77 * {@link UploadPolicy}. 78 * 79 * @param uploadFileData 80 * @return True if the file can be added, false otherwise. 81 */ 82 public synchronized boolean canAdd(UploadFileData uploadFileData) { 83 // Here is the list of conditions. This code could be smalled. But I 84 // want it to be clear. 85 if (size() == 0) { 86 return true; 87 } else if (size() == this.maxNbFiles) { 88 // The packet is already full of files 89 return false; 90 } else if (this.nbBytes + uploadFileData.getUploadLength() > maxNbBytes) { 91 // The packet would be too big 92 return false; 93 } else { 94 // No reason to refuse this packet ... 95 return true; 96 } 97 } 98 99 /** 100 * Indicates whether it is possible to add a file or not, to this packet, 101 * according to the current upload policy. 102 * 103 * @return true if the packet is full, that is: no file can be added to this 104 * packet. 105 */ 106 public synchronized boolean isFull() { 107 return (size() == this.maxNbFiles) || (this.nbBytes >= maxNbBytes); 108 } 109 110 /** 111 * @param uploadFileData The file to add to the packet 112 * @return true if the collection changed, that is: if the file was actually 113 * added. false if the Collection didn't change, that is: the packet 114 * is full, or th file is already there. 115 */ 116 public synchronized boolean add(UploadFileData uploadFileData) { 117 if (!canAdd(uploadFileData)) { 118 return false; 119 } else if (!super.add(uploadFileData)) { 120 return false; 121 } else { 122 // The file was correctly added. 123 nbBytes += uploadFileData.getUploadLength(); 124 ; 125 return true; 126 } 127 } 128 129 /** 130 * @return the poisonned status. Returns always false, as this instance is a 131 * true one. false indicates the 'End Of Queue' marker in the 132 * preparedFileQueue, which is not the case here 133 * @see UploadFileDataPoisonned 134 */ 135 public boolean isPoisonned() { 136 return false; 137 } 138 139 // //////////////////////////////////////////////////////////////////////////// 140 // Some ArrayList methods are prohibited here 141 // //////////////////////////////////////////////////////////////////////////// 142 /** 143 * Prohibited ! 144 * 145 * @see ArrayList#remove(int) 146 */ 147 public UploadFileData remove(int index) { 148 throw new java.lang.UnsupportedOperationException( 149 "Removing a file from an UploadFilePacket is prohibited"); 150 } 151 152 /** 153 * Prohibited ! 154 * 155 * @see ArrayList#remove(Object) 156 */ 157 public boolean remove(Object o) { 158 throw new java.lang.UnsupportedOperationException( 159 "Removing a file from an UploadFilePacket is prohibited"); 160 } 161 162 /** 163 * Prohibited ! 164 * 165 * @see ArrayList#removeRange(int, int) 166 */ 167 protected void removeRange(int fromIndex, int toIndex) { 168 throw new java.lang.UnsupportedOperationException( 169 "Removing a file from an UploadFilePacket is prohibited"); 170 } 171 }