1 //
2 // $Id: UploadPolicyFactory.java 822 2009-07-02 14:49:12Z etienne_sf $
3 //
4 // jupload - A file upload applet.
5 // Copyright 2007 The JUpload Team
6 //
7 // Created: 2006-05-06
8 // Creator: etienne_sf
9 // Last modified: $Date: 2009-07-02 16:49:12 +0200 (jeu., 02 juil. 2009) $
10 //
11 // This program is free software; you can redistribute it and/or modify it under
12 // the terms of the GNU General Public License as published by the Free Software
13 // Foundation; either version 2 of the License, or (at your option) any later
14 // version. This program is distributed in the hope that it will be useful, but
15 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
17 // details. You should have received a copy of the GNU General Public License
18 // along with this program; if not, write to the Free Software Foundation, Inc.,
19 // 675 Mass Ave, Cambridge, MA 02139, USA.
20
21 package wjhk.jupload2.policies;
22
23 import java.lang.reflect.Constructor;
24 import java.lang.reflect.InvocationTargetException;
25
26 import wjhk.jupload2.context.JUploadContext;
27
28 /**
29 * This class is used to control creation of the uploadPolicy instance,
30 * according to applet parameters (or System properties). <BR>
31 * <BR>
32 * The used parameters are:
33 * <UL>
34 * <LI>postURL: The URL where files are to be uploaded. This parameter is
35 * mandatory if called from a servlet.
36 * <LI>uploadPolicy: the class name to be used as a policy. Currently available
37 * : not defined (then use DefaultUploadPolicy),
38 * {@link wjhk.jupload2.policies.DefaultUploadPolicy},
39 * {@link wjhk.jupload2.policies.CoppermineUploadPolicy}
40 * </UL>
41 *
42 * @author etienne_sf
43 * @version $Revision: 822 $
44 */
45 public class UploadPolicyFactory {
46
47 /**
48 * Returns an upload Policy for the given applet and URL. All other
49 * parameters for the uploadPolicy are take from avaiable applet parameters
50 * (or from system properties, if it is not run as an applet).
51 *
52 * @param theAppletContext if not null : use this Applet Parameters. If
53 * null, use System properties.
54 * @return The newly created UploadPolicy.
55 * @throws Exception
56 */
57 public static UploadPolicy getUploadPolicy(JUploadContext theAppletContext)
58 throws Exception {
59 UploadPolicy uploadPolicy = theAppletContext.getUploadPolicy();
60
61 if (uploadPolicy == null) {
62 // Let's create the update policy.
63 String uploadPolicyStr = theAppletContext.getParameter(
64 UploadPolicy.PROP_UPLOAD_POLICY,
65 UploadPolicy.DEFAULT_UPLOAD_POLICY);
66 int debugLevel = theAppletContext.getParameter(
67 UploadPolicy.PROP_DEBUG_LEVEL,
68 UploadPolicy.DEFAULT_DEBUG_LEVEL);
69
70 String action = null;
71 boolean usingDefaultUploadPolicy = false;
72 try {
73 logDebug("Trying to load the given uploadPolicy: "
74 + uploadPolicyStr, debugLevel);
75
76 action = uploadPolicyStr;
77 Class<?> uploadPolicyClass = null;
78 // Our default is "DefaultUploadPolicy", (without prefix)
79 // so we try the prefixed variant first. But only, if the
80 // user had specified an unqualified class name.
81 if (!uploadPolicyStr.contains(".")) {
82 try {
83 uploadPolicyClass = Class
84 .forName("wjhk.jupload2.policies."
85 + uploadPolicyStr);
86 logDebug("wjhk.jupload2.policies." + uploadPolicyStr
87 + " class found.", debugLevel);
88 } catch (ClassNotFoundException e1) {
89 logDebug(e1.getClass().getName()
90 + " when looking for [wjhk.jupload2.policies.]"
91 + uploadPolicyStr, debugLevel);
92 uploadPolicyClass = null;
93 }
94 }
95 if (null == uploadPolicyClass) {
96 // Let's try without the prefix
97 try {
98 uploadPolicyClass = Class.forName(uploadPolicyStr);
99 logDebug(uploadPolicyStr + " class found.", debugLevel);
100 } catch (ClassNotFoundException e2) {
101 logDebug(e2.getClass().getName()
102 + " when looking for the given uploadPolicy ("
103 + uploadPolicyStr + ")", debugLevel);
104 // Too bad, we don't know how to create this class.
105 // Fall back to built-in default.
106 usingDefaultUploadPolicy = true;
107 uploadPolicyClass = Class
108 .forName("wjhk.jupload2.policies.DefaultUploadPolicy");
109 logDebug(
110 "Using default upload policy: wjhk.jupload2.policies.DefaultUploadPolicy",
111 debugLevel);
112 }
113 }
114 action = "constructorParameters";
115 Class<?>[] constructorParameters = {
116 Class.forName("wjhk.jupload2.context.JUploadContext")
117 };
118 Constructor<?> constructor = uploadPolicyClass
119 .getConstructor(constructorParameters);
120 Object[] params = {
121 theAppletContext
122 };
123 action = "newInstance";
124 uploadPolicy = (UploadPolicy) constructor.newInstance(params);
125 } catch (Exception e) {
126 if (e instanceof InvocationTargetException) {
127 // If the policy's constructor has thrown an exception,
128 // Get that "real" exception and print its details and
129 // stack trace
130 Throwable t = ((InvocationTargetException) e)
131 .getTargetException();
132 System.out.println("-ERROR- " + e.getClass().getName()
133 + " (message: " + t.getMessage() + ")");
134 t.printStackTrace();
135 }
136 System.out.println("-ERROR- " + e.getClass().getName() + " in "
137 + action + "(error message: " + e.getMessage() + ")");
138 throw e;
139 }
140
141 // The current values are displayed here, after the full
142 // initialization of all classes.
143 // It could also be displayed in the DefaultUploadPolicy (for
144 // instance), but then, the
145 // display wouldn't show the modifications done by superclasses.
146 uploadPolicy.displayDebug("uploadPolicy parameter = "
147 + uploadPolicyStr, 1);
148 if (usingDefaultUploadPolicy) {
149 uploadPolicy.displayWarn("Unable to create the '"
150 + uploadPolicyStr
151 + "'. Using the DefaultUploadPolicy instead.");
152 } else {
153 uploadPolicy.displayDebug("uploadPolicy = "
154 + uploadPolicy.getClass().getName(), 20);
155 }
156
157 // Then, we display the applet parameter list.
158 uploadPolicy.displayParameterStatus();
159 }
160
161 return uploadPolicy;
162 }
163
164 /**
165 * Help to log debug information to the user. Use of log4j, one day in the
166 * future, would help.
167 *
168 * @param currentDebugLevel
169 */
170 private static void logDebug(String msg, int currentDebugLevel) {
171 if (currentDebugLevel > 0) {
172 System.out.println("[DEBUG] " + msg);
173 }
174 }
175 }