001: /* ====================================================================
002: * The Jcorporate Apache Style Software License, Version 1.2 05-07-2002
003: *
004: * Copyright (c) 1995-2002 Jcorporate Ltd. All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: *
010: * 1. Redistributions of source code must retain the above copyright
011: * notice, this list of conditions and the following disclaimer.
012: *
013: * 2. Redistributions in binary form must reproduce the above copyright
014: * notice, this list of conditions and the following disclaimer in
015: * the documentation and/or other materials provided with the
016: * distribution.
017: *
018: * 3. The end-user documentation included with the redistribution,
019: * if any, must include the following acknowledgment:
020: * "This product includes software developed by Jcorporate Ltd.
021: * (http://www.jcorporate.com/)."
022: * Alternately, this acknowledgment may appear in the software itself,
023: * if and wherever such third-party acknowledgments normally appear.
024: *
025: * 4. "Jcorporate" and product names such as "Expresso" must
026: * not be used to endorse or promote products derived from this
027: * software without prior written permission. For written permission,
028: * please contact info@jcorporate.com.
029: *
030: * 5. Products derived from this software may not be called "Expresso",
031: * or other Jcorporate product names; nor may "Expresso" or other
032: * Jcorporate product names appear in their name, without prior
033: * written permission of Jcorporate Ltd.
034: *
035: * 6. No product derived from this software may compete in the same
036: * market space, i.e. framework, without prior written permission
037: * of Jcorporate Ltd. For written permission, please contact
038: * partners@jcorporate.com.
039: *
040: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
041: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
042: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
043: * DISCLAIMED. IN NO EVENT SHALL JCORPORATE LTD OR ITS CONTRIBUTORS
044: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
045: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
046: * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
047: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
048: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
049: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
050: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
051: * SUCH DAMAGE.
052: * ====================================================================
053: *
054: * This software consists of voluntary contributions made by many
055: * individuals on behalf of the Jcorporate Ltd. Contributions back
056: * to the project(s) are encouraged when you make modifications.
057: * Please send them to support@jcorporate.com. For more information
058: * on Jcorporate Ltd. and its products, please see
059: * <http://www.jcorporate.com/>.
060: *
061: * Portions of this software are based upon other open source
062: * products and are subject to their respective licenses.
063: */
064: package com.jcorporate.expresso.services.dbobj;
065:
066: import com.jcorporate.expresso.core.controller.Controller;
067: import com.jcorporate.expresso.core.db.DBException;
068: import com.jcorporate.expresso.core.dbobj.RequestContext;
069: import com.jcorporate.expresso.core.dbobj.SecuredDBObject;
070: import com.jcorporate.expresso.core.dbobj.ValidValue;
071: import com.jcorporate.expresso.core.misc.ConfigManager;
072: import com.jcorporate.expresso.core.misc.StringUtil;
073: import com.jcorporate.expresso.core.security.User;
074:
075: import java.util.Iterator;
076: import java.util.Vector;
077:
078: /**
079: * A registration domain defines a registration context. A DB context can have
080: * multiple registration contexts. Each context defines a controller that
081: * takes care of registration for that context. Each context also defines
082: * whether the extended registration beyond that provided by the User object
083: * is required for the domain or not. The map of registration objects per
084: * registration domain is provided by the RegistrationObjectMap class.
085: * Creation date: (5/15/2001 12:26:11 PM)
086: *
087: * @author Shash Chatterjee
088: */
089: public class RegistrationDomain extends SecuredDBObject {
090: /**
091: * Default constructor
092: *
093: * @throws DBException The exception description.
094: */
095: public RegistrationDomain() throws DBException {
096: super ();
097: }
098:
099: /* RegistrationDomain() */
100:
101: /**
102: * Use over (String) constructor. Initializes the object in the context of
103: * the user who's uid belongs to the parameter.
104: *
105: * @param uid the Uid of the user context
106: * @throws DBException if there's an initialization problem
107: */
108: public RegistrationDomain(int uid) throws DBException {
109: super (uid);
110: }
111:
112: /**
113: * For using DBObjects within Controllers. Initializes based upon the
114: * current user and the requested db. [Of course this can be modified
115: * later]
116: *
117: * @param request - The controller request handed to you by the framework.
118: * @throws DBException upon initialization error
119: */
120: public RegistrationDomain(RequestContext request)
121: throws DBException {
122: super (request);
123: }
124:
125: /**
126: * Override the method getValidValues to provide specific values for our
127: * multi-valued fields
128: *
129: * @param fieldName Field name for which values are requested
130: * @return Vector The ValidValues field
131: * @throws DBException If the values cannot be retrieved
132: */
133: public Vector getValidValues(String fieldName) throws DBException {
134: if (fieldName.equals("RegRequired")
135: || fieldName.equals("Approve")
136: || fieldName.equals("UserPasswd")
137: || fieldName.equals("EmailValidate")
138: || fieldName.equals("EmailAsLogin")) {
139: Vector myValues = new Vector(2);
140: myValues.addElement(new ValidValue("Y", "Yes"));
141: myValues.addElement(new ValidValue("N", "No"));
142:
143: return myValues;
144: }
145:
146: if (fieldName.equals("NotApprovedGrp")) {
147: Vector myValues = super .getValidValues(fieldName);
148: myValues.add(0,
149: new ValidValue("", getString("notSelected")));
150: return myValues;
151: }
152:
153: return super .getValidValues(fieldName);
154: }
155:
156: /* getValidValues(String) */
157:
158: /**
159: * @return Vector of ValidValue objects
160: */
161: public Vector getValues() throws DBException {
162: return getValuesDefault("RegDomId", "Name");
163: }
164:
165: /* getValues() */
166:
167: /**
168: * Extends the usual add method to check for duplicate entires and to
169: * provide an unique id
170: *
171: * @throws DBException If the next number could not be allocated or the add
172: * fails
173: * @see com.jcorporate.expresso.core.dbobj.SecuredDBObject#add
174: */
175: public void add()
176: throws com.jcorporate.expresso.core.db.DBException {
177: RegistrationDomain rd = new RegistrationDomain();
178: rd.setDataContext(getDataContext());
179: rd.setField("Name", this .getField("Name"));
180:
181: if (rd.find()) {
182: throw new DBException("Registration domain \""
183: + rd.getField("Name") + "\" already exists.");
184: }
185:
186: if (getField("RegRequired").equals("")) {
187: setField("RegRequired", "Y");
188: }
189:
190: if (getField("Approve").equals("")) {
191: setField("Approve", "N");
192: }
193:
194: if (getField("UserPasswd").equals("")) {
195: setField("UserPasswd", "N");
196: }
197:
198: if (getField("EmailValidate").equals("")) {
199: setField("EmailValidate", "Y");
200: }
201:
202: if (getField("EmailAsLogin").equals("")) {
203: setField("EmailAsLogin", "Y");
204: }
205:
206: if (getField("NotApprovedGrp").equals("")) {
207: setField("NotRegGrp", "NotReg");
208: }
209:
210: if (getField("Approve").equals("Y")) {
211: if (getField("Approvers").equals("")) {
212: setField("Approvers", User.ADMIN_USER);
213: }
214:
215: if (getField("NotApprovedGrp").equals("")) {
216: setField("NotApprovedGrp", "NotReg");
217: }
218: }
219:
220: super .add();
221: }
222:
223: /* add() */
224:
225: /**
226: * Returns the default registration domain. Factory Method that is often
227: * called by a LoginController for self-registered users.
228: *
229: * @param dbContext the database context name
230: * @return Registration domain object
231: * @throws DBException upon construction failure
232: */
233: public static RegistrationDomain buildDefaultRegistrationDomain(
234: String dbContext) throws DBException {
235: String regDomain = Setup.getValueRequired(dbContext,
236: "defaultRegDomain");
237: RegistrationDomain rd = new RegistrationDomain(
238: SecuredDBObject.SYSTEM_ACCOUNT);
239: rd.setDataContext(dbContext);
240: rd.setField("Name", regDomain);
241:
242: if (rd.find()) {
243: return rd;
244: } else {
245: throw new DBException(
246: "Unable to locate default registration domain: '"
247: + regDomain + "'");
248: }
249: }
250:
251: /**
252: * Instantiates the controller based upon the current Controller Value
253: *
254: * @return Controller instance that performs registration
255: * @throws DBException upon error
256: */
257: public Controller getRegistrationObject() throws DBException {
258: StringUtil
259: .assertNotBlank(this .getField("ControllerClass"),
260: "Invalid Registration ControllerClassname for this object");
261:
262: try {
263: return ConfigManager.getControllerFactory().getController(
264: this .getField("ControllerClass"));
265: } catch (com.jcorporate.expresso.core.controller.ControllerException ce) {
266: throw new DBException(
267: "Error creating Registration controller", ce);
268: }
269: }
270:
271: /**
272: * Extends the usual delete method to delete associated registration object
273: * entries
274: *
275: * @throws com.jcorporate.expresso.core.db.DBException
276: * If the next number
277: * could not be allocated or the add fails
278: * @see com.jcorporate.expresso.core.dbobj.SecuredDBObject#delete
279: */
280: public void delete()
281: throws com.jcorporate.expresso.core.db.DBException {
282: RegistrationObjectMap rom = new RegistrationObjectMap();
283: rom.setDataContext(getDataContext());
284: rom.setField("RegDomId", this .getField("RegDomId"));
285:
286: RegistrationObjectMap oneRom = null;
287:
288: for (Iterator e = rom.searchAndRetrieveList().iterator(); e
289: .hasNext();) {
290: oneRom = (RegistrationObjectMap) e.next();
291: oneRom.delete();
292: }
293:
294: super .delete();
295: }
296:
297: /**
298: * Extends the usual update method to check for duplicate entries
299: *
300: * @throws DBException If the next number could not be allocated or the add
301: * fails
302: */
303: public void update()
304: throws com.jcorporate.expresso.core.db.DBException {
305: RegistrationDomain rd = new RegistrationDomain();
306: rd.setDataContext(getDataContext());
307: rd.setField("Name", this .getField("Name"));
308:
309: if (rd.find()
310: && (!rd.getField("RegDomId").equals(
311: this .getField("RegDomId")))) {
312: throw new DBException("Registration domain \""
313: + rd.getField("Name") + "\" already exists.");
314: }
315:
316: if (getField("RegRequired").equals("")) {
317: setField("RegRequired", "Y");
318: }
319:
320: if (getField("RegRequired").equals("")) {
321: setField("RegRequired", "Y");
322: }
323:
324: if (getField("Approve").equals("")) {
325: setField("Approve", "N");
326: }
327:
328: if (getField("UserPasswd").equals("")) {
329: setField("UserPasswd", "N");
330: }
331:
332: if (getField("EmailValidate").equals("")) {
333: setField("EmailValidate", "Y");
334: }
335:
336: if (getField("EmailAsLogin").equals("")) {
337: setField("EmailAsLogin", "Y");
338: }
339:
340: if (getField("NotApprovedGrp").equals("")) {
341: setField("NotRegGrp", "NotReg");
342: }
343:
344: if (getField("Approve").equals("Y")) {
345: if (getField("Approvers").equals("")) {
346: setField("Approvers", User.ADMIN_USER);
347: }
348:
349: if (getField("NotApprovedGrp").equals("")) {
350: setField("NotApprovedGrp", "NotReg");
351: }
352: }
353:
354: super .update();
355: }
356:
357: /* update() */
358:
359: /**
360: * Extends the checkAllRefs method to check for valid UserGroup or if
361: * referential integrity is violated
362: *
363: * @throws DBException If there is a problem checking the integrity
364: */
365: protected void checkAllRefs() throws DBException {
366: checkRef("GroupName", new UserGroup(
367: SecuredDBObject.SYSTEM_ACCOUNT), "Invalid "
368: + getString(getMetaData().getDescription("GroupName")));
369: }
370:
371: /* checkAllRefs() */
372:
373: /**
374: * Method to set up the fields for this database object. This method should
375: * be defined in the implementing object and should make calls to
376: * addField, addKey, setMultiValued, etc. as required to define the
377: * content of the DBObject
378: *
379: * @throws DBException If there is an error setting up the fields as
380: * requested. For example, if a field allowing null is requested
381: * as part of the key
382: */
383: protected void setupFields() throws DBException {
384: setTargetTable("REGDOMAIN");
385: setDescription("DBregDomain");
386: setCharset("ISO-8859-1");
387: addField("RegDomId", "auto-inc", 0, false, "regDomId");
388: addField("Name", "varchar", 30, false, "name");
389: addField("Description", "varchar", 128, false, "description");
390: addField("GroupName", "char", 10, false, "defaultGroup");
391: addField("ControllerClass", "varchar", 128, true,
392: "regControllerClass");
393: addField("RegRequired", "char", 1, true, "regRequired");
394: addField("Approve", "char", 1, true, "approvalRequired");
395: addField("UserPasswd", "char", 1, true, "userPassword");
396: addField("EmailValidate", "char", 1, true, "emailValidate");
397: addField("EmailAsLogin", "char", 1, true, "emailAsLogin");
398: addField("Approvers", "text", 0, true, "loginNamesForApprovers");
399: addField("NotRegGrp", "char", 10, true,
400: "groupBeforeRegistration");
401: addField("NotApprovedGrp", "char", 10, true,
402: "groupBeforeApproval");
403: addKey("RegDomId");
404: setReadOnly("RegDomId");
405:
406: //
407: //Add a database index to speed up name lookups
408: //
409: addIndex("RegDomainName", "Name", true);
410: setStringFilter("Name", "stripFilter");
411: setStringFilter("Description", "stripFilter");
412: setStringFilter("ControllerClass", "stripFilter");
413: setStringFilter("GroupName", "stripFilter");
414: setStringFilter("Approvers", "stripFilter");
415: setMultiValued("RegRequired");
416: setMultiValued("Approve");
417: setMultiValued("UserPasswd");
418: setMultiValued("EmailValidate");
419: setMultiValued("EmailAsLogin");
420: setMultiValued("GroupName");
421: setMultiValued("NotRegGrp");
422: setMultiValued("NotApprovedGrp");
423: setLookupObject("GroupName",
424: "com.jcorporate.expresso.services.dbobj.UserGroup");
425: setLookupObject("NotRegGrp",
426: "com.jcorporate.expresso.services.dbobj.UserGroup");
427: setLookupObject("NotApprovedGrp",
428: "com.jcorporate.expresso.services.dbobj.UserGroup");
429: addDetail(
430: "com.jcorporate.expresso.services.dbobj.RegistrationObjectMap",
431: "RegDomId", "RegDomId");
432: }
433: /* setupFields() */
434: }
|