/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.vertical.adminweb;
import java.io.IOException;
import java.io.OutputStream;
import java.io.StringWriter;
import java.util.Date;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import com.enonic.esl.containers.ExtendedMap;
import com.enonic.esl.containers.MultiValueMap;
import com.enonic.esl.net.URL;
import com.enonic.esl.util.DateUtil;
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.XMLDocument;
import com.enonic.cms.framework.xml.XMLDocumentFactory;
import com.enonic.cms.framework.xml.XMLException;
import com.enonic.cms.core.AdminConsoleTranslationService;
import com.enonic.cms.core.RequestParameters;
import com.enonic.cms.core.portal.PageRequestType;
import com.enonic.cms.core.portal.cache.PageCache;
import com.enonic.cms.core.portal.cache.PageCacheService;
import com.enonic.cms.core.portal.datasource.DataSourceType;
import com.enonic.cms.core.portal.datasource.executor.DataSourceExecutor;
import com.enonic.cms.core.portal.datasource.executor.DataSourceExecutorContext;
import com.enonic.cms.core.portal.datasource.executor.DataSourceExecutorFactory;
import com.enonic.cms.core.portal.datasource.executor.DataSourceInvocationCache;
import com.enonic.cms.core.portal.datasource.xml.DataSourceXmlFactory;
import com.enonic.cms.core.portal.datasource.xml.DataSourcesElement;
import com.enonic.cms.core.preview.PreviewContext;
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.SiteEntity;
import com.enonic.cms.core.structure.SiteKey;
import com.enonic.cms.core.structure.SitePath;
/**
* This class handles all content object related functionality in administration console.
*/
public final class ContentObjectHandlerServlet
extends AdminHandlerBaseServlet
{
@Autowired
private DataSourceExecutorFactory datasourceExecutorFactory;
@Autowired
private PageCacheService pageCacheService;
private Document buildContentObjectXML( AdminService admin, ExtendedMap formItems, boolean createContentObject,
boolean updateStyleSheets )
throws VerticalAdminException
{
Document doc;
Element contentObject;
if ( updateStyleSheets )
{
doc = XMLTool.createDocument( "contentobjects" );
Element root = doc.getDocumentElement();
contentObject = XMLTool.createElement( doc, root, "contentobject" );
}
else
{
doc = XMLTool.createDocument( "contentobject" );
contentObject = doc.getDocumentElement();
}
contentObject.setAttribute( "menukey", formItems.getString( "menukey" ) );
if ( !createContentObject )
{
contentObject.setAttribute( "key", formItems.getString( "key" ) );
String docContentKeyStr = formItems.getString( "contentkey", null );
if ( docContentKeyStr != null )
{
contentObject.setAttribute( "contentkey", docContentKeyStr );
}
}
String runAsKey = formItems.getString( "runAs", null );
if ( runAsKey != null )
{
contentObject.setAttribute( "runAs", runAsKey );
}
String name = formItems.getString( "name", null );
if (name != null) {
name = name.trim();
}
XMLTool.createElement( doc, contentObject, "name", name );
Element tempElement;
ResourceKey stylesheetKey = ResourceKey.from( formItems.getString( "stylesheet", null ) );
if ( stylesheetKey != null )
{
tempElement = XMLTool.createElement( doc, contentObject, "objectstylesheet" );
tempElement.setAttribute( "key", String.valueOf( stylesheetKey ) );
}
ResourceKey borderStylesheetKey = ResourceKey.from( formItems.getString( "borderstylesheet", null ) );
if ( borderStylesheetKey != null )
{
tempElement = XMLTool.createElement( doc, contentObject, "borderstylesheet" );
tempElement.setAttribute( "key", String.valueOf( borderStylesheetKey ) );
}
Element contentObjectData = XMLTool.createElement( doc, contentObject, "contentobjectdata" );
// caching
String cacheType = formItems.getString( "cachetype" );
if ( !"off".equals( cacheType ) )
{
contentObjectData.setAttribute( "cachedisabled", "false" );
// cache type
contentObjectData.setAttribute( "cachetype", cacheType );
if ( cacheType.equals( "specified" ) )
{
contentObjectData.setAttribute( "mincachetime", formItems.getString( "mincachetime" ) );
}
}
else
{
contentObjectData.setAttribute( "cachedisabled", "true" );
}
// document
Element document = XMLTool.createElement( doc, contentObjectData, "document" );
if ( isStoreXHTMLOn() )
{
XMLTool.createXHTMLNodes( doc, document, formItems.getString( "contentdata_body", "" ), true );
}
else
{
XMLTool.createCDATASection( doc, document, formItems.getString( "contentdata_body", "" ) );
}
Document datasourcesDoc = null;
try
{
String datasources = formItems.getString( "datasources", null );
// Do NOT replace this with formItems.getString("datasources", "</datasources">) since
// the editor could send blankspaces
if ( StringUtils.isBlank( datasources ) )
{
datasources = "<datasources/>";
}
datasourcesDoc = XMLTool.domparse( datasources, "datasources" );
}
catch ( Exception e )
{
String message =
"Failed to parse datasource XML document: " + ( e.getCause() != null ? e.getCause().getMessage() : e.getMessage() );
VerticalAdminLogger.errorAdmin( message, e );
}
contentObjectData.appendChild( doc.importNode( datasourcesDoc.getDocumentElement(), true ) );
// Add script
Element scriptElem = doc.createElement( "script" );
scriptElem.appendChild( doc.createCDATASection( formItems.getString( "script", "" ) ) );
contentObjectData.appendChild( scriptElem );
// Stylesheet params
Element styleSheetParams = XMLTool.createElement( doc, contentObjectData, "stylesheetparams" );
if ( isArrayFormItem( formItems, "xslparam_name" ) )
{
String[] xslParameters = (String[]) formItems.get( "xslparam_name" );
String[] xslParameterValues = (String[]) formItems.get( "xslparam_value" );
String[] xslParameterTypes = (String[]) formItems.get( "xslparam_type" );
for ( int i = 0; i < xslParameters.length; i++ )
{
String valueStr = xslParameterValues[i];
if ( valueStr != null && valueStr.length() > 0 )
{
tempElement = XMLTool.createElement( doc, styleSheetParams, "stylesheetparam", valueStr );
tempElement.setAttribute( "name", xslParameters[i] );
if ( xslParameterTypes[i] != null && xslParameterTypes[i].length() > 0 )
{
String type = xslParameterTypes[i];
tempElement.setAttribute( "type", type );
if ( "page".equals( type ) )
{
int menuItemKey = -1;
try
{
menuItemKey = Integer.parseInt( valueStr );
}
catch ( NumberFormatException nfe )
{
String message = "Failed to parse menu item key: %t";
VerticalAdminLogger.errorAdmin( message, nfe );
}
String menuItemName = admin.getMenuItemName( menuItemKey );
tempElement.setAttribute( "valuename", menuItemName );
}
else if ( "category".equals( type ) )
{
int categoryKey = -1;
try
{
categoryKey = Integer.parseInt( valueStr );
}
catch ( NumberFormatException nfe )
{
String message = "Failed to parse category key: %t";
VerticalAdminLogger.errorAdmin( message, nfe );
}
String categoryName = admin.getCategoryName( categoryKey );
tempElement.setAttribute( "valuename", categoryName );
}
}
}
}
}
else if ( formItems.containsKey( "xslparam_name" ) )
{
//String valueStr = (String) formItems.get("xslparam_value", null);
if ( formItems.containsKey( "xslparam_value" ) )
{
String valueStr = formItems.getString( "xslparam_value" );
tempElement = XMLTool.createElement( doc, styleSheetParams, "stylesheetparam", valueStr );
tempElement.setAttribute( "name", formItems.getString( "xslparam_name" ) );
String xslParameterType = formItems.getString( "xslparam_type", null );
if ( xslParameterType != null )
{
String type = xslParameterType;
tempElement.setAttribute( "type", type );
if ( "page".equals( type ) )
{
int menuItemKey = -1;
try
{
menuItemKey = formItems.getInt( "xslparam_value" );
}
catch ( NumberFormatException nfe )
{
String message = "Failed to parse menu item key: %t";
VerticalAdminLogger.errorAdmin( message, nfe );
}
String menuItemName = admin.getMenuItemName( menuItemKey );
tempElement.setAttribute( "valuename", menuItemName );
}
else if ( "category".equals( type ) )
{
int categoryKey = -1;
try
{
categoryKey = formItems.getInt( "xslparam_value" );
}
catch ( NumberFormatException nfe )
{
String message = "Failed to parse menu item key: %t";
VerticalAdminLogger.errorAdmin( message, nfe );
}
String categoryName = admin.getCategoryName( categoryKey );
tempElement.setAttribute( "valuename", categoryName );
}
}
}
}
// border params
Element borderParams = XMLTool.createElement( doc, contentObjectData, "borderparams" );
if ( isArrayFormItem( formItems, "borderparam_name" ) )
{
String[] borderParameters = (String[]) formItems.get( "borderparam_name" );
String[] borderParameterValues = (String[]) formItems.get( "borderparam_value" );
String[] borderParameterTypes = (String[]) formItems.get( "borderparam_type" );
for ( int i = 0; i < borderParameters.length; i++ )
{
String valueStr = borderParameterValues[i];
if ( valueStr != null && valueStr.length() > 0 )
{
tempElement = XMLTool.createElement( doc, borderParams, "borderparam", valueStr );
tempElement.setAttribute( "name", borderParameters[i] );
if ( borderParameterTypes[i] != null && borderParameterTypes[i].length() > 0 )
{
String type = borderParameterTypes[i];
tempElement.setAttribute( "type", type );
if ( "page".equals( type ) )
{
int menuItemKey = -1;
try
{
menuItemKey = Integer.parseInt( valueStr );
}
catch ( NumberFormatException nfe )
{
String message = "Failed to parse menu item key: %t";
VerticalAdminLogger.errorAdmin( message, nfe );
}
String menuItemName = admin.getMenuItemName( menuItemKey );
tempElement.setAttribute( "valuename", menuItemName );
}
else if ( "category".equals( type ) )
{
int categoryKey = -1;
try
{
categoryKey = Integer.parseInt( valueStr );
}
catch ( NumberFormatException nfe )
{
String message = "Failed to parse menu item key: %t";
VerticalAdminLogger.errorAdmin( message, nfe );
}
String categoryName = admin.getCategoryName( categoryKey );
tempElement.setAttribute( "valuename", categoryName );
}
}
}
}
}
else if ( formItems.containsKey( "borderparam_name" ) )
{
String valueStr = formItems.getString( "borderparam_value", null );
if ( valueStr != null && valueStr.length() > 0 )
{
tempElement = XMLTool.createElement( doc, borderParams, "borderparam", valueStr );
tempElement.setAttribute( "name", formItems.getString( "borderparam_name" ) );
String borderParameterType = formItems.getString( "borderparam_type", null );
if ( borderParameterType != null )
{
String type = borderParameterType;
tempElement.setAttribute( "type", type );
if ( "page".equals( type ) )
{
int menuItemKey = -1;
try
{
menuItemKey = Integer.parseInt( valueStr );
}
catch ( NumberFormatException nfe )
{
String message = "Failed to parse menu item key: %t";
VerticalAdminLogger.errorAdmin( message, nfe );
}
tempElement.setAttribute( "valuename", admin.getMenuItemName( menuItemKey ) );
}
else if ( "category".equals( type ) )
{
int categoryKey = -1;
try
{
categoryKey = Integer.parseInt( valueStr );
}
catch ( NumberFormatException nfe )
{
String message = "Failed to parse menu item key: %t";
VerticalAdminLogger.errorAdmin( message, nfe );
}
String categoryName = admin.getCategoryName( categoryKey );
tempElement.setAttribute( "valuename", categoryName );
}
}
}
}
return doc;
}
public void handlerBrowse( HttpServletRequest request, HttpServletResponse response, HttpSession session, AdminService admin,
ExtendedMap formItems )
throws VerticalAdminException
{
int menuKey = formItems.getInt( "menukey" );
User user = securityService.getLoggedInAdminConsoleUser();
String subop = formItems.getString( "subop", null );
Document doc = admin.getContentObjectsByMenu( menuKey ).getAsDOMDocument();
// Parameters
ExtendedMap parameters = new ExtendedMap();
addCommonParameters( admin, user, request, parameters, -1, menuKey );
parameters.put( "page", String.valueOf( request.getParameter( "page" ) ) );
parameters.put( "menukey", String.valueOf( menuKey ) );
parameters.put( "datetoday", DateUtil.formatISODateTime( new Date() ) );
parameters.put( "subop", subop );
parameters.put( "fieldname", formItems.getString( "fieldname", null ) );
parameters.put( "fieldrow", formItems.getString( "fieldrow", null ) );
addSortParamteres( "name", "ascending", formItems, session, parameters );
transformXML( request, response, doc, "contentobject_browse.xsl", parameters );
}
public void handlerCopy( HttpServletRequest request, HttpServletResponse response, HttpSession session, AdminService admin,
ExtendedMap formItems, User user, int key )
throws VerticalAdminException, VerticalEngineException
{
Document doc = admin.getContentObject( Integer.parseInt( request.getParameter( "key" ) ) ).getAsDOMDocument();
Element nameElem = (Element) XMLTool.selectNode( doc, "/contentobjects/contentobject/name" );
Node[] nameArray = XMLTool.filterNodes( nameElem.getChildNodes(), Node.TEXT_NODE );
Text name = (Text) nameArray[0];
AdminConsoleTranslationService languageMap = AdminConsoleTranslationService.getInstance();
Map translationMap = languageMap.getTranslationMap( user.getSelectedLanguageCode() );
name.setData( name.getData() + " (" + translationMap.get( "%txtCopy%" ) + ")" );
Element coElem = (Element) XMLTool.selectNode( doc, "/contentobjects/contentobject" );
coElem.removeAttribute( "key" );
Element docRoot = doc.getDocumentElement();
doc.replaceChild( coElem, docRoot );
key = admin.createContentObject( user, XMLTool.documentToString( doc ) );
browseRedirectWithSorting( request, response, session, formItems );
}
public void handlerCreate( HttpServletRequest request, HttpServletResponse response, HttpSession session, AdminService admin,
ExtendedMap formItems )
throws VerticalAdminException, VerticalEngineException
{
User user = securityService.getLoggedInAdminConsoleUser();
Document coDoc = buildContentObjectXML( admin, formItems, true, false );
admin.createContentObject( user, XMLTool.documentToString( coDoc ) );
MultiValueMap queryParams = new MultiValueMap();
queryParams.put( "page", formItems.get( "page" ) );
queryParams.put( "op", "browse" );
queryParams.put( "menukey", formItems.get( "menukey" ) );
queryParams.put( "subop", formItems.getString( "subop", null ) );
queryParams.put( "fieldname", formItems.getString( "fieldname", null ) );
queryParams.put( "fieldrow", formItems.getString( "fieldrow", null ) );
redirectClientToAdminPath( "adminpage", queryParams, request, response );
}
public void handlerCustom( HttpServletRequest request, HttpServletResponse response, HttpSession session, AdminService admin,
ExtendedMap formItems, String operation )
throws VerticalAdminException, VerticalEngineException
{
int menuKey = formItems.getInt( "menukey", -1 );
final SiteKey siteKey = new SiteKey( menuKey );
if ( operation.equals( "datasourcepreview" ) )
{
if ( formItems.containsKey( "datasources" ) )
{
User user = securityService.getLoggedInAdminConsoleUser();
Document doc;
Document documentAsW3cDocument = XMLTool.createDocument( "document" );
Element rootElem = documentAsW3cDocument.getDocumentElement();
if ( isStoreXHTMLOn() )
{
XMLTool.createXHTMLNodes( documentAsW3cDocument, rootElem, formItems.getString( "document", "" ), true );
}
else
{
XMLTool.createCDATASection( documentAsW3cDocument, rootElem, formItems.getString( "document", "" ) );
}
String xmlData;
XMLDocument dataSourcesXml = XMLDocumentFactory.create( formItems.getString( "datasources" ) );
String docType = formItems.getString( "documenttype" );
boolean pageTemplateDataource = "pagetemplate".equals( docType );
try
{
if ( pageTemplateDataource )
{
xmlData = doGetPageTemplateDatasourceResult( user, siteKey, dataSourcesXml );
}
else
{
XMLDocument portletDocumentAsXmlDocument = XMLDocumentFactory.create( documentAsW3cDocument );
xmlData = doGetPortletDatasourceResult( user, siteKey, dataSourcesXml, portletDocumentAsXmlDocument );
}
}
catch ( final Exception e )
{
final XMLDocument failedDatasourceDoc =
XMLDocumentFactory.create( DataSourceFailedXmlCreator.buildExceptionDocument( "result", e ) );
xmlData = failedDatasourceDoc.getAsString();
}
if ( xmlData != null )
{
doc = XMLTool.domparse( xmlData );
}
else
{
doc = XMLTool.createDocument( "datasources" );
}
spoolDocument( response, doc );
}
}
else if ( operation.equals( "updatestylesheet" ) )
{
User user = securityService.getLoggedInAdminConsoleUser();
String key = formItems.getString( "key", null );
boolean createContentObject = ( key == null || key.length() == 0 );
Document coDoc = buildContentObjectXML( admin, formItems, createContentObject, true );
NodeList coNodes = coDoc.getElementsByTagName( "contentobject" );
Element contentobject = (Element) coNodes.item( 0 );
ResourceKey borderStyleSheetKey = ResourceKey.from( formItems.getString( "borderstylesheet", null ) );
if ( borderStyleSheetKey != null )
{
addStyleSheet( contentobject, "borderstylesheet_xsl", borderStyleSheetKey );
}
ResourceKey objectStyleSheetKey = ResourceKey.from( formItems.getString( "stylesheet", null ) );
if ( objectStyleSheetKey != null )
{
addStyleSheet( contentobject, "objectstylesheet_xsl", objectStyleSheetKey );
}
String queryParam = "";
NodeList nodeList = contentobject.getElementsByTagName( "datasources" );
if ( nodeList.getLength() > 0 )
{
Document doc = XMLTool.createDocument();
doc.appendChild( doc.importNode( nodeList.item( 0 ), true ) );
queryParam = XMLTool.documentToString( doc );
queryParam = StringUtil.formatXML( queryParam, 2 );
}
if ( key != null )
{
int cobKey = Integer.parseInt( key );
// Add pages that uses this content object
Document menuItemsDoc = admin.getMenuItemsByContentObject( user, cobKey ).getAsDOMDocument();
contentobject.appendChild( coDoc.importNode( menuItemsDoc.getDocumentElement(), true ) );
// Add frameworks that uses this content object
Document pageTemplatesDoc = admin.getPageTemplatesByContentObject( cobKey ).getAsDOMDocument();
contentobject.appendChild( coDoc.importNode( pageTemplatesDoc.getDocumentElement(), true ) );
}
ExtendedMap parameters = new ExtendedMap();
addCommonParameters( admin, user, request, parameters, -1, menuKey );
if ( createContentObject )
{
parameters.put( "create", "1" );
}
else
{
parameters.put( "create", "0" );
}
if ( queryParam != null && queryParam.length() > 0 )
{
parameters.put( "queryparam", queryParam );
}
else
{
parameters.put( "queryparam", "<?xml version=\"1.0\" ?><datasources/>" );
}
parameters.put( "page", String.valueOf( request.getParameter( "page" ) ) );
parameters.put( "referer", formItems.get( "referer" ) );
parameters.put( "subop", formItems.getString( "subop", "" ) );
parameters.put( "menukey", formItems.getString( "menukey" ) );
parameters.put( "rememberselectedtab", formItems.getString( "rememberselectedtab", "" ) );
parameters.put( "script", formItems.getString( "script", "" ) );
parameters.put( "fieldname", formItems.getString( "fieldname", null ) );
parameters.put( "fieldrow", formItems.getString( "fieldrow", null ) );
UserEntity defaultRunAsUser = menuHandler.getRunAsUserForSite( siteKey );
String defaultRunAsUserName = "NA";
if ( defaultRunAsUser != null )
{
defaultRunAsUserName = defaultRunAsUser.getDisplayName();
}
parameters.put( "defaultRunAsUser", defaultRunAsUserName );
transformXML( request, response, coDoc, "contentobject_form.xsl", parameters );
}
}
private String doGetPageTemplateDatasourceResult( final User user, final SiteKey siteKey, final XMLDocument dataSourcesXML )
{
ResourceKey[] cssKeys = null;
SitePath sitePath = new SitePath( siteKey, "" );
RequestParameters requestParameters = new RequestParameters();
SiteEntity site = siteDao.findByKey( siteKey );
UserEntity userEntity = userDao.findByKey( user.getKey() );
DataSourceExecutorContext datasourceExecutorContext = new DataSourceExecutorContext();
datasourceExecutorContext.setCssKeys( cssKeys );
datasourceExecutorContext.setDataSourceType( DataSourceType.PAGETEMPLATE );
datasourceExecutorContext.setInvocationCache( new DataSourceInvocationCache() );
datasourceExecutorContext.setHttpRequest( null );
datasourceExecutorContext.setLanguage( site.getLanguage() );
datasourceExecutorContext.setOriginalSitePath( sitePath );
datasourceExecutorContext.setPageRequestType( PageRequestType.MENUITEM );
datasourceExecutorContext.setPreviewContext( PreviewContext.NO_PREVIEW );
datasourceExecutorContext.setSite( site );
datasourceExecutorContext.setRequestParameters( requestParameters );
datasourceExecutorContext.setPortalInstanceKey( null );
datasourceExecutorContext.setUser( userEntity );
DataSourceExecutor datasourceExecutor = datasourceExecutorFactory.createDataSourceExecutor( datasourceExecutorContext );
DataSourcesElement datasources = new DataSourceXmlFactory().create( dataSourcesXML.getAsJDOMDocument().getRootElement() );
XMLDocument dsr2 = datasourceExecutor.execute( datasources );
return dsr2.getAsString();
}
private String doGetPortletDatasourceResult( final User oldUser, final SiteKey siteKey, final XMLDocument dataSourcesXML,
final XMLDocument portletDocumentXmlDocument )
{
SitePath sitePath = new SitePath( siteKey, "" );
RequestParameters requestParameters = new RequestParameters();
ResourceKey[] cssKeys = null;
SiteEntity site = siteDao.findByKey( siteKey.toInt() );
UserEntity userEntity = userDao.findByKey( oldUser.getKey() );
DataSourceExecutorContext datasourceExecutorContext = new DataSourceExecutorContext();
if ( portletDocumentXmlDocument != null )
{
datasourceExecutorContext.setPortletDocument( portletDocumentXmlDocument.getAsJDOMDocument() );
}
datasourceExecutorContext.setCssKeys( cssKeys );
datasourceExecutorContext.setDataSourceType( DataSourceType.PORTLET );
datasourceExecutorContext.setInvocationCache( new DataSourceInvocationCache() );
datasourceExecutorContext.setHttpRequest( null );
datasourceExecutorContext.setLanguage( site.getLanguage() );
datasourceExecutorContext.setOriginalSitePath( sitePath );
datasourceExecutorContext.setPageRequestType( PageRequestType.MENUITEM );
datasourceExecutorContext.setPreviewContext( PreviewContext.NO_PREVIEW );
datasourceExecutorContext.setSite( site );
datasourceExecutorContext.setRequestParameters( requestParameters );
datasourceExecutorContext.setPortalInstanceKey( null );
datasourceExecutorContext.setUser( userEntity );
DataSourceExecutor datasourceExecutor = datasourceExecutorFactory.createDataSourceExecutor( datasourceExecutorContext );
DataSourcesElement datasources = new DataSourceXmlFactory().create( dataSourcesXML.getAsJDOMDocument().getRootElement() );
XMLDocument dsr2 = datasourceExecutor.execute( datasources );
return dsr2.getAsString();
}
private void addStyleSheet( Element contentobjectElem, String elemName, ResourceKey styleSheetKey )
throws VerticalAdminException
{
Element element = XMLTool.getElement( contentobjectElem, elemName.replace( "_xsl", "" ) );
ResourceFile resource = resourceService.getResourceFile( styleSheetKey );
if ( element != null )
{
element.setAttribute( "exist", resource == null ? "false" : "true" );
}
if ( resource != null )
{
try
{
Document styleSheetDoc = resource.getDataAsXml().getAsDOMDocument();
if ( element != null )
{
element.setAttribute( "valid", "true" );
}
Element styleSheetRoot = styleSheetDoc.getDocumentElement();
String attr = styleSheetRoot.getAttribute( "xmlns:xsl" );
styleSheetRoot.removeAttribute( "xmlns:xsl" );
styleSheetRoot.setAttributeNS( "http://www.w3.org/2000/xmlns/", "xmlns:xsl", attr );
Document doc = contentobjectElem.getOwnerDocument();
Element elem = XMLTool.createElement( doc, contentobjectElem, elemName );
elem.appendChild( doc.importNode( styleSheetRoot, true ) );
}
catch ( XMLException e )
{
if ( element != null )
{
element.setAttribute( "valid", "false" );
}
}
}
}
public void handlerForm( HttpServletRequest request, HttpServletResponse response, HttpSession session, AdminService admin,
ExtendedMap formItems )
throws VerticalAdminException
{
User user = securityService.getLoggedInAdminConsoleUser();
boolean createContentObject = false;
Document xmlData = null;
Document doc;
String queryParam = "";
String script = "";
int siteKey = formItems.getInt( "menukey" );
if ( request.getParameter( "key" ) == null || request.getParameter( "key" ).equals( "" ) )
{
// Blank form, make dummy document
doc = XMLTool.createDocument( "contentobjects" );
createContentObject = true;
}
else
{
int cobKey = Integer.parseInt( request.getParameter( "key" ) );
xmlData = admin.getContentObject( cobKey ).getAsDOMDocument();
doc = xmlData;
NodeList coNodes = doc.getElementsByTagName( "contentobject" );
Element contentobject = (Element) coNodes.item( 0 );
String contentKeyStr = contentobject.getAttribute( "contentkey" );
if ( contentKeyStr != null && contentKeyStr.length() > 0 )
{
int contentKey = Integer.parseInt( contentKeyStr );
Document contentDoc = admin.getContent( user, contentKey, 0, 0, 0 ).getAsDOMDocument();
NodeList contentNodes = contentDoc.getElementsByTagName( "content" );
Element content = (Element) contentNodes.item( 0 );
content = (Element) doc.importNode( content, true );
contentobject.appendChild( content );
}
// Henter ut pagetemplates/frameworks som bruker dette contentobject
Document pageTemplatesDoc = admin.getPageTemplatesByContentObject( cobKey ).getAsDOMDocument();
contentobject.appendChild( doc.importNode( pageTemplatesDoc.getDocumentElement(), true ) );
Element objectstylesheetElem = XMLTool.getElement( contentobject, "objectstylesheet" );
ResourceKey objectStyleSheetKey = ResourceKey.from( objectstylesheetElem.getAttribute( "key" ) );
ResourceFile res = resourceService.getResourceFile( objectStyleSheetKey );
objectstylesheetElem.setAttribute( "exist", res == null ? "false" : "true" );
if ( res != null )
{
try
{
Document styleSheetDoc = res.getDataAsXml().getAsDOMDocument();
objectstylesheetElem.setAttribute( "valid", "true" );
Element styleSheetRoot = styleSheetDoc.getDocumentElement();
String attr = styleSheetRoot.getAttribute( "xmlns:xsl" );
styleSheetRoot.removeAttribute( "xmlns:xsl" );
styleSheetRoot.setAttributeNS( "http://www.w3.org/2000/xmlns/", "xmlns:xsl", attr );
Element elem = XMLTool.createElement( doc, contentobject, "objectstylesheet_xsl" );
elem.appendChild( doc.importNode( styleSheetRoot, true ) );
}
catch ( XMLException e )
{
objectstylesheetElem.setAttribute( "valid", "false" );
}
}
Element borderstylesheetElem = XMLTool.getElement( contentobject, "borderstylesheet" );
if ( borderstylesheetElem != null )
{
ResourceKey borderStyleSheetKey = ResourceKey.from( borderstylesheetElem.getAttribute( "key" ) );
if ( borderStyleSheetKey != null )
{
res = resourceService.getResourceFile( borderStyleSheetKey );
borderstylesheetElem.setAttribute( "exist", res == null ? "false" : "true" );
if ( res != null )
{
try
{
Document borderStyleSheetDoc = res.getDataAsXml().getAsDOMDocument();
borderstylesheetElem.setAttribute( "valid", "true" );
Element styleSheetRoot = borderStyleSheetDoc.getDocumentElement();
String attr = styleSheetRoot.getAttribute( "xmlns:xsl" );
styleSheetRoot.removeAttribute( "xmlns:xsl" );
styleSheetRoot.setAttributeNS( "http://www.w3.org/2000/xmlns/", "xmlns:xsl", attr );
Element elem = XMLTool.createElement( doc, contentobject, "borderstylesheet_xsl" );
elem.appendChild( doc.importNode( styleSheetRoot, true ) );
}
catch ( XMLException e )
{
borderstylesheetElem.setAttribute( "valid", "false" );
}
}
}
}
}
if ( xmlData != null )
{
Map subelems = XMLTool.filterElements( doc.getDocumentElement().getChildNodes() );
if ( subelems.get( "contentobject" ) != null )
{
Element tempElem = (Element) subelems.get( "contentobject" );
Map contentobjectmap = XMLTool.filterElements( tempElem.getChildNodes() );
Element contentobjectdata = (Element) contentobjectmap.get( "contentobjectdata" );
Map queryparammap = XMLTool.filterElements( contentobjectdata.getChildNodes() );
tempElem = (Element) queryparammap.get( "datasources" );
Document queryParamDoc = XMLTool.createDocument();
tempElem = (Element) queryParamDoc.importNode( tempElem, true );
queryParamDoc.appendChild( tempElem );
StringWriter sw = new StringWriter();
queryParamDoc.normalize();
XMLTool.printDocument( sw, queryParamDoc, 0 );
queryParam = sw.toString();
// Find the script data
Element scriptElem = (Element) queryparammap.get( "script" );
if ( scriptElem != null )
{
script = XMLTool.getElementText( scriptElem );
}
Element[] paramElems = XMLTool.getElements( contentobjectdata, "stylesheetparam" );
for ( Element paramElem1 : paramElems )
{
String type = paramElem1.getAttribute( "type" );
if ( "page".equals( type ) )
{
String menuItemKeyStr = XMLTool.getElementText( paramElem1 );
int menuItemKey = Integer.parseInt( menuItemKeyStr );
String name = admin.getMenuItemName( menuItemKey );
paramElem1.setAttribute( "valuename", name );
}
else if ( "category".equals( type ) )
{
String categoryKeyStr = XMLTool.getElementText( paramElem1 );
int categoryKey = Integer.parseInt( categoryKeyStr );
String name = admin.getMenuItemName( categoryKey );
paramElem1.setAttribute( "valuename", name );
}
}
paramElems = XMLTool.getElements( contentobjectdata, "borderparam" );
for ( Element paramElem : paramElems )
{
String type = paramElem.getAttribute( "type" );
if ( "page".equals( type ) )
{
String menuItemKeyStr = XMLTool.getElementText( paramElem );
int menuItemKey = Integer.parseInt( menuItemKeyStr );
String name = admin.getMenuItemName( menuItemKey );
paramElem.setAttribute( "valuename", name );
}
else if ( "category".equals( type ) )
{
String categoryKeyStr = XMLTool.getElementText( paramElem );
int categoryKey = Integer.parseInt( categoryKeyStr );
String name = admin.getMenuItemName( categoryKey );
paramElem.setAttribute( "valuename", name );
}
}
}
}
ExtendedMap parameters = new ExtendedMap();
// Get default css if present
ResourceKey defaultCSS = admin.getDefaultCSSByMenu( siteKey );
if ( defaultCSS != null )
{
parameters.put( "defaultcsskey", defaultCSS.toString() );
parameters.put( "defaultcsskeyExist", resourceService.getResourceFile( defaultCSS ) == null ? "false" : "true" );
}
addCommonParameters( admin, user, request, parameters, -1, siteKey );
if ( createContentObject )
{
parameters.put( "create", "1" );
parameters.put( "queryparam", "<?xml version=\"1.0\" ?>\n<datasources/>" );
}
else
{
parameters.put( "create", "0" );
queryParam = StringUtil.formatXML( queryParam, 2 );
parameters.put( "queryparam", queryParam );
}
parameters.put( "menukey", String.valueOf( siteKey ) );
parameters.put( "page", String.valueOf( request.getParameter( "page" ) ) );
String subop = formItems.getString( "subop", "" );
if ( "popup".equals( subop ) )
{
URL redirectURL = new URL( "adminpage" );
redirectURL.setParameter( "op", "callback" );
redirectURL.setParameter( "callback", formItems.getString( "callback" ) );
redirectURL.setParameter( "page", 991 );
redirectURL.setParameter( "key", Integer.parseInt( request.getParameter( "key" ) ) );
redirectURL.setParameter( "fieldname", formItems.getString( "fieldname" ) );
redirectURL.setParameter( "fieldrow", formItems.getString( "fieldrow" ) );
parameters.put( "referer", redirectURL.toString() );
parameters.put( "subop", "popup" );
}
else
{
parameters.put( "referer", request.getHeader( "referer" ) );
}
parameters.put( "subop", subop );
parameters.put( "fieldname", formItems.getString( "fieldname", null ) );
parameters.put( "fieldrow", formItems.getString( "fieldrow", null ) );
parameters.put( "script", script );
addAccessLevelParameters( user, parameters );
UserEntity defaultRunAsUser = menuHandler.getRunAsUserForSite( siteKey );
String defaultRunAsUserName = "NA";
if ( defaultRunAsUser != null )
{
defaultRunAsUserName = defaultRunAsUser.getDisplayName();
}
parameters.put( "defaultRunAsUser", defaultRunAsUserName );
transformXML( request, response, doc, "contentobject_form.xsl", parameters );
}
public void handlerRemove( HttpServletRequest request, HttpServletResponse response, HttpSession session, AdminService admin,
ExtendedMap formItems, int key )
throws VerticalRemoveException, VerticalSecurityException, VerticalAdminException
{
User user = securityService.getLoggedInAdminConsoleUser();
admin.removeContentObject( key );
redirectClientToReferer( request, response );
}
public boolean handlerSelect( HttpServletRequest request, HttpServletResponse response, HttpSession session, AdminService admin,
ExtendedMap formItems )
throws VerticalAdminException
{
int menuKey = formItems.getInt( "menukey" );
User user = securityService.getLoggedInAdminConsoleUser();
Document doc = admin.getContentObjectsByMenu( menuKey ).getAsDOMDocument();
// Parameters
ExtendedMap parameters = new ExtendedMap();
addCommonParameters( admin, user, request, parameters, -1, menuKey );
parameters.put( "page", String.valueOf( request.getParameter( "page" ) ) );
parameters.put( "menukey", String.valueOf( menuKey ) );
parameters.put( "datetoday", DateUtil.formatISODateTime( new Date() ) );
//addSortParamteres("name", "ascending", formItems, session, parameters);
String returnKey = request.getParameter( "returnkey" );
String returnView = request.getParameter( "returnview" );
int returnRow;
String tmp = request.getParameter( "returnrow" );
if ( tmp != null && tmp.length() > 0 )
{
returnRow = Integer.parseInt( tmp );
}
else
{
returnRow = -1;
}
parameters.put( "returnview", returnView );
parameters.put( "returnkey", returnKey );
if ( returnRow != -1 )
{
parameters.put( "returnrow", String.valueOf( returnRow ) );
}
if ( request.getParameter( "objectdoc" ) != null && request.getParameter( "objectdoc" ).length() > 0 )
{
parameters.put( "objectdoc", request.getParameter( "objectdoc" ) );
}
transformXML( request, response, doc, "contentobject_selector.xsl", parameters );
return true;
}
public void handlerUpdate( HttpServletRequest request, HttpServletResponse response, HttpSession session, AdminService admin,
ExtendedMap formItems )
throws VerticalAdminException, VerticalEngineException
{
User user = securityService.getLoggedInAdminConsoleUser();
Document coDoc = buildContentObjectXML( admin, formItems, false, false );
admin.updateContentObject( XMLTool.documentToString( coDoc ) );
// it is better to have these 3 lines inside updateContentObject, but updateContentObject is used only from here
final SiteKey siteKey = new SiteKey( formItems.getInt( "menukey" ) );
final PageCache pageCache = pageCacheService.getPageCacheService( siteKey );
pageCache.removePortletWindowEntriesBySite();
String subop = formItems.getString( "subop", "" );
if ( "popup".equals( subop ) )
{
String referer = formItems.getString( "referer" ) + "&title=" + formItems.getString( "name" );
redirectClientToAdminPath( referer, request, response );
}
else
{
int menuKey = formItems.getInt( "menukey", -1 );
MultiValueMap queryParams = new MultiValueMap();
queryParams.put( "page", formItems.get( "page" ) );
queryParams.put( "subop", subop );
queryParams.put( "op", "browse" );
queryParams.put( "menukey", menuKey );
queryParams.put( "fieldname", formItems.getString( "fieldname", null ) );
queryParams.put( "fieldrow", formItems.getString( "fieldrow", null ) );
redirectClientToAdminPath( "adminpage", queryParams, request, response );
}
}
private void spoolDocument( HttpServletResponse res, Document doc )
throws VerticalAdminException
{
res.setContentType( "text/xml; charset=UTF-8" );
OutputStream out = null;
try
{
out = res.getOutputStream();
XMLTool.printDocument( out, doc, 4 );
}
catch ( IOException e )
{
VerticalAdminLogger.errorAdmin( "I/O error: %t", e );
}
finally
{
if ( out != null )
{
try
{
out.close();
}
catch ( IOException e )
{
VerticalAdminLogger.errorAdmin( "I/O error: %t", e );
}
}
}
}
}