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