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:
065: package com.jcorporate.expresso.services.dbobj;
066:
067: import com.jcorporate.expresso.core.controller.ControllerRequest;
068: import com.jcorporate.expresso.core.db.DBConnection;
069: import com.jcorporate.expresso.core.db.DBException;
070: import com.jcorporate.expresso.core.dbobj.SecuredDBObject;
071: import com.jcorporate.expresso.core.i18n.Messages;
072:
073: import java.util.Iterator;
074: import java.util.List;
075: import java.util.Vector;
076:
077: /**
078: * <p>UserGroup is a grouping of a number of users for security purposes.
079: * UserGroups are equivalent to 'roles' in other terminology.</p>
080: *
081: * @author Michael Nash
082: * @since Expresso 1.0
083: */
084: public class UserGroup extends SecurityDBObject {
085:
086: public static final String GROUP_NAME_FIELD = "GroupName";
087: public static final String GROUP_DESCRIPTION = "Descrip";
088: public static final int GROUP_NAME_MAX_LEN = 10;
089: public static final int GROUP_DESCRIP_MAX_LEN = 80;
090: public static final String TABLE_NAME = "USERROLES";
091:
092: /**
093: * used as default group for all
094: * users who register and their reg domain has no other group set
095: *
096: * @see com.jcorporate.expresso.services.controller.SimpleRegistration
097: */
098: public static final String ALL_USERS_GROUP = "Everybody";
099: public static final String DEMO_GROUP = "Demo";
100:
101: /**
102: * groups created as part of DBTool.setupSecurity bootstrap
103: */
104: public static final String UNKNOWN_USERS_GROUP = "Nobody";
105: public static final String NOT_REG_USERS_GROUP = "NotReg";
106: public static final String ADMIN_GROUP = "Admin";
107:
108: /**
109: * construct object with superuser privileges
110: *
111: * @see com.jcorporate.expresso.core.dbobj.SecuredDBObject
112: */
113: public UserGroup() throws DBException {
114: } /* UserGroup() */
115:
116: /**
117: * Initializes the usergroup with the permissions of the given user.
118: *
119: * @param uid the User's uid
120: * @throws DBException upon instantion error
121: */
122: public UserGroup(int uid) throws DBException {
123: super (uid);
124: }
125:
126: /**
127: * For using DBObjects within Controllers. Initializes based upon the current
128: * user and the requested db. [Of course this can be modified later]
129: *
130: * @param request - The controller request handed to you by the framework.
131: */
132: public UserGroup(ControllerRequest request) throws DBException {
133: super (request);
134: }
135:
136: /**
137: * constructor for db transactions; object will have superuser privileges unless you separately call setRequestingUid()
138: *
139: * @param localConnection the connection which should be used, typically because of an ongoing transaction
140: */
141: public UserGroup(DBConnection localConnection) throws DBException {
142: if (localConnection != null) {
143: setConnection(localConnection);
144: }
145: }
146:
147: /**
148: * Check referential integrity of objects referring to this object
149: *
150: * @throws DBException If the integrity cannot be verified
151: */
152: protected void checkAllReferredToBy() throws DBException {
153: referredToBy(
154: new DBObjSecurity(SecuredDBObject.SYSTEM_ACCOUNT),
155: GROUP_NAME_FIELD,
156: "This Group ("
157: + getField(GROUP_NAME_FIELD)
158: + ") is in use by a Database Object security entry");
159: referredToBy(new ControllerSecurity(
160: SecuredDBObject.SYSTEM_ACCOUNT), GROUP_NAME_FIELD,
161: "This Group (" + getField(GROUP_NAME_FIELD)
162: + ") is in use by a Controller security entry");
163: referredToBy(new JobSecurity(SecuredDBObject.SYSTEM_ACCOUNT),
164: GROUP_NAME_FIELD, "This Group ("
165: + getField(GROUP_NAME_FIELD)
166: + ") is in use by a Job security entry");
167: referredToBy(new GroupMembers(SecuredDBObject.SYSTEM_ACCOUNT),
168: GROUP_NAME_FIELD, "This Group ("
169: + getField(GROUP_NAME_FIELD)
170: + ") still has members ");
171: referredToBy(new GroupNest(SecuredDBObject.SYSTEM_ACCOUNT),
172: GroupNest.FLD_GROUPNAME, "This Group ("
173: + getField(GROUP_NAME_FIELD)
174: + ") is in use by a Group Member Nesting entry");
175: referredToBy(new GroupNest(SecuredDBObject.SYSTEM_ACCOUNT),
176: GroupNest.FLD_MEMBEROF, "This Group ("
177: + getField(GROUP_NAME_FIELD)
178: + ") is in use by a Group Member Nesting entry");
179: } /* checkAllReferredToBy() */
180:
181: /**
182: * Extend the super.delete() method to first delete the GroupMembers
183: * elements that refer to the group being deleted
184: */
185: public void delete() throws DBException {
186: GroupMembers groupMList = new GroupMembers(
187: SecuredDBObject.SYSTEM_ACCOUNT);
188: groupMList.setDataContext(getDataContext());
189: groupMList.setField(GROUP_NAME_FIELD,
190: getField(GROUP_NAME_FIELD));
191:
192: GroupMembers groupM = null;
193:
194: for (Iterator e = groupMList.searchAndRetrieveList().iterator(); e
195: .hasNext();) {
196: groupM = (GroupMembers) e.next();
197: groupM.delete();
198: }
199:
200: super .delete();
201: } /* delete() */
202:
203: /**
204: * @see com.jcorporate.expresso.core.dbobj.SecuredDBObject
205: */
206: protected synchronized void setupFields() throws DBException {
207: setTargetTable(TABLE_NAME);
208: setDescription("DBuserGroup");
209: setCharset("ISO-8859-1");
210: addField(GROUP_NAME_FIELD, "char", GROUP_NAME_MAX_LEN, false,
211: "groupName");
212: addField(GROUP_DESCRIPTION, "varchar", GROUP_DESCRIP_MAX_LEN,
213: true, "groupDescrip");
214: addField("LoginEvent", "char", 30, true, "loginEvent");
215: setStringFilter(GROUP_NAME_FIELD, "stripFilter");
216: setStringFilter("LoginEvent", "stripFilter");
217: setStringFilter(GROUP_DESCRIPTION, "standardFilter");
218: addKey(GROUP_NAME_FIELD);
219: setLookupObject("LoginEvent",
220: "com.jcorporate.expresso.services.dbobj.Event");
221: addDetail(
222: "com.jcorporate.expresso.services.dbobj.GroupMembers",
223: GROUP_NAME_FIELD, GROUP_NAME_FIELD);
224: } /* setupFields() */
225:
226: /**
227: * Gets the valid values, specifically it returns a map of GroupNames
228: * to GroupDescriptions
229: *
230: * @return a vector of valid values.
231: */
232: public Vector getValues() throws DBException {
233: return getValuesDefault(GROUP_NAME_FIELD, GROUP_DESCRIPTION);
234: } /* getValues() */
235:
236: /**
237: * Populates the default user groups.
238: */
239: public synchronized void populateDefaultValues() throws DBException {
240: UserGroup oneGroup = new UserGroup();
241: oneGroup.setDataContext(getDataContext());
242: oneGroup.setField(GROUP_NAME_FIELD, DEMO_GROUP);
243:
244: if (!oneGroup.find()) {
245: oneGroup.setField(GROUP_NAME_FIELD, DEMO_GROUP);
246: oneGroup.setField(GROUP_DESCRIPTION, "Demonstration Group");
247: oneGroup.add();
248: }
249:
250: oneGroup.clear();
251: oneGroup.setField(GROUP_NAME_FIELD, ALL_USERS_GROUP);
252:
253: if (!oneGroup.find()) {
254: oneGroup.setField(GROUP_NAME_FIELD, ALL_USERS_GROUP);
255: oneGroup.setField(GROUP_DESCRIPTION, Messages
256: .getString("All_Users"));
257: oneGroup.add();
258: }
259: } /* populateDefaultValues() */
260:
261: /**
262: * convenience method
263: *
264: * @return name of group
265: * @throws DBException upon error
266: */
267: public String getGroupName() throws DBException {
268: return getField(GROUP_NAME_FIELD);
269: }
270:
271: /**
272: * convenience method
273: *
274: * @param groupName the new gropu name
275: * @throws DBException upon error
276: */
277: public void setGroupName(String groupName) throws DBException {
278: setField(GROUP_NAME_FIELD, groupName);
279: }
280:
281: /**
282: * @param groupname the new group name
283: * @return group for this name, or null if not found; uses "default" dbcontext
284: * @throws DBException upon error
285: */
286: public static UserGroup getGroup(String groupname)
287: throws DBException {
288: UserGroup result = null;
289: if (groupname != null && groupname.length() > 0) {
290: UserGroup oneGroup = new UserGroup();
291: oneGroup.setDBName(DBConnection.DEFAULT_DB_CONTEXT_NAME);
292: oneGroup.setGroupName(groupname);
293: if (oneGroup.find()) {
294: result = oneGroup;
295: }
296: }
297:
298: return result;
299: }
300:
301: /**
302: * convenience method
303: *
304: * @return java.lang.String the group description
305: * @throws DBException upon error
306: */
307: public String getGroupDescription() throws DBException {
308: return getField(GROUP_DESCRIPTION);
309: }
310:
311: /**
312: * convenience method
313: * @return list of all groups
314: * @throws DBException upon error
315: */
316: public static List getAllGroups() throws DBException {
317: UserGroup search = new UserGroup();
318: return search.searchAndRetrieveList();
319: }
320: } /* UserGroup */
|