You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jetspeed-dev@portals.apache.org by ta...@apache.org on 2007/12/05 01:36:56 UTC
svn commit: r601167 - in /portals/jetspeed-2/trunk/applications/j2-admin/src:
java/org/apache/jetspeed/portlets/registration/UserRegistrationPortlet.java
webapp/WEB-INF/portlet.xml
Author: taylor
Date: Tue Dec 4 16:36:55 2007
New Revision: 601167
URL: http://svn.apache.org/viewvc?rev=601167&view=rev
Log:
support edit_defaults on registration portlet
otherwise admins are simply setting up preferences for themselves which is quite useless
Modified:
portals/jetspeed-2/trunk/applications/j2-admin/src/java/org/apache/jetspeed/portlets/registration/UserRegistrationPortlet.java
portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/portlet.xml
Modified: portals/jetspeed-2/trunk/applications/j2-admin/src/java/org/apache/jetspeed/portlets/registration/UserRegistrationPortlet.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/java/org/apache/jetspeed/portlets/registration/UserRegistrationPortlet.java?rev=601167&r1=601166&r2=601167&view=diff
==============================================================================
--- portals/jetspeed-2/trunk/applications/j2-admin/src/java/org/apache/jetspeed/portlets/registration/UserRegistrationPortlet.java (original)
+++ portals/jetspeed-2/trunk/applications/j2-admin/src/java/org/apache/jetspeed/portlets/registration/UserRegistrationPortlet.java Tue Dec 4 16:36:55 2007
@@ -1,844 +1,866 @@
-/*
+/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.jetspeed.portlets.registration;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import javax.portlet.ActionRequest;
-import javax.portlet.ActionResponse;
-import javax.portlet.PortletConfig;
-import javax.portlet.PortletException;
-import javax.portlet.PortletMode;
-import javax.portlet.PortletPreferences;
-import javax.portlet.PortletRequest;
-import javax.portlet.PortletResponse;
-import javax.portlet.RenderRequest;
-import javax.portlet.RenderResponse;
-
-import org.apache.jetspeed.CommonPortletServices;
-import org.apache.jetspeed.PortalReservedParameters;
-import org.apache.jetspeed.administration.AdministrationEmailException;
-import org.apache.jetspeed.administration.PortalAdministration;
-import org.apache.jetspeed.locator.JetspeedTemplateLocator;
-import org.apache.jetspeed.locator.LocatorDescriptor;
-import org.apache.jetspeed.locator.TemplateDescriptor;
-import org.apache.jetspeed.locator.TemplateLocatorException;
-import org.apache.jetspeed.request.RequestContext;
-import org.apache.jetspeed.security.SecurityException;
-import org.apache.jetspeed.security.User;
-import org.apache.jetspeed.security.UserManager;
-import org.apache.portals.bridges.util.PreferencesHelper;
-import org.apache.portals.bridges.velocity.AbstractVelocityMessagingPortlet;
-import org.apache.portals.gems.util.ValidationHelper;
-import org.apache.velocity.context.Context;
-
-/**
- * This portlet allows a logged on user to change its password.
- *
- * @author <a href="mailto:taylor@apache.org">David Sean Taylor</a>
- * @author <a href="mailto:chris@bluesunrise.com">Chris Schaefer</a>
- * @version $Id: $
- */
-public class UserRegistrationPortlet extends AbstractVelocityMessagingPortlet
-{
-
- private PortalAdministration admin;
-
- private UserManager userManager;
-
- // commonly USED attributes
-
- private static final String USER_ATTRIBUTE_EMAIL = "user.business-info.online.email";
-
- // Messages
- private static final String MSG_MESSAGE = "MSG";
-
- private static final String MSG_USERINFO = "user";
-
- private static final String MSG_REGED_USER_MSG = "registeredUserMsg";
-
- // Init Parameters
- private static final String IP_ROLES = "roles"; // comma separated
-
- private static final String IP_GROUPS = "groups"; // comma separated
-
- private static final String IP_TEMPLATE_LOCATION = "emailTemplateLocation";
-
- private static final String IP_TEMPLATE_NAME = "emailTemplateName";
-
- private static final String IP_RULES_NAMES = "rulesNames";
-
- private static final String IP_RULES_VALUES = "rulesValues";
-
- private static final String IP_REDIRECT_PATH = "redirectPath";
-
- private static final String IP_RETURN_URL = "returnURL";
-
- private static final String IP_OPTION_EMAILS_SYSTEM_UNIQUE = "Option_Emails_System_Unique";
-
- private static final String IP_OPTION_GENERATE_PASSWORDS = "Option_Generate_Passwords";
-
- private static final String IP_OPTION_USE_EMAIL_AS_USERNAME = "Option_Use_Email_As_Username";
-
- // Context Variables
- private static final String CTX_RETURN_URL = "returnURL";
-
- private static final String CTX_MESSAGE = "MSG";
-
- private static final String CTX_USERINFO = "user";
-
- private static final String CTX_FIELDS = "fieldsInOrder";
-
- private static final String CTX_OPTIONALS = "optionalMap";
-
- private static final String CTX_REGED_USER_MSG = "registeredUserMsg";
-
- private static final String CTX_OPTION_GENERATE_PASSWORDS = "CTX_Option_Generate_Passwords";
-
- private static final String CTX_OPTION_USE_EMAIL_AS_USERNAME = "CTX_Option_Use_Email_As_Username";
-
- // Resource Bundle
- private static final String RB_EMAIL_SUBJECT = "email.subject.registration";
-
- private static final String PATH_SEPARATOR = "/";
-
- /** email template to use for merging */
- private String templateLocation;
-
- private String templateName;
-
- private JetspeedTemplateLocator templateLocator;
-
- /** localized emailSubject */
- private String emailSubject = null;
-
- /** path where to redirect to after pressing submit on the form */
- private String redirectPath;
-
- /** servlet path of the return url to be printed and href'd in email template */
- private String returnUrlPath;
-
- /** roles */
- private List roles;
-
- /** groups */
- private List groups;
-
- /** profile rules */
- private Map rules;
-
- /** will force the passwords to be generated instead of picked by the user */
- private boolean optionForceGeneratedPasswords = false;
-
- /**
- * will use cause the portlet to use a user request username instead
- * otherwise forces emailaddress
- */
- private boolean optionForceEmailAsUsername = true;
-
- /** will check to make sure the email address is unique to the system */
- private boolean optionForceEmailsToBeSystemUnique = true;
-
- public void init(PortletConfig config) throws PortletException
- {
- super.init(config);
- admin = (PortalAdministration) getPortletContext().getAttribute(
- CommonPortletServices.CPS_PORTAL_ADMINISTRATION);
- if (null == admin) { throw new PortletException(
- "Failed to find the Portal Administration on portlet initialization"); }
- userManager = (UserManager) getPortletContext().getAttribute(
- CommonPortletServices.CPS_USER_MANAGER_COMPONENT);
- if (null == userManager) { throw new PortletException(
- "Failed to find the User Manager on portlet initialization"); }
-
- // roles
- this.roles = getInitParameterList(config, IP_ROLES);
-
- // groups
- this.groups = getInitParameterList(config, IP_GROUPS);
-
- // rules (name,value pairs)
- List names = getInitParameterList(config, IP_RULES_NAMES);
- List values = getInitParameterList(config, IP_RULES_VALUES);
- rules = new HashMap();
- for (int ix = 0; ix < ((names.size() < values.size()) ? names.size()
- : values.size()); ix++)
- {
- rules.put(names.get(ix), values.get(ix));
- }
-
- this.templateLocation = config.getInitParameter(IP_TEMPLATE_LOCATION);
- if (templateLocation == null)
- {
- templateLocation = "/WEB-INF/view/userreg/";
- }
- templateLocation = getPortletContext().getRealPath(templateLocation);
- this.templateName = config.getInitParameter(IP_TEMPLATE_NAME);
- if (templateName == null)
- {
- templateName = "userRegistrationEmail.vm";
- }
-
- ArrayList roots = new ArrayList(1);
- roots.add(templateLocation);
-
- try
- {
- templateLocator = new JetspeedTemplateLocator(roots, "email", getPortletContext().getRealPath("/"));
- templateLocator.start();
- }
- catch (FileNotFoundException e)
- {
- throw new PortletException("Could not start the template locator.", e);
- }
-
- // user attributes ?
-
- this.optionForceEmailsToBeSystemUnique = Boolean.valueOf(
- config.getInitParameter(IP_OPTION_EMAILS_SYSTEM_UNIQUE))
- .booleanValue();
- this.optionForceGeneratedPasswords = Boolean.valueOf(
- config.getInitParameter(IP_OPTION_GENERATE_PASSWORDS))
- .booleanValue();
- this.optionForceEmailAsUsername = Boolean.valueOf(
- config.getInitParameter(IP_OPTION_USE_EMAIL_AS_USERNAME))
- .booleanValue();
- if (this.optionForceEmailAsUsername)
- {
- // just to be sure
- this.optionForceEmailsToBeSystemUnique = true;
- }
- this.returnUrlPath = config.getInitParameter(IP_RETURN_URL);
- this.redirectPath = config.getInitParameter(IP_REDIRECT_PATH);
- }
-
- public void doEdit(RenderRequest request, RenderResponse response)
- throws PortletException, IOException
- {
- response.setContentType("text/html");
- doPreferencesEdit(request, response);
- }
-
- public void doView(RenderRequest request, RenderResponse response)
- throws PortletException, IOException
- {
- response.setContentType("text/html");
- Context context = getContext(request);
-
- Object userinfoObject = this
- .receiveRenderMessage(request, MSG_USERINFO);
- context.put(CTX_USERINFO, userinfoObject);
- context.put(CTX_FIELDS, getListOfNonSpecialFormKeys());
- context.put(CTX_OPTIONALS, getOptionalMap());
- context.put(CTX_MESSAGE, consumeRenderMessage(request, MSG_MESSAGE));
- String guid = request.getParameter("newUserGUID");
- if (guid != null)
- {
- // we'll ignore the possibility of an invalid guid for now.
-
- // NOTE this would be a good place to put the actual registration if
- // that's the process you want to have happen.
-
- ResourceBundle resource = getPortletConfig().getResourceBundle(
- request.getLocale());
- context.put(CTX_REGED_USER_MSG, resource
- .getString("success.login_above"));
- } else
- {
- // not a returning url, but perhaps we just got redirected from the
- // form ?
- // if this is non-null, then we know that we registered
- context.put(CTX_REGED_USER_MSG, consumeRenderMessage(request,
- MSG_REGED_USER_MSG));
- }
- // next two control the existence of some of the fields in the form
- if (this.optionForceEmailAsUsername)
- {
- context.put(CTX_OPTION_USE_EMAIL_AS_USERNAME, "TRUE");
- }
- if (this.optionForceGeneratedPasswords)
- {
- context.put(CTX_OPTION_GENERATE_PASSWORDS, "TRUE");
- }
-
- super.doView(request, response);
- }
-
- private static final Boolean required = new Boolean(true);
-
- private static final Boolean optional = new Boolean(false);
-
- private static final Integer IS_STRING = new Integer(1);
-
- private static final Integer IS_EMAIL = new Integer(2);
-
- private static final Integer IS_PHONE = new Integer(3);
-
- private static final Integer IS_URL = new Integer(4);
-
- private static final Integer IS_BDATE = new Integer(5);
-
- protected List getListOfNonSpecialFormKeys()
- {
- List l = new ArrayList();
- for (int i = 0; i < formKeys.length; i++)
- {
- String key = (String) formKeys[i][0];
- if (key.equals("user.name"))
- {
- // don't put this in
- } else if (key.equals("user.business-info.online.email"))
- {
- // don't put this in
- } else if (key.equals("password"))
- {
- // don't put this in
- } else if (key.equals("verifyPassword"))
- {
- // don't put this in
- } else
- {
- // but DO add this
- l.add(key);
- }
- }
- return l;
- }
-
- protected Map getOptionalMap()
- {
- Map m = new HashMap();
- for (int i = 0; i < formKeys.length; i++)
- {
- boolean isRequired = ((Boolean) formKeys[i][1]).booleanValue();
- if (!isRequired)
- {
- m.put(formKeys[i][0], "");
- }
- }
- return m;
- }
- // PLT name, required, max length, validation type
-
- protected static Object[][] formKeys =
- {
- // the next four items are special cases
-
- // this is the offical email used by jetspeed. You can chnage it, but you have to look around in the code
- {"user.business-info.online.email", required , new Integer(80), IS_EMAIL},
-
- // username is required here
- // chould be commented out if email is used as username...
- {"user.name", required , new Integer(80), IS_STRING},
-
- // These last two are special cases you must have them
- // comment them out here if you use the generated password option
- {"password", required, new Integer(80), IS_STRING},
- {"verifyPassword", required, new Integer(80), IS_STRING},
-
- // the following can be placed in any order, and will appear in that order on the page
-
- // All of the following are optional and are stored as user attributes if collected.
-
- /*
- {"user.bdate", optional , new Integer(25), IS_BDATE}, // Note: store as a string which is a number, time in milliseconds since 1970... see Portlet Spec.
- {"user.gender", optional , new Integer(10), IS_STRING},
- {"user.employer", optional , new Integer(80), IS_STRING},
- */
-
- {"user.department", optional , new Integer(80), IS_STRING},
- /*
- {"user.jobtitle", optional , new Integer(80), IS_STRING},
- {"user.name.prefix", optional , new Integer(10), IS_STRING},
- */
- {"user.name.given", optional , new Integer(30), IS_STRING},
- {"user.name.family", optional , new Integer(30), IS_STRING},
- /*
- {"user.name.middle", optional , new Integer(30), IS_STRING},
- {"user.name.suffix", optional , new Integer(10), IS_STRING},
- {"user.name.nickName", optional , new Integer(30), IS_STRING},
- {"user.home-info.postal.name", optional , new Integer(80), IS_STRING},
- {"user.home-info.postal.street", optional , new Integer(80), IS_STRING},
- {"user.home-info.postal.city", optional , new Integer(80), IS_STRING},
- {"user.home-info.postal.stateprov", optional , new Integer(80), IS_STRING},
- {"user.home-info.postal.postalcode", optional , new Integer(80), IS_STRING},
- {"user.home-info.postal.country", optional , new Integer(80), IS_STRING},
- {"user.home-info.postal.organization", optional , new Integer(80), IS_STRING},
- {"user.home-info.telecom.telephone.intcode", optional , new Integer(80), IS_STRING},
- {"user.home-info.telecom.telephone.loccode", optional , new Integer(80), IS_STRING},
- {"user.home-info.telecom.telephone.number", optional , new Integer(80), IS_PHONE},
- {"user.home-info.telecom.telephone.ext", optional , new Integer(80), IS_STRING},
- {"user.home-info.telecom.telephone.comment", optional , new Integer(80), IS_STRING},
- {"user.home-info.telecom.fax.intcode", optional , new Integer(80), IS_STRING},
- {"user.home-info.telecom.fax.loccode", optional , new Integer(80), IS_STRING},
- {"user.home-info.telecom.fax.number", optional , new Integer(80), IS_STRING},
- {"user.home-info.telecom.fax.ext", optional , new Integer(80), IS_STRING},
- {"user.home-info.telecom.fax.comment", optional , new Integer(80), IS_STRING},
- {"user.home-info.telecom.mobile.intcode", optional , new Integer(80), IS_STRING},
- {"user.home-info.telecom.mobile.loccode", optional , new Integer(80), IS_STRING},
- {"user.home-info.telecom.mobile.number",optional , new Integer(80), IS_PHONE},
- {"user.home-info.telecom.mobile.ext", optional , new Integer(80), IS_STRING},
- {"user.home-info.telecom.mobile.comment", optional , new Integer(80), IS_STRING},
- {"user.home-info.telecom.pager.intcode", optional , new Integer(80), IS_STRING},
- {"user.home-info.telecom.pager.loccode", optional , new Integer(80), IS_STRING},
- {"user.home-info.telecom.pager.number", optional , new Integer(80), IS_PHONE},
- {"user.home-info.telecom.pager.ext", optional , new Integer(80), IS_STRING},
- {"user.home-info.telecom.pager.comment", optional , new Integer(80), IS_STRING},
- {"user.home-info.online.email", optional , new Integer(80), IS_EMAIL},
- {"user.home-info.online.uri", optional , new Integer(80), IS_URL},
- */
- {"user.business-info.postal.name", optional , new Integer(80), IS_STRING},
- {"user.business-info.postal.street", optional , new Integer(80), IS_STRING},
- {"user.business-info.postal.city", optional , new Integer(80), IS_STRING},
- {"user.business-info.postal.stateprov", optional , new Integer(80), IS_STRING},
- {"user.business-info.postal.postalcode", optional , new Integer(80), IS_STRING},
- {"user.business-info.postal.country", optional , new Integer(80), IS_STRING},
- {"user.business-info.postal.organization", optional , new Integer(80), IS_STRING},
- /*
- {"user.business-info.telecom.telephone.intcode", optional , new Integer(80), IS_STRING},
- {"user.business-info.telecom.telephone.loccode", optional , new Integer(80), IS_STRING},
- {"user.business-info.telecom.telephone.number", optional , new Integer(80), IS_PHONE},
- {"user.business-info.telecom.telephone.ext", optional , new Integer(80), IS_STRING},
- {"user.business-info.telecom.telephone.comment", optional , new Integer(80), IS_STRING},
- {"user.business-info.telecom.fax.intcode", optional , new Integer(80), IS_STRING},
- {"user.business-info.telecom.fax.loccode", optional , new Integer(80), IS_STRING},
- {"user.business-info.telecom.fax.number", optional , new Integer(80), IS_PHONE},
- {"user.business-info.telecom.fax.ext", optional , new Integer(80), IS_STRING},
- {"user.business-info.telecom.fax.comment", optional , new Integer(80), IS_STRING},
- {"user.business-info.telecom.mobile.intcode", optional , new Integer(80), IS_STRING},
- {"user.business-info.telecom.mobile.loccode", optional , new Integer(80), IS_STRING},
- {"user.business-info.telecom.mobile.number", optional , new Integer(80), IS_PHONE},
- {"user.business-info.telecom.mobile.ext", optional , new Integer(80), IS_STRING},
- {"user.business-info.telecom.mobile.comment", optional , new Integer(80), IS_STRING},
- {"user.business-info.telecom.pager.intcode", optional , new Integer(80), IS_STRING},
- {"user.business-info.telecom.pager.loccode", optional , new Integer(80), IS_STRING},
- {"user.business-info.telecom.pager.number", optional , new Integer(80), IS_PHONE},
- {"user.business-info.telecom.pager.ext", optional , new Integer(80), IS_STRING},
- {"user.business-info.telecom.pager.comment", optional , new Integer(80), IS_STRING},
-// --- special case see above user.business-info.online.email
- {"user.business-info.online.uri", optional , new Integer(80), IS_URL},
- */
- };
-
- protected boolean validateFormValue(String value, Integer length,
- Integer validationType)
- {
-
- if (validationType.equals(IS_STRING))
- {
- if (!ValidationHelper.isAny(value, true, length.intValue())) { return false; }
- } else if (validationType.equals(IS_EMAIL))
- {
- if (!ValidationHelper
- .isEmailAddress(value, true, length.intValue())) { return false; }
- } else if (validationType.equals(IS_PHONE))
- {
- if (!ValidationHelper.isPhoneNumber(value, true, length.intValue())) { return false; }
- } else if (validationType.equals(IS_URL))
- {
- if (!ValidationHelper.isURL(value, true, length.intValue())) { return false; }
- } else if (validationType.equals(IS_BDATE))
- {
- if (!ValidationHelper.isValidDatetime(value)) { return false; }
- } else
- {
- // unkown type assume string for now
- if (!ValidationHelper.isAny(value, true, length.intValue())) { return false; }
- }
- return true;
-
- }
-
- protected String convertIfNeed(String key, String value)
- {
- if ("user.bdate".equals(key))
- {
- // this one needs conversion
- Date d = ValidationHelper.parseDate(value);
- long timeInmS = d.getTime();
- return "" + timeInmS;
- }
- return value;
- }
-
- public void processAction(ActionRequest actionRequest,
- ActionResponse actionResponse) throws PortletException, IOException
- {
- List errors = new LinkedList();
-
- Map userAttributes = new HashMap();
-
- Map userInfo = new HashMap();
- ResourceBundle resource = getPortletConfig().getResourceBundle(
- actionRequest.getLocale());
-
- if (actionRequest.getPortletMode() == PortletMode.EDIT)
- {
- PortletPreferences prefs = actionRequest.getPreferences();
- PreferencesHelper.requestParamsToPreferences(actionRequest);
- prefs.store();
- actionResponse.setPortletMode(PortletMode.VIEW);
- return;
- }
-
- try
- {
-
- for (int i = 0; i < formKeys.length; i++)
- {
- try
- {
- String key = (String) formKeys[i][0];
- Boolean isRequired = (Boolean) formKeys[i][1];
- String value = actionRequest.getParameter(key);
- if ((value != null) && (value.length() > 0))
- {
-
- userInfo.put(key, value);
-
- // do some validation
- if (!validateFormValue(value, (Integer) formKeys[i][2],
- (Integer) formKeys[i][3]))
- {
- errors.add(resource
- .getString("error.invalid-format." + key));
- }
-
- if (key.startsWith("user."))
- {
- value = convertIfNeed(key, value);
- // we'll assume that these map back to PLT.D values
- userAttributes.put(key, value);
- }
- } else
- {
- // don't have that value or it's too short... is it
- // required ?
- if (isRequired.booleanValue())
- {
- errors.add(resource.getString("error.lacking."
- + key));
- }
- // place an empty version in userInfo anyway
- // so that the template will display the correct fields
- userInfo.put(key, "");
- }
- } catch (MissingResourceException mre)
- {
- errors.add(resource.getString("error.failed_to_add")
- + mre.toString());
- }
-
- }
- // publish the whole map so we can reload the form values on error.
- publishRenderMessage(actionRequest, MSG_USERINFO, userInfo);
-
- // These next checks may duplicate previous checks.
- // however this is a double check given the nature of the values and
- // how they are used.
- if (this.optionForceEmailAsUsername)
- {
- // email is something special
- if (!ValidationHelper.isEmailAddress((String) userInfo
- .get(USER_ATTRIBUTE_EMAIL), true, 80))
- {
- errors.add(resource.getString("error.invalid-format."
- + USER_ATTRIBUTE_EMAIL));
- }
- } else
- {
- if (!ValidationHelper.isAny((String) userInfo.get("user.name"),
- true, 80))
- {
- errors.add(resource.getString("error.lacking.user.name"));
- }
- }
-
- // if we're not generating make sure it's real
- if (!this.optionForceGeneratedPasswords)
- {
- if (!ValidationHelper.isAny((String) userInfo.get("password"),
- true, 25))
- {
- errors.add(resource.getString("error.lacking.password"));
- }
- }
-
- if (optionForceEmailAsUsername)
- {
- // force user.name to be same as email
- userInfo.put("user.name", userInfo.get(USER_ATTRIBUTE_EMAIL));
- }
-
- boolean userIdExistsFlag = true;
- try
- {
- userManager.getUser((String) userInfo.get("user.name"));
- } catch (SecurityException e)
- {
- userIdExistsFlag = false;
- }
- //
- if (userIdExistsFlag)
- {
- errors.add(resource.getString("error.userid_already_exists"));
- publishRenderMessage(actionRequest, MSG_MESSAGE, errors);
- return;
- }
- if (optionForceEmailsToBeSystemUnique)
- {
- boolean emailExistsFlag = true;
- User user = null;
- try
- {
- user = admin.lookupUserFromEmail((String) userInfo
- .get(USER_ATTRIBUTE_EMAIL));
- } catch (AdministrationEmailException e1)
- {
- emailExistsFlag = false;
- }
- if ((emailExistsFlag) || (user != null))
- {
- errors
- .add(resource
- .getString("error.email_already_exists"));
- publishRenderMessage(actionRequest, MSG_MESSAGE, errors);
- return;
- }
-
- }
-
- try
- {
- if (optionForceGeneratedPasswords)
- {
- String password = admin.generatePassword();
- userInfo.put("password", password);
- } else
- {
- if (userInfo.get("password").equals(
- userInfo.get("verifyPassword")))
- {
-
- } else
- {
- errors.add(resource
- .getString("error.two_passwords_do_not_match"));
- publishRenderMessage(actionRequest, MSG_MESSAGE, errors);
- return;
- }
- }
- } catch (Exception e)
- {
- errors.add(resource.getString("error.failed_to_add")
- + e.toString());
- publishRenderMessage(actionRequest, MSG_MESSAGE, errors);
- }
- // make sure no errors have occurred
- if (errors.size() > 0)
- {
- publishRenderMessage(actionRequest, MSG_MESSAGE, errors);
- return;
- }
-
- // Ok, we think we're good to go, let's create the user!
- try
- {
- PortletPreferences prefs = actionRequest.getPreferences();
- String template = prefs.getValue("newUserTemplateDirectory", "");
- if (template.trim().length() == 0)
- template = null;
- String subsiteRootFolder = prefs.getValue("subsiteRootFolder", "");
- if (subsiteRootFolder.trim().length() == 0)
- subsiteRootFolder = null;
- List prefRoles = getPreferencesList(prefs, IP_ROLES);
- if (prefRoles.isEmpty())
- prefRoles = this.roles;
- List prefGroups = getPreferencesList(prefs, IP_GROUPS);
- if (prefGroups.isEmpty())
- prefGroups = this.groups;
-
- List names = getPreferencesList(prefs, IP_RULES_NAMES);
- List values = getPreferencesList(prefs, IP_RULES_VALUES);
- Map profileRules = new HashMap();
- for (int ix = 0; ix < ((names.size() < values.size()) ? names.size()
- : values.size()); ix++)
- {
- profileRules.put(names.get(ix), values.get(ix));
- }
- if (profileRules.isEmpty())
- profileRules = this.rules;
-
- admin.registerUser((String) userInfo.get("user.name"),
- (String) userInfo.get("password"), prefRoles,
- prefGroups, userAttributes, // note use of only
- // PLT.D values here.
- profileRules, template, subsiteRootFolder);
-
- String urlGUID = ForgottenPasswordPortlet.makeGUID(
- (String) userInfo.get("user.name"), (String) userInfo
- .get("password"));
-
- userInfo.put(CTX_RETURN_URL, generateReturnURL(actionRequest,
- actionResponse, urlGUID));
-
- String templ = getTemplatePath(actionRequest, actionResponse);
-
- if (templ == null) { throw new Exception(
- "email template not available"); }
-
- boolean sendEmail = prefs.getValue("SendEmail", "true").equals("true");
- if (sendEmail)
- {
- admin.sendEmail(getPortletConfig(), (String) userInfo
- .get(USER_ATTRIBUTE_EMAIL),
- getEmailSubject(actionRequest), templ, userInfo);
- }
-
- if ((this.optionForceEmailAsUsername)
- || (this.optionForceGeneratedPasswords))
- {
- publishRenderMessage(actionRequest, MSG_REGED_USER_MSG,
- resource.getString("success.check_your_email"));
- } else
- {
- publishRenderMessage(actionRequest, MSG_REGED_USER_MSG,
- resource.getString("success.login_above"));
- }
-
- // put an empty map to "erase" all the user info going forward
- publishRenderMessage(actionRequest, MSG_USERINFO, new HashMap());
-
- actionResponse.sendRedirect(this.generateRedirectURL(
- actionRequest, actionResponse));
-
- } catch (Exception e)
- {
- errors.add(resource.getString("error.failed_to_add")
- + e.toString());
- publishRenderMessage(actionRequest, MSG_MESSAGE, errors);
- }
- } catch (MissingResourceException mre)
- {
- errors.add(resource.getString("error.failed_to_add")
- + mre.toString());
- publishRenderMessage(actionRequest, MSG_MESSAGE, errors);
- } catch (Exception e)
- {
- errors
- .add(resource.getString("error.failed_to_add")
- + e.toString());
- publishRenderMessage(actionRequest, MSG_MESSAGE, errors);
- }
-
- }
-
- protected String getEmailSubject(PortletRequest request)
- {
- ResourceBundle resource = getPortletConfig().getResourceBundle(
- request.getLocale());
- try
- {
- this.emailSubject = resource.getString(RB_EMAIL_SUBJECT);
- } catch (java.util.MissingResourceException mre)
- {
- this.emailSubject = null;
- }
- if (this.emailSubject == null)
- this.emailSubject = "Registration Confirmation";
- return this.emailSubject;
- }
-
- protected List getInitParameterList(PortletConfig config, String ipName)
- {
- String temp = config.getInitParameter(ipName);
- if (temp == null) return new ArrayList();
-
- String[] temps = temp.split("\\,");
- for (int ix = 0; ix < temps.length; ix++)
- temps[ix] = temps[ix].trim();
-
- return Arrays.asList(temps);
- }
-
- protected List getPreferencesList(PortletPreferences prefs, String prefName)
- {
- String temp = prefs.getValue(prefName, "");
- if (temp == null || temp.trim().length() == 0) return new ArrayList();
-
- String[] temps = temp.split("\\,");
- for (int ix = 0; ix < temps.length; ix++)
- temps[ix] = temps[ix].trim();
-
- return Arrays.asList(temps);
- }
-
- protected String generateReturnURL(PortletRequest request,
- PortletResponse response, String urlGUID)
- {
- String fullPath = this.returnUrlPath + "?newUserGUID=" + urlGUID;
- // NOTE: getPortalURL will encode the fullPath for us
- String url = admin.getPortalURL(request, response, fullPath);
- return url;
- }
-
- protected String generateRedirectURL(PortletRequest request,
- PortletResponse response)
- {
- return admin.getPortalURL(request, response, this.redirectPath);
- }
-
-
- protected String getTemplatePath(ActionRequest request, ActionResponse response)
- {
- if (templateLocator == null)
- {
- return templateLocation + PATH_SEPARATOR + templateName;
- }
-
- RequestContext requestContext = (RequestContext) request
- .getAttribute(PortalReservedParameters.REQUEST_CONTEXT_ATTRIBUTE);
- Locale locale = request.getLocale();
-
- try
- {
- LocatorDescriptor locator = templateLocator.createLocatorDescriptor("email");
- locator.setName(templateName);
- locator.setMediaType(requestContext.getMediaType());
- locator.setLanguage(locale.getLanguage());
- locator.setCountry(locale.getCountry());
- TemplateDescriptor template = templateLocator.locateTemplate(locator);
-
- return template.getAppRelativePath();
- }
- catch (TemplateLocatorException e)
- {
- return templateLocation + PATH_SEPARATOR + templateName;
- }
- }
-}
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jetspeed.portlets.registration;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import javax.portlet.ActionRequest;
+import javax.portlet.ActionResponse;
+import javax.portlet.PortletConfig;
+import javax.portlet.PortletException;
+import javax.portlet.PortletMode;
+import javax.portlet.PortletPreferences;
+import javax.portlet.PortletRequest;
+import javax.portlet.PortletResponse;
+import javax.portlet.RenderRequest;
+import javax.portlet.RenderResponse;
+import javax.portlet.WindowState;
+
+import org.apache.jetspeed.CommonPortletServices;
+import org.apache.jetspeed.JetspeedActions;
+import org.apache.jetspeed.PortalReservedParameters;
+import org.apache.jetspeed.administration.AdministrationEmailException;
+import org.apache.jetspeed.administration.PortalAdministration;
+import org.apache.jetspeed.locator.JetspeedTemplateLocator;
+import org.apache.jetspeed.locator.LocatorDescriptor;
+import org.apache.jetspeed.locator.TemplateDescriptor;
+import org.apache.jetspeed.locator.TemplateLocatorException;
+import org.apache.jetspeed.request.RequestContext;
+import org.apache.jetspeed.security.SecurityException;
+import org.apache.jetspeed.security.User;
+import org.apache.jetspeed.security.UserManager;
+import org.apache.portals.bridges.util.PreferencesHelper;
+import org.apache.portals.bridges.velocity.AbstractVelocityMessagingPortlet;
+import org.apache.portals.gems.util.ValidationHelper;
+import org.apache.velocity.context.Context;
+
+/**
+ * This portlet allows a logged on user to change its password.
+ *
+ * @author <a href="mailto:taylor@apache.org">David Sean Taylor</a>
+ * @author <a href="mailto:chris@bluesunrise.com">Chris Schaefer</a>
+ * @version $Id: $
+ */
+public class UserRegistrationPortlet extends AbstractVelocityMessagingPortlet
+{
+
+ private PortalAdministration admin;
+
+ private UserManager userManager;
+
+ // commonly USED attributes
+
+ private static final String USER_ATTRIBUTE_EMAIL = "user.business-info.online.email";
+
+ // Messages
+ private static final String MSG_MESSAGE = "MSG";
+
+ private static final String MSG_USERINFO = "user";
+
+ private static final String MSG_REGED_USER_MSG = "registeredUserMsg";
+
+ // Init Parameters
+ private static final String IP_ROLES = "roles"; // comma separated
+
+ private static final String IP_GROUPS = "groups"; // comma separated
+
+ private static final String IP_TEMPLATE_LOCATION = "emailTemplateLocation";
+
+ private static final String IP_TEMPLATE_NAME = "emailTemplateName";
+
+ private static final String IP_RULES_NAMES = "rulesNames";
+
+ private static final String IP_RULES_VALUES = "rulesValues";
+
+ private static final String IP_REDIRECT_PATH = "redirectPath";
+
+ private static final String IP_RETURN_URL = "returnURL";
+
+ private static final String IP_OPTION_EMAILS_SYSTEM_UNIQUE = "Option_Emails_System_Unique";
+
+ private static final String IP_OPTION_GENERATE_PASSWORDS = "Option_Generate_Passwords";
+
+ private static final String IP_OPTION_USE_EMAIL_AS_USERNAME = "Option_Use_Email_As_Username";
+
+ // Context Variables
+ private static final String CTX_RETURN_URL = "returnURL";
+
+ private static final String CTX_MESSAGE = "MSG";
+
+ private static final String CTX_USERINFO = "user";
+
+ private static final String CTX_FIELDS = "fieldsInOrder";
+
+ private static final String CTX_OPTIONALS = "optionalMap";
+
+ private static final String CTX_REGED_USER_MSG = "registeredUserMsg";
+
+ private static final String CTX_OPTION_GENERATE_PASSWORDS = "CTX_Option_Generate_Passwords";
+
+ private static final String CTX_OPTION_USE_EMAIL_AS_USERNAME = "CTX_Option_Use_Email_As_Username";
+
+ // Resource Bundle
+ private static final String RB_EMAIL_SUBJECT = "email.subject.registration";
+
+ private static final String PATH_SEPARATOR = "/";
+
+ /** email template to use for merging */
+ private String templateLocation;
+
+ private String templateName;
+
+ private JetspeedTemplateLocator templateLocator;
+
+ /** localized emailSubject */
+ private String emailSubject = null;
+
+ /** path where to redirect to after pressing submit on the form */
+ private String redirectPath;
+
+ /** servlet path of the return url to be printed and href'd in email template */
+ private String returnUrlPath;
+
+ /** roles */
+ private List roles;
+
+ /** groups */
+ private List groups;
+
+ /** profile rules */
+ private Map rules;
+
+ /** will force the passwords to be generated instead of picked by the user */
+ private boolean optionForceGeneratedPasswords = false;
+
+ /**
+ * will use cause the portlet to use a user request username instead
+ * otherwise forces emailaddress
+ */
+ private boolean optionForceEmailAsUsername = true;
+
+ /** will check to make sure the email address is unique to the system */
+ private boolean optionForceEmailsToBeSystemUnique = true;
+
+ public void init(PortletConfig config) throws PortletException
+ {
+ super.init(config);
+ admin = (PortalAdministration) getPortletContext().getAttribute(
+ CommonPortletServices.CPS_PORTAL_ADMINISTRATION);
+ if (null == admin) { throw new PortletException(
+ "Failed to find the Portal Administration on portlet initialization"); }
+ userManager = (UserManager) getPortletContext().getAttribute(
+ CommonPortletServices.CPS_USER_MANAGER_COMPONENT);
+ if (null == userManager) { throw new PortletException(
+ "Failed to find the User Manager on portlet initialization"); }
+
+ // roles
+ this.roles = getInitParameterList(config, IP_ROLES);
+
+ // groups
+ this.groups = getInitParameterList(config, IP_GROUPS);
+
+ // rules (name,value pairs)
+ List names = getInitParameterList(config, IP_RULES_NAMES);
+ List values = getInitParameterList(config, IP_RULES_VALUES);
+ rules = new HashMap();
+ for (int ix = 0; ix < ((names.size() < values.size()) ? names.size()
+ : values.size()); ix++)
+ {
+ rules.put(names.get(ix), values.get(ix));
+ }
+
+ this.templateLocation = config.getInitParameter(IP_TEMPLATE_LOCATION);
+ if (templateLocation == null)
+ {
+ templateLocation = "/WEB-INF/view/userreg/";
+ }
+ templateLocation = getPortletContext().getRealPath(templateLocation);
+ this.templateName = config.getInitParameter(IP_TEMPLATE_NAME);
+ if (templateName == null)
+ {
+ templateName = "userRegistrationEmail.vm";
+ }
+
+ ArrayList roots = new ArrayList(1);
+ roots.add(templateLocation);
+
+ try
+ {
+ templateLocator = new JetspeedTemplateLocator(roots, "email", getPortletContext().getRealPath("/"));
+ templateLocator.start();
+ }
+ catch (FileNotFoundException e)
+ {
+ throw new PortletException("Could not start the template locator.", e);
+ }
+
+ // user attributes ?
+
+ this.optionForceEmailsToBeSystemUnique = Boolean.valueOf(
+ config.getInitParameter(IP_OPTION_EMAILS_SYSTEM_UNIQUE))
+ .booleanValue();
+ this.optionForceGeneratedPasswords = Boolean.valueOf(
+ config.getInitParameter(IP_OPTION_GENERATE_PASSWORDS))
+ .booleanValue();
+ this.optionForceEmailAsUsername = Boolean.valueOf(
+ config.getInitParameter(IP_OPTION_USE_EMAIL_AS_USERNAME))
+ .booleanValue();
+ if (this.optionForceEmailAsUsername)
+ {
+ // just to be sure
+ this.optionForceEmailsToBeSystemUnique = true;
+ }
+ this.returnUrlPath = config.getInitParameter(IP_RETURN_URL);
+ this.redirectPath = config.getInitParameter(IP_REDIRECT_PATH);
+ }
+
+ public void doEdit(RenderRequest request, RenderResponse response)
+ throws PortletException, IOException
+ {
+ response.setContentType("text/html");
+ doPreferencesEdit(request, response);
+ }
+
+ protected void doDispatch(RenderRequest request, RenderResponse response) throws PortletException, IOException
+ {
+ if ( !request.getWindowState().equals(WindowState.MINIMIZED))
+ {
+ PortletMode curMode = request.getPortletMode();
+ if (JetspeedActions.EDIT_DEFAULTS_MODE.equals(curMode))
+ {
+ //request.setAttribute(PARAM_EDIT_PAGE, DEFAULT_EDIT_DEFAULTS_PAGE);
+ doEdit(request, response);
+ }
+ else
+ {
+ super.doDispatch(request, response);
+ }
+ }
+
+ }
+
+ public void doView(RenderRequest request, RenderResponse response)
+ throws PortletException, IOException
+ {
+ response.setContentType("text/html");
+ Context context = getContext(request);
+
+ Object userinfoObject = this
+ .receiveRenderMessage(request, MSG_USERINFO);
+ context.put(CTX_USERINFO, userinfoObject);
+ context.put(CTX_FIELDS, getListOfNonSpecialFormKeys());
+ context.put(CTX_OPTIONALS, getOptionalMap());
+ context.put(CTX_MESSAGE, consumeRenderMessage(request, MSG_MESSAGE));
+ String guid = request.getParameter("newUserGUID");
+ if (guid != null)
+ {
+ // we'll ignore the possibility of an invalid guid for now.
+
+ // NOTE this would be a good place to put the actual registration if
+ // that's the process you want to have happen.
+
+ ResourceBundle resource = getPortletConfig().getResourceBundle(
+ request.getLocale());
+ context.put(CTX_REGED_USER_MSG, resource
+ .getString("success.login_above"));
+ } else
+ {
+ // not a returning url, but perhaps we just got redirected from the
+ // form ?
+ // if this is non-null, then we know that we registered
+ context.put(CTX_REGED_USER_MSG, consumeRenderMessage(request,
+ MSG_REGED_USER_MSG));
+ }
+ // next two control the existence of some of the fields in the form
+ if (this.optionForceEmailAsUsername)
+ {
+ context.put(CTX_OPTION_USE_EMAIL_AS_USERNAME, "TRUE");
+ }
+ if (this.optionForceGeneratedPasswords)
+ {
+ context.put(CTX_OPTION_GENERATE_PASSWORDS, "TRUE");
+ }
+
+ super.doView(request, response);
+ }
+
+ private static final Boolean required = new Boolean(true);
+
+ private static final Boolean optional = new Boolean(false);
+
+ private static final Integer IS_STRING = new Integer(1);
+
+ private static final Integer IS_EMAIL = new Integer(2);
+
+ private static final Integer IS_PHONE = new Integer(3);
+
+ private static final Integer IS_URL = new Integer(4);
+
+ private static final Integer IS_BDATE = new Integer(5);
+
+ protected List getListOfNonSpecialFormKeys()
+ {
+ List l = new ArrayList();
+ for (int i = 0; i < formKeys.length; i++)
+ {
+ String key = (String) formKeys[i][0];
+ if (key.equals("user.name"))
+ {
+ // don't put this in
+ } else if (key.equals("user.business-info.online.email"))
+ {
+ // don't put this in
+ } else if (key.equals("password"))
+ {
+ // don't put this in
+ } else if (key.equals("verifyPassword"))
+ {
+ // don't put this in
+ } else
+ {
+ // but DO add this
+ l.add(key);
+ }
+ }
+ return l;
+ }
+
+ protected Map getOptionalMap()
+ {
+ Map m = new HashMap();
+ for (int i = 0; i < formKeys.length; i++)
+ {
+ boolean isRequired = ((Boolean) formKeys[i][1]).booleanValue();
+ if (!isRequired)
+ {
+ m.put(formKeys[i][0], "");
+ }
+ }
+ return m;
+ }
+ // PLT name, required, max length, validation type
+
+ protected static Object[][] formKeys =
+ {
+ // the next four items are special cases
+
+ // this is the offical email used by jetspeed. You can chnage it, but you have to look around in the code
+ {"user.business-info.online.email", required , new Integer(80), IS_EMAIL},
+
+ // username is required here
+ // chould be commented out if email is used as username...
+ {"user.name", required , new Integer(80), IS_STRING},
+
+ // These last two are special cases you must have them
+ // comment them out here if you use the generated password option
+ {"password", required, new Integer(80), IS_STRING},
+ {"verifyPassword", required, new Integer(80), IS_STRING},
+
+ // the following can be placed in any order, and will appear in that order on the page
+
+ // All of the following are optional and are stored as user attributes if collected.
+
+ /*
+ {"user.bdate", optional , new Integer(25), IS_BDATE}, // Note: store as a string which is a number, time in milliseconds since 1970... see Portlet Spec.
+ {"user.gender", optional , new Integer(10), IS_STRING},
+ {"user.employer", optional , new Integer(80), IS_STRING},
+ */
+
+ {"user.department", optional , new Integer(80), IS_STRING},
+ /*
+ {"user.jobtitle", optional , new Integer(80), IS_STRING},
+ {"user.name.prefix", optional , new Integer(10), IS_STRING},
+ */
+ {"user.name.given", optional , new Integer(30), IS_STRING},
+ {"user.name.family", optional , new Integer(30), IS_STRING},
+ /*
+ {"user.name.middle", optional , new Integer(30), IS_STRING},
+ {"user.name.suffix", optional , new Integer(10), IS_STRING},
+ {"user.name.nickName", optional , new Integer(30), IS_STRING},
+ {"user.home-info.postal.name", optional , new Integer(80), IS_STRING},
+ {"user.home-info.postal.street", optional , new Integer(80), IS_STRING},
+ {"user.home-info.postal.city", optional , new Integer(80), IS_STRING},
+ {"user.home-info.postal.stateprov", optional , new Integer(80), IS_STRING},
+ {"user.home-info.postal.postalcode", optional , new Integer(80), IS_STRING},
+ {"user.home-info.postal.country", optional , new Integer(80), IS_STRING},
+ {"user.home-info.postal.organization", optional , new Integer(80), IS_STRING},
+ {"user.home-info.telecom.telephone.intcode", optional , new Integer(80), IS_STRING},
+ {"user.home-info.telecom.telephone.loccode", optional , new Integer(80), IS_STRING},
+ {"user.home-info.telecom.telephone.number", optional , new Integer(80), IS_PHONE},
+ {"user.home-info.telecom.telephone.ext", optional , new Integer(80), IS_STRING},
+ {"user.home-info.telecom.telephone.comment", optional , new Integer(80), IS_STRING},
+ {"user.home-info.telecom.fax.intcode", optional , new Integer(80), IS_STRING},
+ {"user.home-info.telecom.fax.loccode", optional , new Integer(80), IS_STRING},
+ {"user.home-info.telecom.fax.number", optional , new Integer(80), IS_STRING},
+ {"user.home-info.telecom.fax.ext", optional , new Integer(80), IS_STRING},
+ {"user.home-info.telecom.fax.comment", optional , new Integer(80), IS_STRING},
+ {"user.home-info.telecom.mobile.intcode", optional , new Integer(80), IS_STRING},
+ {"user.home-info.telecom.mobile.loccode", optional , new Integer(80), IS_STRING},
+ {"user.home-info.telecom.mobile.number",optional , new Integer(80), IS_PHONE},
+ {"user.home-info.telecom.mobile.ext", optional , new Integer(80), IS_STRING},
+ {"user.home-info.telecom.mobile.comment", optional , new Integer(80), IS_STRING},
+ {"user.home-info.telecom.pager.intcode", optional , new Integer(80), IS_STRING},
+ {"user.home-info.telecom.pager.loccode", optional , new Integer(80), IS_STRING},
+ {"user.home-info.telecom.pager.number", optional , new Integer(80), IS_PHONE},
+ {"user.home-info.telecom.pager.ext", optional , new Integer(80), IS_STRING},
+ {"user.home-info.telecom.pager.comment", optional , new Integer(80), IS_STRING},
+ {"user.home-info.online.email", optional , new Integer(80), IS_EMAIL},
+ {"user.home-info.online.uri", optional , new Integer(80), IS_URL},
+ */
+ {"user.business-info.postal.name", optional , new Integer(80), IS_STRING},
+ {"user.business-info.postal.street", optional , new Integer(80), IS_STRING},
+ {"user.business-info.postal.city", optional , new Integer(80), IS_STRING},
+ {"user.business-info.postal.stateprov", optional , new Integer(80), IS_STRING},
+ {"user.business-info.postal.postalcode", optional , new Integer(80), IS_STRING},
+ {"user.business-info.postal.country", optional , new Integer(80), IS_STRING},
+ {"user.business-info.postal.organization", optional , new Integer(80), IS_STRING},
+ /*
+ {"user.business-info.telecom.telephone.intcode", optional , new Integer(80), IS_STRING},
+ {"user.business-info.telecom.telephone.loccode", optional , new Integer(80), IS_STRING},
+ {"user.business-info.telecom.telephone.number", optional , new Integer(80), IS_PHONE},
+ {"user.business-info.telecom.telephone.ext", optional , new Integer(80), IS_STRING},
+ {"user.business-info.telecom.telephone.comment", optional , new Integer(80), IS_STRING},
+ {"user.business-info.telecom.fax.intcode", optional , new Integer(80), IS_STRING},
+ {"user.business-info.telecom.fax.loccode", optional , new Integer(80), IS_STRING},
+ {"user.business-info.telecom.fax.number", optional , new Integer(80), IS_PHONE},
+ {"user.business-info.telecom.fax.ext", optional , new Integer(80), IS_STRING},
+ {"user.business-info.telecom.fax.comment", optional , new Integer(80), IS_STRING},
+ {"user.business-info.telecom.mobile.intcode", optional , new Integer(80), IS_STRING},
+ {"user.business-info.telecom.mobile.loccode", optional , new Integer(80), IS_STRING},
+ {"user.business-info.telecom.mobile.number", optional , new Integer(80), IS_PHONE},
+ {"user.business-info.telecom.mobile.ext", optional , new Integer(80), IS_STRING},
+ {"user.business-info.telecom.mobile.comment", optional , new Integer(80), IS_STRING},
+ {"user.business-info.telecom.pager.intcode", optional , new Integer(80), IS_STRING},
+ {"user.business-info.telecom.pager.loccode", optional , new Integer(80), IS_STRING},
+ {"user.business-info.telecom.pager.number", optional , new Integer(80), IS_PHONE},
+ {"user.business-info.telecom.pager.ext", optional , new Integer(80), IS_STRING},
+ {"user.business-info.telecom.pager.comment", optional , new Integer(80), IS_STRING},
+// --- special case see above user.business-info.online.email
+ {"user.business-info.online.uri", optional , new Integer(80), IS_URL},
+ */
+ };
+
+ protected boolean validateFormValue(String value, Integer length,
+ Integer validationType)
+ {
+
+ if (validationType.equals(IS_STRING))
+ {
+ if (!ValidationHelper.isAny(value, true, length.intValue())) { return false; }
+ } else if (validationType.equals(IS_EMAIL))
+ {
+ if (!ValidationHelper
+ .isEmailAddress(value, true, length.intValue())) { return false; }
+ } else if (validationType.equals(IS_PHONE))
+ {
+ if (!ValidationHelper.isPhoneNumber(value, true, length.intValue())) { return false; }
+ } else if (validationType.equals(IS_URL))
+ {
+ if (!ValidationHelper.isURL(value, true, length.intValue())) { return false; }
+ } else if (validationType.equals(IS_BDATE))
+ {
+ if (!ValidationHelper.isValidDatetime(value)) { return false; }
+ } else
+ {
+ // unkown type assume string for now
+ if (!ValidationHelper.isAny(value, true, length.intValue())) { return false; }
+ }
+ return true;
+
+ }
+
+ protected String convertIfNeed(String key, String value)
+ {
+ if ("user.bdate".equals(key))
+ {
+ // this one needs conversion
+ Date d = ValidationHelper.parseDate(value);
+ long timeInmS = d.getTime();
+ return "" + timeInmS;
+ }
+ return value;
+ }
+
+ public void processAction(ActionRequest actionRequest,
+ ActionResponse actionResponse) throws PortletException, IOException
+ {
+ List errors = new LinkedList();
+
+ Map userAttributes = new HashMap();
+
+ Map userInfo = new HashMap();
+ ResourceBundle resource = getPortletConfig().getResourceBundle(
+ actionRequest.getLocale());
+
+ PortletMode curMode = actionRequest.getPortletMode();
+ if (curMode == PortletMode.EDIT ||
+ curMode == JetspeedActions.EDIT_DEFAULTS_MODE)
+ {
+ PortletPreferences prefs = actionRequest.getPreferences();
+ PreferencesHelper.requestParamsToPreferences(actionRequest);
+ prefs.store();
+ actionResponse.setPortletMode(PortletMode.VIEW);
+ return;
+ }
+
+ try
+ {
+
+ for (int i = 0; i < formKeys.length; i++)
+ {
+ try
+ {
+ String key = (String) formKeys[i][0];
+ Boolean isRequired = (Boolean) formKeys[i][1];
+ String value = actionRequest.getParameter(key);
+ if ((value != null) && (value.length() > 0))
+ {
+
+ userInfo.put(key, value);
+
+ // do some validation
+ if (!validateFormValue(value, (Integer) formKeys[i][2],
+ (Integer) formKeys[i][3]))
+ {
+ errors.add(resource
+ .getString("error.invalid-format." + key));
+ }
+
+ if (key.startsWith("user."))
+ {
+ value = convertIfNeed(key, value);
+ // we'll assume that these map back to PLT.D values
+ userAttributes.put(key, value);
+ }
+ } else
+ {
+ // don't have that value or it's too short... is it
+ // required ?
+ if (isRequired.booleanValue())
+ {
+ errors.add(resource.getString("error.lacking."
+ + key));
+ }
+ // place an empty version in userInfo anyway
+ // so that the template will display the correct fields
+ userInfo.put(key, "");
+ }
+ } catch (MissingResourceException mre)
+ {
+ errors.add(resource.getString("error.failed_to_add")
+ + mre.toString());
+ }
+
+ }
+ // publish the whole map so we can reload the form values on error.
+ publishRenderMessage(actionRequest, MSG_USERINFO, userInfo);
+
+ // These next checks may duplicate previous checks.
+ // however this is a double check given the nature of the values and
+ // how they are used.
+ if (this.optionForceEmailAsUsername)
+ {
+ // email is something special
+ if (!ValidationHelper.isEmailAddress((String) userInfo
+ .get(USER_ATTRIBUTE_EMAIL), true, 80))
+ {
+ errors.add(resource.getString("error.invalid-format."
+ + USER_ATTRIBUTE_EMAIL));
+ }
+ } else
+ {
+ if (!ValidationHelper.isAny((String) userInfo.get("user.name"),
+ true, 80))
+ {
+ errors.add(resource.getString("error.lacking.user.name"));
+ }
+ }
+
+ // if we're not generating make sure it's real
+ if (!this.optionForceGeneratedPasswords)
+ {
+ if (!ValidationHelper.isAny((String) userInfo.get("password"),
+ true, 25))
+ {
+ errors.add(resource.getString("error.lacking.password"));
+ }
+ }
+
+ if (optionForceEmailAsUsername)
+ {
+ // force user.name to be same as email
+ userInfo.put("user.name", userInfo.get(USER_ATTRIBUTE_EMAIL));
+ }
+
+ boolean userIdExistsFlag = true;
+ try
+ {
+ userManager.getUser((String) userInfo.get("user.name"));
+ } catch (SecurityException e)
+ {
+ userIdExistsFlag = false;
+ }
+ //
+ if (userIdExistsFlag)
+ {
+ errors.add(resource.getString("error.userid_already_exists"));
+ publishRenderMessage(actionRequest, MSG_MESSAGE, errors);
+ return;
+ }
+ if (optionForceEmailsToBeSystemUnique)
+ {
+ boolean emailExistsFlag = true;
+ User user = null;
+ try
+ {
+ user = admin.lookupUserFromEmail((String) userInfo
+ .get(USER_ATTRIBUTE_EMAIL));
+ } catch (AdministrationEmailException e1)
+ {
+ emailExistsFlag = false;
+ }
+ if ((emailExistsFlag) || (user != null))
+ {
+ errors
+ .add(resource
+ .getString("error.email_already_exists"));
+ publishRenderMessage(actionRequest, MSG_MESSAGE, errors);
+ return;
+ }
+
+ }
+
+ try
+ {
+ if (optionForceGeneratedPasswords)
+ {
+ String password = admin.generatePassword();
+ userInfo.put("password", password);
+ } else
+ {
+ if (userInfo.get("password").equals(
+ userInfo.get("verifyPassword")))
+ {
+
+ } else
+ {
+ errors.add(resource
+ .getString("error.two_passwords_do_not_match"));
+ publishRenderMessage(actionRequest, MSG_MESSAGE, errors);
+ return;
+ }
+ }
+ } catch (Exception e)
+ {
+ errors.add(resource.getString("error.failed_to_add")
+ + e.toString());
+ publishRenderMessage(actionRequest, MSG_MESSAGE, errors);
+ }
+ // make sure no errors have occurred
+ if (errors.size() > 0)
+ {
+ publishRenderMessage(actionRequest, MSG_MESSAGE, errors);
+ return;
+ }
+
+ // Ok, we think we're good to go, let's create the user!
+ try
+ {
+ PortletPreferences prefs = actionRequest.getPreferences();
+ String template = prefs.getValue("newUserTemplateDirectory", "");
+ if (template.trim().length() == 0)
+ template = null;
+ String subsiteRootFolder = prefs.getValue("subsiteRootFolder", "");
+ if (subsiteRootFolder.trim().length() == 0)
+ subsiteRootFolder = null;
+ List prefRoles = getPreferencesList(prefs, IP_ROLES);
+ if (prefRoles.isEmpty())
+ prefRoles = this.roles;
+ List prefGroups = getPreferencesList(prefs, IP_GROUPS);
+ if (prefGroups.isEmpty())
+ prefGroups = this.groups;
+
+ List names = getPreferencesList(prefs, IP_RULES_NAMES);
+ List values = getPreferencesList(prefs, IP_RULES_VALUES);
+ Map profileRules = new HashMap();
+ for (int ix = 0; ix < ((names.size() < values.size()) ? names.size()
+ : values.size()); ix++)
+ {
+ profileRules.put(names.get(ix), values.get(ix));
+ }
+ if (profileRules.isEmpty())
+ profileRules = this.rules;
+
+ admin.registerUser((String) userInfo.get("user.name"),
+ (String) userInfo.get("password"), prefRoles,
+ prefGroups, userAttributes, // note use of only
+ // PLT.D values here.
+ profileRules, template, subsiteRootFolder);
+
+ String urlGUID = ForgottenPasswordPortlet.makeGUID(
+ (String) userInfo.get("user.name"), (String) userInfo
+ .get("password"));
+
+ userInfo.put(CTX_RETURN_URL, generateReturnURL(actionRequest,
+ actionResponse, urlGUID));
+
+ String templ = getTemplatePath(actionRequest, actionResponse);
+
+ if (templ == null) { throw new Exception(
+ "email template not available"); }
+
+ boolean sendEmail = prefs.getValue("SendEmail", "true").equals("true");
+ if (sendEmail)
+ {
+ admin.sendEmail(getPortletConfig(), (String) userInfo
+ .get(USER_ATTRIBUTE_EMAIL),
+ getEmailSubject(actionRequest), templ, userInfo);
+ }
+
+ if ((this.optionForceEmailAsUsername)
+ || (this.optionForceGeneratedPasswords))
+ {
+ publishRenderMessage(actionRequest, MSG_REGED_USER_MSG,
+ resource.getString("success.check_your_email"));
+ } else
+ {
+ publishRenderMessage(actionRequest, MSG_REGED_USER_MSG,
+ resource.getString("success.login_above"));
+ }
+
+ // put an empty map to "erase" all the user info going forward
+ publishRenderMessage(actionRequest, MSG_USERINFO, new HashMap());
+
+ actionResponse.sendRedirect(this.generateRedirectURL(
+ actionRequest, actionResponse));
+
+ } catch (Exception e)
+ {
+ errors.add(resource.getString("error.failed_to_add")
+ + e.toString());
+ publishRenderMessage(actionRequest, MSG_MESSAGE, errors);
+ }
+ } catch (MissingResourceException mre)
+ {
+ errors.add(resource.getString("error.failed_to_add")
+ + mre.toString());
+ publishRenderMessage(actionRequest, MSG_MESSAGE, errors);
+ } catch (Exception e)
+ {
+ errors
+ .add(resource.getString("error.failed_to_add")
+ + e.toString());
+ publishRenderMessage(actionRequest, MSG_MESSAGE, errors);
+ }
+
+ }
+
+ protected String getEmailSubject(PortletRequest request)
+ {
+ ResourceBundle resource = getPortletConfig().getResourceBundle(
+ request.getLocale());
+ try
+ {
+ this.emailSubject = resource.getString(RB_EMAIL_SUBJECT);
+ } catch (java.util.MissingResourceException mre)
+ {
+ this.emailSubject = null;
+ }
+ if (this.emailSubject == null)
+ this.emailSubject = "Registration Confirmation";
+ return this.emailSubject;
+ }
+
+ protected List getInitParameterList(PortletConfig config, String ipName)
+ {
+ String temp = config.getInitParameter(ipName);
+ if (temp == null) return new ArrayList();
+
+ String[] temps = temp.split("\\,");
+ for (int ix = 0; ix < temps.length; ix++)
+ temps[ix] = temps[ix].trim();
+
+ return Arrays.asList(temps);
+ }
+
+ protected List getPreferencesList(PortletPreferences prefs, String prefName)
+ {
+ String temp = prefs.getValue(prefName, "");
+ if (temp == null || temp.trim().length() == 0) return new ArrayList();
+
+ String[] temps = temp.split("\\,");
+ for (int ix = 0; ix < temps.length; ix++)
+ temps[ix] = temps[ix].trim();
+
+ return Arrays.asList(temps);
+ }
+
+ protected String generateReturnURL(PortletRequest request,
+ PortletResponse response, String urlGUID)
+ {
+ String fullPath = this.returnUrlPath + "?newUserGUID=" + urlGUID;
+ // NOTE: getPortalURL will encode the fullPath for us
+ String url = admin.getPortalURL(request, response, fullPath);
+ return url;
+ }
+
+ protected String generateRedirectURL(PortletRequest request,
+ PortletResponse response)
+ {
+ return admin.getPortalURL(request, response, this.redirectPath);
+ }
+
+
+ protected String getTemplatePath(ActionRequest request, ActionResponse response)
+ {
+ if (templateLocator == null)
+ {
+ return templateLocation + PATH_SEPARATOR + templateName;
+ }
+
+ RequestContext requestContext = (RequestContext) request
+ .getAttribute(PortalReservedParameters.REQUEST_CONTEXT_ATTRIBUTE);
+ Locale locale = request.getLocale();
+
+ try
+ {
+ LocatorDescriptor locator = templateLocator.createLocatorDescriptor("email");
+ locator.setName(templateName);
+ locator.setMediaType(requestContext.getMediaType());
+ locator.setLanguage(locale.getLanguage());
+ locator.setCountry(locale.getCountry());
+ TemplateDescriptor template = templateLocator.locateTemplate(locator);
+
+ return template.getAppRelativePath();
+ }
+ catch (TemplateLocatorException e)
+ {
+ return templateLocation + PATH_SEPARATOR + templateName;
+ }
+ }
+}
Modified: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/portlet.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/portlet.xml?rev=601167&r1=601166&r2=601167&view=diff
==============================================================================
--- portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/portlet.xml (original)
+++ portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/portlet.xml Tue Dec 4 16:36:55 2007
@@ -1170,6 +1170,8 @@
<mime-type>text/html</mime-type>
<portlet-mode>VIEW</portlet-mode>
<portlet-mode>EDIT</portlet-mode>
+ <!-- support custom edit_defaults mode -->
+ <portlet-mode>edit_defaults</portlet-mode>
</supports>
<supported-locale>en</supported-locale>
<supported-locale>ja</supported-locale>
@@ -1894,6 +1896,11 @@
<keywords>admin,config,custom</keywords>
</portlet-info>
</portlet>
+
+ <custom-portlet-mode>
+ <description>a Custom Edit_defaults Mode</description>
+ <portlet-mode>edit_defaults</portlet-mode>
+ </custom-portlet-mode>
</portlet-app>
---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@portals.apache.org
For additional commands, e-mail: jetspeed-dev-help@portals.apache.org