1 18 19 package org.apache.struts.webapp.tiles.skin; 20 21 import javax.servlet.RequestDispatcher ; 22 import javax.servlet.ServletContext ; 23 import javax.servlet.ServletException ; 24 import javax.servlet.http.HttpServletRequest ; 25 import javax.servlet.http.HttpServletResponse ; 26 import javax.servlet.http.HttpSession ; 27 import org.apache.struts.action.ActionForm; 28 import org.apache.struts.action.ActionForward; 29 import org.apache.struts.action.ActionMapping; 30 import org.apache.struts.tiles.ComponentContext; 31 import org.apache.struts.tiles.ComponentDefinition; 32 import org.apache.struts.tiles.DefinitionsFactoryException; 33 import org.apache.struts.tiles.actions.TilesAction; 34 35 49 public class LayoutSwitchAction extends TilesAction 50 { 51 52 public static boolean debug = true; 53 54 public static final String LAYOUT_ATTRIBUTE = "layout.attribute"; 55 56 public static String USER_SETTINGS_NAME_ATTRIBUTE = "userSettingsName"; 57 58 public static String DEFAULT_USER_SETTINGS_NAME = "examples.tiles.skin.SELECTED_DEFINITION"; 59 60 61 public static final String CATALOG_NAME = "examples.tiles.skin.CATALOG_NAME"; 62 63 64 public static String DEFAULT_CATALOG_NAME = "tiles.examples.skin.layoutCatalog"; 65 66 public static String CATALOG_NAME_ATTRIBUTE = "catalogName"; 67 68 public static final String CATALOG_SETTING_ATTRIBUTE = "catalogSettings"; 69 70 88 public ActionForward execute( 89 ComponentContext context, 90 ActionMapping mapping, 91 ActionForm form, 92 HttpServletRequest request, 93 HttpServletResponse response) 94 throws Exception 95 { 96 if(debug) 97 System.out.println( "EnterLayoutSwitchAction" ); 98 String layoutKey = (String )context.getAttribute( LAYOUT_ATTRIBUTE ); 100 if(layoutKey==null) 101 throw new ServletException ( "Error - CustomSkinAction : attribute '" 102 + LAYOUT_ATTRIBUTE 103 + "' not found in Tile's attributes. Need it to select appropriate layout" ); 104 105 ComponentDefinition definition = getCurrentDefinition( context, request, getServlet().getServletContext() ); 107 String layout = (String )definition.getAttribute(layoutKey); 109 if(layout==null) 110 throw new ServletException ( "Error - CustomSkinAction : no layout defined for key '" 111 + layoutKey 112 + "' in currently selected skin '" 113 + getUserSetting(context, request ) + "'." ); 114 120 if(debug) 121 System.out.println( "Switch to : " + layout ); 122 RequestDispatcher rd = getServlet().getServletContext().getRequestDispatcher( layout ); 123 if(rd==null) 124 throw new ServletException ( "LayoutSwitch error : Can't find layout '" 125 + layout + "'." ); 126 rd.include(request, response); 127 if(debug) 128 System.out.println( "Exit LayoutSwitchAction" ); 129 return null; 130 } 131 132 137 public static String getUserSetting( ComponentContext context, HttpServletRequest request ) 138 { 139 HttpSession session = request.getSession( false ); 140 if( session == null ) 141 return null; 142 143 String userSettingsName = (String )context.getAttribute( USER_SETTINGS_NAME_ATTRIBUTE ); 145 if( userSettingsName == null ) 146 userSettingsName = DEFAULT_USER_SETTINGS_NAME; 147 148 return (String )session.getAttribute(userSettingsName); 149 } 150 151 156 public static void setUserSetting( ComponentContext context, HttpServletRequest request, String setting ) 157 { 158 HttpSession session = request.getSession(); 159 160 String userSettingsName = (String )context.getAttribute( USER_SETTINGS_NAME_ATTRIBUTE ); 162 if( userSettingsName == null ) 163 userSettingsName = DEFAULT_USER_SETTINGS_NAME; 164 165 session.setAttribute(userSettingsName, setting); 166 } 167 168 171 public static ComponentDefinition getCurrentDefinition( ComponentContext context, HttpServletRequest request, ServletContext servletContext ) 172 throws ServletException 173 { 174 String selected = getUserSetting(context, request); 176 177 DefinitionCatalog catalog = getCatalog( context, request, servletContext); 178 ComponentDefinition definition = (ComponentDefinition)catalog.get( selected ); 179 if( definition == null ) 180 definition = (ComponentDefinition)catalog.getDefault(); 181 182 return definition; 183 } 184 185 188 public static DefinitionCatalog getCatalog( ComponentContext context, HttpServletRequest request, ServletContext servletContext ) 189 throws ServletException 190 { 191 String catalogName = (String )context.getAttribute( CATALOG_NAME_ATTRIBUTE ); 194 if(catalogName == null) 195 catalogName = DEFAULT_CATALOG_NAME; 196 197 if(debug) 198 System.out.println( "Catalog name=" + catalogName ); 199 try 200 { 201 DefinitionCatalog catalog = (DefinitionCatalog)servletContext.getAttribute( catalogName ); 202 if(catalog == null) 203 { if(debug) 205 System.out.println( "Create catalog" ); 206 String catalogSettings = (String )context.getAttribute( CATALOG_SETTING_ATTRIBUTE ); 207 if(catalogSettings == null) 208 throw new ServletException ( "Error - CustomSkinAction : attribute '" 209 + CATALOG_SETTING_ATTRIBUTE 210 + "' not found in Tile's attributes. Need it to initialize catalog" ); 211 catalog = new DefinitionCatalog( catalogSettings, request, servletContext ); 212 if(debug) 213 System.out.println( "Catalog created" ); 214 servletContext.setAttribute( catalogName, catalog ); 215 } return catalog; 217 } 218 catch(DefinitionsFactoryException ex ) 219 { 220 if(debug) 221 System.out.println( "Exception : " + ex.getMessage() ); 222 throw new ServletException ( ex.getMessage() ); 223 } 224 } 225 } 226 | Popular Tags |