UserProfileChanger
I don't know that this is the right approach for everyone, but I wrote this ServletContextListener to apply the user profile changes necessary when trying out different layout managers.
The source code
UserProfileChanger
/* Copyright 2005 The JA-SIG Collaborative. All rights reserved.
* See license distributed with this file and
* available online at http://www.uportal.org/license.html
*/
package org.jasig.portal.layout;
import java.sql.Types;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.sql.DataSource;
import org.jasig.portal.RDBMServices;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.object.SqlUpdate;
/**
* A ContextListener that at Context initialization updates the
* UP_USER_PROFILE table to set the appropriate structure and theme
* stylesheets for the layout management scheme.
* @version $Revision:$ $Date:$
*/
public class UserProfileChanger implements ServletContextListener {
/**
* The name of the servlet context parameter the value of which should be the Integer keying to the
* structure stylesheet we would like to use.
*/
public String DESIRED_STRUC_SS_ID_PARAM = "org.jasig.portal.layout.UserProfileChanger.STRUCT_SS_ID";
/**
* The name of the servlet context parameter the value of which should be the Integer keying to the
* theme stylesheet we would like to use.
*/
public String DESIRED_THEME_SS_ID_PARAM = "org.jasig.portal.layout.UserProfileChanger.DESIRED_THEME_SS_ID";
/**
* The name of the servlet context parameter the value of which should be the Integer keying to the
* theme stylesheet we are replacing.
*/
public String CURRENT_THEME_SS_ID_PARAM = "org.jasig.portal.layout.UserProfileChanger.CURRENT_THEME_SS_ID";
public void contextInitialized(ServletContextEvent sce) {
DataSource ds = RDBMServices.getDataSource();
SqlUpdate update = new SqlUpdate();
update.setDataSource(ds);
update.setSql("UPDATE up_user_profile " +
"SET structure_ss_id = ?, " +
"theme_ss_id = ?" +
"WHERE theme_ss_id = ?");
update.declareParameter(new SqlParameter("structure_ss_id", Types.INTEGER));
update.declareParameter(new SqlParameter("theme_ss_id", Types.INTEGER));
update.declareParameter(new SqlParameter("theme_ss_id", Types.INTEGER));
update.compile();
Integer[] arguments = new Integer[3];
Integer desiredStructStylesheetId = Integer.valueOf(sce.getServletContext().getInitParameter(DESIRED_STRUC_SS_ID_PARAM));
Integer desiredThemeStylesheetId = Integer.valueOf(sce.getServletContext().getInitParameter(DESIRED_THEME_SS_ID_PARAM));
Integer currentThemeStylesheetId = Integer.valueOf(sce.getServletContext().getInitParameter(CURRENT_THEME_SS_ID_PARAM));
arguments[0] = desiredStructStylesheetId;
arguments[1] = desiredThemeStylesheetId;
arguments[2] = currentThemeStylesheetId;
int rowsModified = update.update(arguments);
System.out.println("Updated " + rowsModified +
" rows of uP_user_profile to change from theme " +
currentThemeStylesheetId + " to theme " +
desiredThemeStylesheetId + " and structure " +
desiredStructStylesheetId);
}
public void contextDestroyed(ServletContextEvent sce) {
// do nothing
}
}
Mapping and configuring
Then I map the listener in web.xml and configure it for the change I'm looking to make, according to the recipe Mark posted.:
<context-param>
<param-name>org.jasig.portal.layout.UserProfileChanger.STRUCT_SS_ID</param-name>
<param-value>1</param-value>
</context-param>
<context-param>
<param-name>org.jasig.portal.layout.UserProfileChanger.DESIRED_THEME_SS_ID</param-name>
<param-value>1</param-value>
</context-param>
<context-param>
<param-name>org.jasig.portal.layout.UserProfileChanger.CURRENT_THEME_SS_ID</param-name>
<param-value>11</param-value>
</context-param>
<listener>
<listener-class>org.jasig.portal.layout.UserProfileChanger</listener-class>
</listener>