View Javadoc
1   //
2   // $Id: FileData.java 95 2007-05-02 03:27:05Z
3   // /C=DE/ST=Baden-Wuerttemberg/O=ISDN4Linux/OU=Fritz
4   // Elfert/CN=svn-felfert@isdn4linux.de/emailAddress=fritz@fritz-elfert.de $
5   //
6   // jupload - A file upload applet.
7   // Copyright 2007 The JUpload Team
8   //
9   // Created: 2006-11-20
10  // Creator: etienne_sf
11  // Last modified: $Date: 2015-03-14 15:13:43 +0100 (sam., 14 mars 2015) $
12  //
13  // This program is free software; you can redistribute it and/or modify it under
14  // the terms of the GNU General Public License as published by the Free Software
15  // Foundation; either version 2 of the License, or (at your option) any later
16  // version. This program is distributed in the hope that it will be useful, but
17  // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18  // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
19  // details. You should have received a copy of the GNU General Public License
20  // along with this program; if not, write to the Free Software Foundation, Inc.,
21  // 675 Mass Ave, Cambridge, MA 02139, USA.
22  
23  package wjhk.jupload2.filedata;
24  
25  import java.io.File;
26  import java.io.InputStream;
27  import java.util.Date;
28  
29  import wjhk.jupload2.exception.JUploadException;
30  import wjhk.jupload2.exception.JUploadIOException;
31  import wjhk.jupload2.gui.filepanel.treeview.TreeFileDataNode;
32  import wjhk.jupload2.policies.UploadPolicy;
33  import wjhk.jupload2.upload.FileUploadThread;
34  import wjhk.jupload2.upload.helper.ByteArrayEncoder;
35  
36  /**
37   * This class contains all data and methods for a file to upload. The current
38   * {@link wjhk.jupload2.policies.UploadPolicy} contains the necessary parameters to personalize the way files must be
39   * handled. <BR>
40   * The JUpload package provides a default implementation of this class in {@link DefaultFileData}. This default
41   * implementation contains all necessary methods to allow upload. You can override it to add new file behaviour. For
42   * instance, you could add a XMLFileData, that would check that XML is valid before upload. See the <a
43   * href="package-summary.html">package summary</a> for more details about that. <BR>
44   * This class is the interface that all FileData must implement. The {@link DefaultFileData} class contains the default
45   * implementation for this interface. The {@link PictureFileData} contains another implementation of this interface,
46   * adapted to manage pictures (rotation, resizing...). <BR>
47   * The instance of FileData is created by the {@link UploadPolicy#createFileData(File, File)} method. This method can be
48   * overrided in a new upoad policy, to create an instance of another FileData. See {@link PictureFileData} for an
49   * example about FileData customization.
50   * 
51   * @author etienne_sf
52   */
53  
54  public interface FileData {
55  
56      /**
57       * Called during the upload, by the {@link FileUploadThread}. The FileData instance should then call the
58       * {@link ByteArrayEncoder#appendTextProperty(String, String, int)} method to add each file property to the current
59       * upload.
60       * 
61       * @param bae The byte encoder, where the properties must be added
62       * @param index Index of the file concerned by this value. -1 if this is a global parameter.
63       * @throws JUploadIOException Encapsulation of the IOException, if any would occurs.
64       * @see ByteArrayEncoder#appendTextProperty(String, String, int)
65       */
66      public void appendFileProperties(ByteArrayEncoder bae, int index) throws JUploadIOException;
67  
68      /**
69       * Prepare the fileData to upload. For instance, picture data can be resized before upload (see
70       * {@link PictureFileData}. This method is called before the upload of this file. If no exception is thrown, then
71       * the file is correctly prepared.
72       * 
73       * @param uploadFileRoot The biggest path which is common to all uploaded files. Used to calculate the relativeDir
74       *            to this root path, for each file. This relative path is sent as metadata during the upload
75       * @throws JUploadException Encapsulation of the Exception, if any error would occurs.
76       * @see FileUploadThread
77       * @see #getRelativeDir()
78       */
79      public void beforeUpload(String uploadFileRoot) throws JUploadException;
80  
81      /**
82       * Get size of upload, which may be different from the actual file length. This call is valid only after a call to
83       * {@link #beforeUpload()} and before the call to {@link #afterUpload()}.
84       * 
85       * @return The length of upload. In this class, this is the size of the file, as it isn't transformed for upload.
86       *         This size may change if encoding is necessary (needs a new FileData class), or if picture is to be
87       *         resized or rotated.
88       * @see PictureFileData
89       */
90      public long getUploadLength();
91  
92      /**
93       * This function is called after upload, whether it is successful or not. It allows fileData to free any resource
94       * created for the upload. For instance, {@link PictureFileData#afterUpload()} removes the temporary file, if any
95       * was created.
96       */
97      public void afterUpload();
98  
99      /**
100      * This function creates an InputStream from this file. The {@link FileUploadThread} class then reads bytes from it
101      * and transfers them to the webserver. The caller is responsible for closing this stream.<BR>
102      * This method may only be called when {@link #isPreparedForUpload()} returns true.
103      * 
104      * @throws JUploadException Encapsulation of the Exception, if any would occurs.
105      * @throws IllegalStateException When the upload is not prepared (before a call to {@link #beforeUpload()} or after
106      *             a call to {@link #afterUpload()}
107      * @return An InputStream, representing this instance.
108      */
109     public InputStream getInputStream() throws JUploadException;
110 
111     /**
112      * Get the original filename. This is the name of the file, into the local hardrive
113      * 
114      * @return The original filename
115      */
116     public String getFileName();
117 
118     /**
119      * @return The extension for the original file.
120      */
121     public String getFileExtension();
122 
123     /**
124      * @return The length of the original file.
125      */
126     public long getFileLength();
127 
128     /**
129      * @return The original file date.
130      */
131     public Date getLastModified();
132 
133     /**
134      * Indicates whether the check box is checked or not. That is: whether the file should be uploaded or not.
135      * 
136      * @return
137      */
138     public boolean getUploadFlag();
139 
140     /**
141      * Allows to set or unset the upload flag.
142      * 
143      * @return
144      */
145     public void setUploadFlag(boolean uploadFlag);
146 
147     /**
148      * Get the directory of the file.
149      * 
150      * @return The directory where this file is stored.
151      */
152     public String getDirectory();
153 
154     /**
155      * Retrieves the MD5 sum of the file.<BR>
156      * Since 5.0.0, this method is is in DefaultFileData, and is calculated depending on the sendMD5Sum applet
157      * parameter, during the file preparation file.
158      * 
159      * @return The corresponding MD5 sum.
160      * @throws JUploadException
161      * @see #beforeUpload()
162      */
163     public String getMD5() throws JUploadException;
164 
165     /**
166      * This function return the FileData content type.
167      * 
168      * @return The mimeType for the file.
169      */
170     public String getMimeType();
171 
172     /**
173      * Indicate if this file can be read. Take care of the File.canRead() methods, that seems to be wrong from time to
174      * time.
175      * 
176      * @return indicates whether the file can be read or not.
177      */
178     public boolean canRead();
179 
180     /**
181      * Retrieves the path of this file relative to the root directory
182      * 
183      * @return This instance's relative path or an empty string if it was not created using a root parameter.
184      */
185     public String getRelativeDir();
186 
187     /**
188      * Returns the absolute path, as it will be sent during the upload. In standard mode, it is the concatenation of the
189      * root and the relative path, that is: the absolute path of the File to upload on the local file system. In
190      * hierarchical mode, it is the path relative to the (empty) upload root.
191      * 
192      * @return
193      */
194     public String getAbsolutePath();
195 
196     /**
197      * Indicates whether the file can be uploaded or not. This boolean should be set to true in the call to
198      * {@link #beforeUpload()}, and the to false in the call to {@link #afterUpload()}.
199      * 
200      * @return True if the file is ready for upload.
201      * @throws IllegalStateException When the upload is not prepared (before a call to {@link #beforeUpload()} or after
202      *             a call to {@link #afterUpload()}
203      */
204     public boolean isPreparedForUpload();
205 
206     /**
207      * Links this FileData to the associated {@link TreeFileDataNode}, from the hierarchical view.
208      * 
209      * @return
210      */
211     public TreeFileDataNode getTreeFileDataNode();
212 
213     /**
214      * Setters for the to the associated {@link TreeFileDataNode}, from the hierarchical view. Allows link between the
215      * flat and hierarchical view.
216      * 
217      * @return
218      */
219     public void setTreeFileDataNode(TreeFileDataNode node);
220 }