/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.vertical.adminweb; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.xml.transform.Source; import javax.xml.transform.TransformerException; import javax.xml.transform.dom.DOMSource; import org.apache.commons.lang.StringUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; import com.enonic.esl.containers.ExtendedMap; import com.enonic.esl.containers.MultiValueMap; import com.enonic.esl.util.StringUtil; import com.enonic.esl.xml.XMLTool; import com.enonic.vertical.engine.VerticalEngineException; import com.enonic.vertical.engine.VerticalRemoveException; import com.enonic.vertical.engine.VerticalSecurityException; import com.enonic.cms.framework.xml.XMLException; import com.enonic.cms.core.portal.cache.PageCache; import com.enonic.cms.core.resource.ResourceFile; import com.enonic.cms.core.resource.ResourceKey; import com.enonic.cms.core.security.user.User; import com.enonic.cms.core.security.user.UserEntity; import com.enonic.cms.core.service.AdminService; import com.enonic.cms.core.structure.RunAsType; import com.enonic.cms.core.structure.SiteKey; import com.enonic.cms.core.structure.menuitem.MenuItemEntity; import com.enonic.cms.core.structure.menuitem.MenuItemSpecification; import com.enonic.cms.core.structure.page.PageSpecification; import com.enonic.cms.core.structure.page.template.CopyPageTemplateCommand; import com.enonic.cms.core.structure.page.template.CreatePageTemplateCommand; import com.enonic.cms.core.structure.page.template.DeletePageTemplateCommand; import com.enonic.cms.core.structure.page.template.PageTemplateEntity; import com.enonic.cms.core.structure.page.template.PageTemplateKey; import com.enonic.cms.core.structure.page.template.PageTemplateSpecification; import com.enonic.cms.core.structure.page.template.PageTemplateType; import com.enonic.cms.core.structure.page.template.UpdatePageTemplateCommand; public class PageTemplateHandlerServlet extends AdminHandlerBaseServlet { private Document buildPageTemplateXML( ExtendedMap formItems, boolean createPageTemplate ) throws VerticalAdminException { String key = null; Element tempElement; Document doc = XMLTool.createDocument( "pagetemplate" ); Element pageTemplate = doc.getDocumentElement(); String type = formItems.getString( "type", "page" ); pageTemplate.setAttribute( "type", type ); String runAs = formItems.getString( "runAs", RunAsType.INHERIT.toString() ); pageTemplate.setAttribute( "runAs", runAs ); String menuKey = formItems.getString( "menukey" ); pageTemplate.setAttribute( "menukey", menuKey ); if ( !createPageTemplate ) { key = formItems.getString( "key" ); pageTemplate.setAttribute( "key", key ); } // CSS: String tmp = formItems.getString( "csskey", null ); if ( tmp != null && tmp.length() > 0 ) { tempElement = XMLTool.createElement( doc, pageTemplate, "css" ); tempElement.setAttribute( "stylesheetkey", tmp ); } XMLTool.createElement( doc, pageTemplate, "name", formItems.getString( "name", "" ).trim() ); XMLTool.createElement( doc, pageTemplate, "description", formItems.getString( "description", "" ) ); tempElement = XMLTool.createElement( doc, pageTemplate, "stylesheet" ); if ( formItems.containsKey( "stylesheetkey" ) ) { tempElement.setAttribute( "stylesheetkey", formItems.getString( "stylesheetkey" ) ); } Element templateParams = XMLTool.createElement( doc, pageTemplate, "pagetemplateparameters" ); if ( isArrayFormItem( formItems, "paramname" ) == false ) { if ( formItems.containsKey( "paramname" ) ) { if ( createPageTemplate ) { createTemplateParamXML( true, doc, templateParams, "", null, formItems.getString( "multiple1", null ) != null && formItems.getString( "multiple1", "" ).length() > 0 ? formItems.getString( "multiple1" ) : "0", "0", formItems.getString( "paramname", "" ), formItems.getString( "separator", "" ) ); } else { createTemplateParamXML( false, doc, templateParams, formItems.getString( "paramkey", "" ), key, formItems.getString( "multiple1", null ) != null && ( formItems.getString( "multiple1" ) ).length() > 0 ? formItems.getString( "multiple1" ) : "0", "0", formItems.getString( "paramname" ), formItems.getString( "separator", "" ) ); } } } else { String[] paramNameArray = (String[]) formItems.get( "paramname" ); String[] paramKeyArray = (String[]) formItems.get( "paramkey", null ); String[] separatorArray = (String[]) formItems.get( "separator" ); for ( int j = 0; j < paramNameArray.length; j++ ) { if ( paramNameArray[j] != null && paramNameArray[j].trim().length() != 0 ) { String multiple = formItems.getString( "multiple" + ( j + 1 ), "0" ); if ( createPageTemplate ) { createTemplateParamXML( true, doc, templateParams, "", null, multiple, "0", paramNameArray[j], separatorArray[j] ); } else { createTemplateParamXML( false, doc, templateParams, paramKeyArray[j], key, multiple, "0", paramNameArray[j], separatorArray[j] ); } } } } // Default contentobjects for the page template: if ( isArrayFormItem( formItems, "paramname" ) ) { String[] paramNameArray = (String[]) formItems.get( "paramname" ); String[] paramKeyArray = (String[]) formItems.get( "paramkey", null ); Element contentObjectsElem = XMLTool.createElement( doc, pageTemplate, "contentobjects" ); int newObjectCounter = 0; for ( int i = 0; i < paramNameArray.length; ++i ) { if ( isArrayFormItem( formItems, paramNameArray[i] + "co_portlet" ) ) { String[] coArray = (String[]) formItems.get( paramNameArray[i] + "co_portlet" ); String[] coNameArray = (String[]) formItems.get( "view" + paramNameArray[i] + "co_portlet" ); boolean used = false; for ( int j = 0; j < coArray.length; j++ ) { Element contentObjectElem = XMLTool.createElement( doc, contentObjectsElem, "contentobject" ); contentObjectElem.setAttribute( "conobjkey", coArray[j] ); if ( paramKeyArray != null && paramKeyArray[i].length() > 0 ) { contentObjectElem.setAttribute( "parameterkey", paramKeyArray[i] ); } else { contentObjectElem.setAttribute( "parameterkey", "_" + newObjectCounter ); used = true; } XMLTool.createElement( doc, contentObjectElem, "order", String.valueOf( j ) ); XMLTool.createElement( doc, contentObjectElem, "name", coNameArray[j] ); if ( pageTemplate.getAttribute( "key" ) != null ) { contentObjectElem.setAttribute( "pagetemplatekey", pageTemplate.getAttribute( "key" ) ); } } if ( used ) { newObjectCounter++; } } else if ( formItems.containsKey( paramNameArray[i] + "co_portlet" ) ) { String coName = formItems.getString( "view" + paramNameArray[i] + "co_portlet" ); Element contentObjectElem = XMLTool.createElement( doc, contentObjectsElem, "contentobject" ); contentObjectElem.setAttribute( "conobjkey", formItems.getString( paramNameArray[i] + "co_portlet" ) ); if ( paramKeyArray != null && paramKeyArray[i].length() > 0 ) { contentObjectElem.setAttribute( "parameterkey", paramKeyArray[i] ); } else { contentObjectElem.setAttribute( "parameterkey", "_" + newObjectCounter++ ); } XMLTool.createElement( doc, contentObjectElem, "order", "0" ); XMLTool.createElement( doc, contentObjectElem, "name", coName ); if ( pageTemplate.getAttribute( "key" ) != null ) { contentObjectElem.setAttribute( "pagetemplatekey", pageTemplate.getAttribute( "key" ) ); } } else { // This fixes a bug when inserting objects in a new page template. If the object was inserted at pos 3 with no // object at pos 1, it would be placed in pos 1. if ( createPageTemplate ) { newObjectCounter++; } } } } else if ( formItems.containsKey( "paramname" ) ) { String paramName = formItems.getString( "paramname" ); String paramKey = formItems.getString( "paramkey", "_0" ); Element contentObjectsElem = XMLTool.createElement( doc, pageTemplate, "contentobjects" ); if ( isArrayFormItem( formItems, paramName + "co_portlet" ) ) { String[] coArray = (String[]) formItems.get( paramName + "co_portlet" ); for ( int j = 0; j < coArray.length; j++ ) { Element contentObjectElem = XMLTool.createElement( doc, contentObjectsElem, "contentobject" ); contentObjectElem.setAttribute( "conobjkey", coArray[j] ); if ( paramKey != null && paramKey.length() > 0 ) { contentObjectElem.setAttribute( "parameterkey", paramKey ); } XMLTool.createElement( doc, contentObjectElem, "order", String.valueOf( j ) ); if ( pageTemplate.getAttribute( "key" ) != null ) { contentObjectElem.setAttribute( "pagetemplatekey", pageTemplate.getAttribute( "key" ) ); } } } else if ( formItems.containsKey( paramName + "co_portlet" ) ) { Element contentObjectElem = XMLTool.createElement( doc, contentObjectsElem, "contentobject" ); String coName = formItems.getString( "view" + formItems.getString( "paramname" ) + "co_portlet" ); contentObjectElem.setAttribute( "conobjkey", formItems.getString( paramName + "co_portlet" ) ); if ( paramKey != null && paramKey.length() > 0 ) { contentObjectElem.setAttribute( "parameterkey", paramKey ); } XMLTool.createElement( doc, contentObjectElem, "order", "0" ); XMLTool.createElement( doc, contentObjectElem, "name", coName ); if ( pageTemplate.getAttribute( "key" ) != null ) { contentObjectElem.setAttribute( "pagetemplatekey", pageTemplate.getAttribute( "key" ) ); } } } // page template parameters other than parameters of type "object" Element ptdElem = XMLTool.createElement( doc, pageTemplate, "pagetemplatedata" ); if ( isArrayFormItem( formItems, "parameter_name" ) ) { String[] paramNames = (String[]) formItems.get( "parameter_name" ); String[] paramValues = (String[]) formItems.get( "parameter_value" ); String[] paramValueNames = (String[]) formItems.get( "viewparameter_value" ); String[] paramTypes = (String[]) formItems.get( "parameter_type" ); for ( int i = 0; i < paramNames.length; ++i ) { Element ptpElem = XMLTool.createElement( doc, ptdElem, "pagetemplateparameter" ); ptpElem.setAttribute( "name", paramNames[i] ); ptpElem.setAttribute( "value", paramValues[i] ); ptpElem.setAttribute( "type", paramTypes[i] ); if ( paramValueNames[i] != null && paramValueNames[i].length() > 0 ) { ptpElem.setAttribute( "valuename", paramValueNames[i] ); } } } else if ( formItems.containsKey( "parameter_name" ) ) { String paramName = formItems.getString( "parameter_name", null ); if ( paramName != null && paramName.length() > 0 ) { String paramValue = formItems.getString( "parameter_value", "" ); String paramValueName = formItems.getString( "viewparameter_value", null ); String paramType = formItems.getString( "parameter_type", "" ); Element ptpElem = XMLTool.createElement( doc, ptdElem, "pagetemplateparameter" ); ptpElem.setAttribute( "name", paramName ); ptpElem.setAttribute( "value", paramValue ); ptpElem.setAttribute( "type", paramType ); if ( paramValueName != null ) { ptpElem.setAttribute( "valuename", paramValueName ); } } } // Datasources String datasources = formItems.getString( "datasources", null ); if ( StringUtils.isNotBlank( datasources ) ) { Document dsDoc = XMLTool.domparse( datasources ); ptdElem.appendChild( doc.importNode( dsDoc.getDocumentElement(), true ) ); } // default document Element documentElem = XMLTool.createElement( doc, ptdElem, "document" ); if ( isStoreXHTMLOn() ) { documentElem.setAttribute( "mode", "xhtml" ); XMLTool.createXHTMLNodes( doc, documentElem, formItems.getString( "contentdata_body", "" ), true ); } else { XMLTool.createCDATASection( doc, documentElem, formItems.getString( "contentdata_body", "" ) ); } // Content types Element ctyElem = XMLTool.createElement( doc, pageTemplate, "contenttypes" ); String[] contentTypeKeys = formItems.getStringArray( "contenttypekey" ); for ( String contentTypeKey : contentTypeKeys ) { XMLTool.createElement( doc, ctyElem, "contenttype" ).setAttribute( "key", contentTypeKey ); } return doc; } public void handlerBrowse( HttpServletRequest request, HttpServletResponse response, HttpSession session, AdminService admin, ExtendedMap formItems ) throws VerticalAdminException { try { User user = securityService.getLoggedInAdminConsoleUser(); int menuKey = formItems.getInt( "menukey" ); Source xmlSource = admin.getPageTemplatesByMenu( menuKey, null ).getAsDOMSource(); // Stylesheet Source xslSource = AdminStore.getStylesheet( session, "pagetemplate_browse.xsl" ); // Parameters HashMap<String, Object> parameters = new HashMap<String, Object>(); addCommonParameters( admin, user, request, parameters, -1, menuKey ); parameters.put( "page", String.valueOf( request.getParameter( "page" ) ) ); parameters.put( "menukey", String.valueOf( menuKey ) ); addSortParamteres( "name", "ascending", formItems, session, parameters ); transformXML( session, response.getWriter(), xmlSource, xslSource, parameters ); } catch ( TransformerException te ) { String message = "XSLT error: %t"; VerticalAdminLogger.errorAdmin( message, te ); } catch ( IOException ioe ) { String message = "I/O error: %t"; VerticalAdminLogger.errorAdmin( message, ioe ); } } public void handlerCreate( HttpServletRequest request, HttpServletResponse response, HttpSession session, AdminService admin, ExtendedMap formItems ) throws VerticalEngineException, VerticalAdminException { // Build site XML and create the portal String xmlData = XMLTool.documentToString( buildPageTemplateXML( formItems, true ) ); CreatePageTemplateCommand command = new CreatePageTemplateCommand( xmlData ); pageTemplateService.createPageTemplate( command ); MultiValueMap queryParams = new MultiValueMap(); queryParams.put( "page", formItems.get( "page" ) ); queryParams.put( "op", "browse" ); queryParams.put( "menukey", formItems.get( "menukey" ) ); redirectClientToAdminPath( "adminpage", queryParams, request, response ); } public void handlerForm( HttpServletRequest request, HttpServletResponse response, HttpSession session, AdminService admin, ExtendedMap formItems ) throws VerticalAdminException { try { User user = securityService.getLoggedInAdminConsoleUser(); boolean createPageTemplate; boolean updateStyleSheet = formItems.getBoolean( "updatestylesheet", true ); boolean updateCSS = formItems.getBoolean( "updatecss", false ); String xmlData; Document doc; String cssStylesheetKey = null; String datasourcesXML; int menuKey = formItems.getInt( "menukey" ); ResourceKey stylesheetKey = null; ResourceFile stylesheet = null; ResourceKey cssKey = null; boolean stylesheetValid = false; String cssKeyParam = request.getParameter( "selectedcsskey" ); if ( cssKeyParam != null && !"".equals( cssKeyParam ) ) { cssKey = ResourceKey.from( cssKeyParam ); } if ( request.getParameter( "selstylesheetkey" ) != null && request.getParameter( "selstylesheetkey" ).length() > 0 ) { stylesheetKey = ResourceKey.from( request.getParameter( "selstylesheetkey" ) ); formItems.putString( "stylesheetkey", stylesheetKey.toString() ); } int key = formItems.getInt( "key", -1 ); // If we have not selected a stylesheet yet if ( stylesheetKey == null && cssKey == null && key == -1 ) { createPageTemplate = true; doc = XMLTool.createDocument( "pagetemplates" ); Document dsDoc = XMLTool.createDocument( "datasources" ); datasourcesXML = XMLTool.documentToString( dsDoc ); } else { createPageTemplate = ( key == -1 ); if ( stylesheetKey == null && cssKey == null ) // createPageTemplate = false { // If we are editing an existing template int pageTemplateKey = Integer.parseInt( request.getParameter( "key" ) ); xmlData = admin.getPageTemplate( pageTemplateKey ); doc = XMLTool.domparse( xmlData ); Element pagetemplateElem = XMLTool.getElement( doc.getDocumentElement(), "pagetemplate" ); Element stylesheetElem = XMLTool.getElement( pagetemplateElem, "stylesheet" ); stylesheetKey = ResourceKey.from( stylesheetElem.getAttribute( "stylesheetkey" ) ); } else { // If we are making a new template doc = buildPageTemplateXML( formItems, key == -1 ); Element oldRoot = doc.getDocumentElement(); Element newRoot = XMLTool.createElement( doc, "pagetemplates" ); doc.replaceChild( newRoot, oldRoot ); newRoot.appendChild( oldRoot ); updateStyleSheet = stylesheetKey != null; if ( !updateStyleSheet ) { Element elem = XMLTool.getElement( oldRoot, "stylesheet" ); String styleSheetKeyStr = elem.getAttribute( "stylesheetkey" ); if ( styleSheetKeyStr.length() > 0 ) { stylesheetKey = ResourceKey.from( styleSheetKeyStr ); } } } Element cssElem = (Element) XMLTool.selectNode( doc, "/pagetemplates/pagetemplate/css" ); if ( cssElem != null ) { if ( updateCSS && cssKey == null ) { cssElem.getParentNode().removeChild( cssElem ); } else { cssStylesheetKey = cssElem.getAttribute( "stylesheetkey" ); } } Element ptdElem = (Element) XMLTool.selectNode( doc, "/pagetemplates/pagetemplate/pagetemplatedata" ); Element dselem = XMLTool.getElement( ptdElem, "datasources" ); if ( dselem != null ) { Document dsDoc = XMLTool.createDocument(); dsDoc.appendChild( dsDoc.importNode( dselem, true ) ); datasourcesXML = XMLTool.documentToString( dsDoc ); } else { Document dsDoc = XMLTool.createDocument( "datasources" ); datasourcesXML = XMLTool.documentToString( dsDoc ); } if ( !updateStyleSheet ) { // Insert valuename attributes all parameters Element[] pagetemplateparamElems = XMLTool.getElements( ptdElem, "pagetemplateparameter" ); for ( Element pagetemplateparamElem : pagetemplateparamElems ) { String keyStr = pagetemplateparamElem.getAttribute( "value" ); if ( keyStr != null && keyStr.length() > 0 ) { String type = pagetemplateparamElem.getAttribute( "type" ); if ( "category".equals( type ) ) { int categoryKey = Integer.parseInt( keyStr ); String name = admin.getCategoryName( categoryKey ); pagetemplateparamElem.setAttribute( "valuename", name ); } else if ( "page".equals( type ) ) { int menuItemKey = Integer.parseInt( keyStr ); String name = admin.getMenuItemName( menuItemKey ); pagetemplateparamElem.setAttribute( "valuename", name ); } else if ( "resource".equals( type ) ) { pagetemplateparamElem.setAttribute( "valuename", keyStr ); } } } } } if ( stylesheetKey != null && ( ( createPageTemplate && cssKey == null ) || updateStyleSheet ) ) { Map<String, Element> elemMap = new HashMap<String, Element>(); Element root = doc.getDocumentElement(); if ( updateStyleSheet ) { // Remove all parameters from xml root = XMLTool.getElement( root, "pagetemplate" ); Element pageTemplateParamterRootElement = XMLTool.getElement( root, "pagetemplateparameters" ); Element[] pageTemplateParameterElems = XMLTool.getElements( pageTemplateParamterRootElement, "pagetemplateparameter" ); for ( Element elem : pageTemplateParameterElems ) { String name = XMLTool.getElementText( XMLTool.getElement( elem, "name" ) ); elemMap.put( name, elem ); } root.removeChild( pageTemplateParamterRootElement ); pageTemplateParamterRootElement = XMLTool.getElement( root, "pagetemplatedata" ); pageTemplateParameterElems = XMLTool.getElements( pageTemplateParamterRootElement, "pagetemplateparameter" ); for ( Element elem1 : pageTemplateParameterElems ) { String name = elem1.getAttribute( "name" ); elemMap.put( name, elem1 ); pageTemplateParamterRootElement.removeChild( elem1 ); } } Element stylesheetParams = XMLTool.createElement( doc, root, "pagetemplateparameters" ); Element pagetemplatedataElem = XMLTool.getElement( root, "pagetemplatedata" ); if ( pagetemplatedataElem == null ) { pagetemplatedataElem = XMLTool.createElement( doc, root, "pagetemplatedata" ); } stylesheet = resourceService.getResourceFile( stylesheetKey ); if ( stylesheet != null ) { Document stylesheetDoc = null; try { stylesheetDoc = stylesheet.getDataAsXml().getAsDOMDocument(); stylesheetValid = true; } catch ( XMLException e ) { } if ( stylesheetDoc != null ) { Element[] paramElems = XMLTool.getElements( stylesheetDoc.getDocumentElement(), "xsl:param" ); for ( Element paramElem : paramElems ) { Element typeElem = XMLTool.getElement( paramElem, "type" ); Element tempElem; String name = paramElem.getAttribute( "name" ); if ( typeElem != null ) { String type = XMLTool.getElementText( typeElem ); if ( "object".equals( type ) || "region".equals( type ) ) { Element elem = elemMap.get( name ); if ( elem != null && elem.getAttribute( "type" ).length() == 0 ) { stylesheetParams.appendChild( elem ); } else { tempElem = XMLTool.createElement( doc, stylesheetParams, "pagetemplateparameter" ); XMLTool.createElement( doc, tempElem, "name", name ); } } else { if ( elemMap.containsKey( name ) ) { Element elem = elemMap.get( name ); String elemType = elem.getAttribute( "type" ); if ( elemType.length() == 0 ) { elem.setAttribute( "name", name ); XMLTool.removeChildNodes( elem, true ); } elem.setAttribute( "type", type ); pagetemplatedataElem.appendChild( elem ); } else { tempElem = XMLTool.createElement( doc, pagetemplatedataElem, "pagetemplateparameter" ); tempElem.setAttribute( "name", name ); tempElem.setAttribute( "type", type ); } } } else { // Alle vanlige parametere, spesifisert som as="xs:string", e.l. i XSL'en. if ( elemMap.containsKey( name ) ) { Element elem = elemMap.get( name ); String type = elem.getAttribute( "type" ); if ( type.length() == 0 ) { elem.setAttribute( "name", name ); XMLTool.removeChildNodes( elem, true ); } else { elem.removeAttribute( "type" ); elem.removeAttribute( "valuename" ); } pagetemplatedataElem.appendChild( elem ); } else { tempElem = XMLTool.createElement( doc, pagetemplatedataElem, "pagetemplateparameter" ); tempElem.setAttribute( "name", name ); } } } } } } if ( stylesheet == null && stylesheetKey != null ) { stylesheet = resourceService.getResourceFile( stylesheetKey ); } if ( stylesheet != null ) { Document stylesheetDoc = null; try { stylesheetDoc = stylesheet.getDataAsXml().getAsDOMDocument(); stylesheetValid = true; } catch ( XMLException e ) { } if ( stylesheetDoc != null ) { Element tmpElem = XMLTool.createElement( doc.getDocumentElement(), "resource" ); tmpElem.appendChild( doc.importNode( stylesheetDoc.getDocumentElement(), true ) ); } } // Get content types for this site XMLTool.mergeDocuments( doc, admin.getContentTypes( false ).getAsDOMDocument(), true ); DOMSource xmlSource = new DOMSource( doc ); Source xslSource = AdminStore.getStylesheet( session, "pagetemplate_form.xsl" ); HashMap<String, Object> parameters = new HashMap<String, Object>(); addCommonParameters( admin, user, request, parameters, -1, menuKey ); if ( cssStylesheetKey != null ) { parameters.put( "cssStylesheetKey", cssStylesheetKey ); parameters.put( "cssStylesheetExist", resourceService.getResourceFile( ResourceKey.from( cssStylesheetKey ) ) == null ? "false" : "true" ); } ResourceKey defaultCSSKey = admin.getDefaultCSSByMenu( menuKey ); if ( defaultCSSKey != null ) { parameters.put( "defaultcsskey", defaultCSSKey.toString() ); parameters.put( "defaultcssExist", resourceService.getResourceFile( defaultCSSKey ) == null ? "false" : "true" ); } if ( createPageTemplate ) { parameters.put( "create", "1" ); } else { parameters.put( "create", "0" ); } parameters.put( "page", String.valueOf( request.getParameter( "page" ) ) ); datasourcesXML = StringUtil.formatXML( datasourcesXML, 2 ); parameters.put( "datasources", datasourcesXML ); parameters.put( "menukey", formItems.getString( "menukey" ) ); parameters.put( "selectedtabpageid", formItems.getString( "selectedtabpageid", "none" ) ); if ( stylesheetKey != null ) { parameters.put( "selstylesheetkey", stylesheetKey.toString() ); parameters.put( "selstylesheetExist", stylesheet == null ? "false" : "true" ); parameters.put( "selstylesheetValid", stylesheetValid ? "true" : "false" ); } addAccessLevelParameters( user, parameters ); UserEntity defaultRunAsUser = menuHandler.getRunAsUserForSite( formItems.getInt( "menukey" ) ); String defaultRunAsUserName = "NA"; if ( defaultRunAsUser != null ) { defaultRunAsUserName = defaultRunAsUser.getDisplayName(); } parameters.put( "defaultRunAsUser", defaultRunAsUserName ); transformXML( session, response.getWriter(), xmlSource, xslSource, parameters ); } catch ( TransformerException e ) { VerticalAdminLogger.errorAdmin( "XSLT error: %t", e ); } catch ( IOException e ) { VerticalAdminLogger.errorAdmin( "I/O error: %t", e ); } } public void handlerRemove( HttpServletRequest request, HttpServletResponse response, HttpSession session, AdminService admin, ExtendedMap formItems, int key ) throws VerticalRemoveException, VerticalSecurityException, VerticalAdminException { DeletePageTemplateCommand command = new DeletePageTemplateCommand( new PageTemplateKey( key ) ); pageTemplateService.deletePageTemplate( command ); final SiteKey siteKey = new SiteKey( formItems.getInt( "menukey" ) ); final PageCache pageCache = pageCacheService.getPageCacheService( siteKey ); pageCache.removePageEntriesBySite(); redirectClientToReferer( request, response ); } public void handlerUpdate( HttpServletRequest request, HttpServletResponse response, HttpSession session, AdminService admin, ExtendedMap formItems ) throws VerticalEngineException, VerticalAdminException { String xmlData = XMLTool.documentToString( buildPageTemplateXML( formItems, false ) ); UpdatePageTemplateCommand command = new UpdatePageTemplateCommand( xmlData ); pageTemplateService.updatePageTemplate( command ); invalidateCacheForPageTemplateChange( formItems.getInt( "key", -1 ) ); MultiValueMap queryParams = new MultiValueMap(); queryParams.put( "page", formItems.get( "page" ) ); queryParams.put( "op", "browse" ); queryParams.put( "menukey", formItems.get( "menukey" ) ); redirectClientToAdminPath( "adminpage", queryParams, request, response ); } private void invalidateCacheForPageTemplateChange( int pageTemplateKey ) { if ( pageTemplateKey == -1 ) { return; } PageTemplateEntity pageTemplate = pageTemplateDao.findByKey( pageTemplateKey ); if ( pageTemplate == null ) { return; } PageCache pageCache = pageCacheService.getPageCacheService( pageTemplate.getSite().getKey() ); boolean clearAllPageEntriesOnSite = pageTemplate.getType().equals( PageTemplateType.CONTENT ); if ( clearAllPageEntriesOnSite ) { pageCache.removePageEntriesBySite(); } else { List<MenuItemEntity> menuItemsUsingPageTemplate = getMenuItemsUsingPageTemplate( pageTemplate.getKey() ); for ( MenuItemEntity menuItem : menuItemsUsingPageTemplate ) { pageCache.removeEntriesByMenuItem( menuItem.getKey() ); } } } private List<MenuItemEntity> getMenuItemsUsingPageTemplate( int pageTemplateKey ) { MenuItemSpecification menuItemSpec = new MenuItemSpecification(); PageSpecification pageSpecification = new PageSpecification(); PageTemplateSpecification pageTemplateSpecification = new PageTemplateSpecification(); pageTemplateSpecification.setKey( new PageTemplateKey( pageTemplateKey ) ); pageSpecification.setTemplateSpecification( pageTemplateSpecification ); menuItemSpec.setPageSpecification( pageSpecification ); return menuItemDao.findBySpecification( menuItemSpec ); } private void createTemplateParamXML( boolean create, Document doc, Element templateParams, String key, String pageTemplateKey, String multiple, String override, String name, String separator ) { Element templateParam = XMLTool.createElement( doc, templateParams, "pagetemplateparameter" ); templateParam.setAttribute( "key", key ); if ( !create ) { templateParam.setAttribute( "pagetemplatekey", pageTemplateKey ); } templateParam.setAttribute( "multiple", multiple ); templateParam.setAttribute( "override", override ); XMLTool.createElement( doc, templateParam, "name", name ); XMLTool.createElement( doc, templateParam, "separator", separator ); } public void handlerCopy( HttpServletRequest request, HttpServletResponse response, HttpSession session, AdminService admin, ExtendedMap formItems, User user, int key ) throws VerticalAdminException, VerticalEngineException { CopyPageTemplateCommand command = new CopyPageTemplateCommand( new PageTemplateKey( key ), user.getKey() ); pageTemplateService.copyPageTemplate( command ); browseRedirectWithSorting( request, response, session, formItems ); } }