001 /***************************************************************************************************
002 * MODULE DESCRIPTION
003 ****************************************************************************************************
004 *
005 * NAME: KiuruHandler.java
006 * LANGUAGE: Java2
007 * DATE: 2.12.2002
008 * AUTHOR: Miika Nurminen, Jyväskylän yliopisto
009 *
010 ****************************************************************************************************
011 * COPYRIGHT (C) Kiuru-projektiryhmä
012 * Limited rights granted. Please refer to license
013 ****************************************************************************************************
014
015 ****************************************************************************************************
016 * UPDATES
017 ****************************************************************************************************
018 *
019 * 2.12.2002 - Initial version / mn
020 *
021 ****************************************************************************************************/
022 package kiurubeans;
023
024 import java.beans.*;
025 import kotkabeans.*;
026 import javax.servlet.http.HttpServletRequest;
027
028 /**
029 * General-purpose handler bean. Support for User and Error included.
030 * <p>
031 * This should be used as a superclass for all Handler Beans.
032 *
033 * @author Miika Nurminen
034 */
035 public abstract class KiuruHandler extends Object implements EnumType {
036
037 // Attributes
038
039 /** Default action for all handlers. */
040 public static final int NO_ACTION=0;
041
042 /** User data. Includes support for translation operations. */
043 private User user;
044 /** Error handling. This should be imported from JSP page. */
045 private kotkabeans.Error error;
046 /** Determines bean state */
047 private String actionType = "addNew";
048
049 /** Indicates if user-entered properties are syntactically correct */
050 private boolean ok = true;
051
052 /** Bean state */
053 private int enumState=NO_ACTION;
054
055
056 // Constructors
057
058 /** Dummy constructor for KiuruHandler */
059 public KiuruHandler() {
060 }
061
062 /**
063 * Dummy constructor with error.
064 *
065 * @param error error object for this instance.
066 */
067 public KiuruHandler(kotkabeans.Error error) {
068 setError(error);
069 }
070
071 // Access methods
072
073 /**
074 * Returns current max state value. Inherited classes may override this
075 * when new states are introduced.
076 *
077 * @return max state value
078 */
079 protected int getMaxState() {
080 return 0;
081 }
082
083
084 /**
085 * Returns current state.
086 *
087 * @return current state.
088 */
089 public int getEnumState() {
090 return enumState;
091 }
092
093 /**
094 * Sets current state.
095 *
096 * @param state constant.
097 * @throws IllegalArgumentException if state is not valid.
098 */
099 public void setEnumState(int state) {
100 if ((state<0) || (state>getMaxState()))
101 throw new IllegalArgumentException("Illegal state argument "+state+"!");
102 enumState=state;
103 }
104
105
106 /**
107 * Returns current user.
108 * @return current user
109 */
110 public User getUser() { return user; }
111
112 /**
113 * Sets current user.
114 * @param user user to be set
115 */
116 public void setUser(User user) { this.user=user; }
117
118 /**
119 * Returns current error object.
120 * @return current error
121 */
122 public kotkabeans.Error getError() { return error; }
123
124 /**
125 * Sets current error object.
126 * @param error error to be set
127 */
128 public void setError(kotkabeans.Error error) { this.error=error; }
129
130 /**
131 * Returns if user-entered properties are ok.
132 * @return if user-entered properties are ok
133 */
134 public boolean getOk() { return ok; }
135
136 /**
137 * OK may be false when processing invalid input values
138 * for entity attributes or search parameters.
139 * @param b value for Ok
140 */
141 public void setOk(boolean b) {
142 this.ok = b;
143 if (this.ok)
144 error.getErrors(); // this clears Error.
145 }
146
147
148
149 // Operations
150
151 /**
152 * Returns user's language id as String. If user is not assigned, returns 1.
153 * works even if user is not set.
154 *
155 * @return user's language id.
156 */
157 protected String getLangId() {
158 int langid = 1;
159 if (getUser()!=null)
160 langid=getUser().getLanguageID();
161 return Integer.toString(langid);
162 }
163
164 /**
165 * Adds string to errors to be displayed.
166 *
167 * @param s Error string
168 */
169 protected void addError(String s) {
170 if (getError()==null) throw new IllegalStateException("Error must be set for this method!");
171 getError().setError(s);
172 }
173
174 /**
175 * Add string to notices to be displayed.
176 *
177 * @param s Notice string
178 */
179 protected void addNotice(String s) {
180 if (getError()==null) throw new IllegalStateException("Error must be set for this method!");
181 getError().setNotice(s);
182 }
183
184 /**
185 * Performs action based on actionType. Called from performAction.
186 * Descendant classes should override this and call the same method
187 * in inherited class as default.
188 *
189 * @throws Exception If something went wrong during actual executed action.
190 * @see #performAction
191 */
192 protected abstract void defaultAction() throws java.lang.Exception;
193
194 /**
195 * Performs action based on actionType (eg. addNew, modify, post, delete)
196 *
197 * @return true if action was successful, false otherwise
198 */
199 public boolean performAction() {
200 kotkabeans.Log.log("now performing action"+getEnumState());
201 try {
202 switch (getEnumState()) {
203 case NO_ACTION:
204 break;
205 default:
206 defaultAction();
207 break;
208 }
209 }
210 catch (Exception e) {
211 kotkabeans.Log.log("Exception occured while performing action "+getEnumState()+"! "+e.getMessage());
212 return false;
213 }
214 return true;
215 }
216
217 /**
218 * Implementation of clearing action state. Inherited classes should always override this.
219 *
220 * @param request Http request used for parameter parsing.
221 */
222 protected abstract void doClearActionState(javax.servlet.http.HttpServletRequest request);
223
224 /**
225 * Implementation for clearing empty parameters. Descendant classes override this.
226 *
227 * @param request Http request used for parameter parsing.
228 */
229 protected abstract void doClearEmptyParameters(javax.servlet.http.HttpServletRequest request);
230
231 /**
232 * Ensures bean state is reseted when editing a new record.
233 * <p>
234 * Method is called in the beginning of UI (not Handler!) JSP page.
235 * State reset may depend on request parameters.
236 *
237 * @param request HTTP request with parameters
238 * @see #doClearActionState(HttpServletRequest)
239 */
240 public void resetActionState(HttpServletRequest request) {
241 if (request==null) {
242 throw new IllegalArgumentException("Request must be set!");
243 }
244 kotkabeans.Log.log("Clearing action state");
245 doClearActionState(request); // clears action state, may be based on request params.
246 }
247
248
249 /**
250 * Ensures empty request parameters are clearer when entity is posted.
251 * <p>
252 * If bean is used in a JSP, this should be called in the beginning of page.
253 * If form content is "" or null it is not sent via HTTP, so those fields
254 * must be cleared manually. Method may be called from a handler or UI page.
255 * Descendant classes should redefine conditions for calling
256 * doClearEmpty parameters method.
257 *
258 * @param request HTTP request with parameters
259 * @see #doClearEmptyParameters(HttpServletRequest)
260 */
261 public void clearEmptyParameters(HttpServletRequest request) {
262 if (request==null) {
263 throw new IllegalArgumentException("Request must be set!");
264 }
265 /* inherited classes should redefine conditions for calling
266 doClearEmpty parameters */
267 }
268
269 /**
270 * Returns errorstring (if exists) and resets ok-field & actiontype.
271 * Usually called in the beginning of a page.
272 * <br />
273 * Note. resetErrorState & ResetActionState should not be merged.
274 * ResetActionState is called only on UI pages.
275 *
276 * @return errorstring. Usually not needed. shared include file showerrorblock shows error in JSP page.
277 */
278 public String resetErrorState() {
279 if (!getOk()) {
280 setEnumState(NO_ACTION); // if field values are not ok, we won't update them. adjusting existing values
281 }
282 String result=getError().getErrors(); // clears error, deprecated by include showerrorblock
283 setOk(true);
284 return result;
285 }
286
287 }
288 /***************************************************************************************************
289 * COPYRIGHT (C) KIURU -PROJECT GROUP
290 * Limited rights granted. Please refer to license.
291 **************************************************************************************************/