/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.portal.datasource.context;
import javax.servlet.http.HttpServletRequest;
import org.jdom.Document;
import org.jdom.Element;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.enonic.vertical.engine.handlers.MenuHandler;
import com.enonic.cms.core.Attribute;
import com.enonic.cms.core.SiteURLResolver;
import com.enonic.cms.core.language.LanguageEntity;
import com.enonic.cms.core.portal.PageRequestType;
import com.enonic.cms.core.portal.datasource.DataSourceType;
import com.enonic.cms.core.portal.datasource.executor.DataSourceExecutorContext;
import com.enonic.cms.core.portal.rendering.tracing.RenderTrace;
import com.enonic.cms.core.resource.ResourceService;
import com.enonic.cms.core.structure.SiteEntity;
import com.enonic.cms.core.structure.SiteProperties;
import com.enonic.cms.store.dao.GroupDao;
@Component
public final class DataSourcesContextXmlCreator
implements InitializingBean
{
@Autowired
private ResourceService resourceService;
@Autowired
private SiteURLResolver siteURLResolver;
@Autowired
private GroupDao groupDao;
@Autowired
private MenuHandler menuHandler;
private UserContextXmlCreator userContextXmlCreator;
private QueryStringContextXmlCreator queryStringContextXmlCreator;
private StylesContextXmlCreator stylesContextXmlCreator;
private final WindowContextXmlCreator windowContextXmlCreator = new WindowContextXmlCreator();
private final PageContextXmlCreator pageContextXmlCreator = new PageContextXmlCreator();
public void afterPropertiesSet()
{
stylesContextXmlCreator = new StylesContextXmlCreator( resourceService );
queryStringContextXmlCreator = new QueryStringContextXmlCreator( siteURLResolver );
userContextXmlCreator = new UserContextXmlCreator( groupDao );
}
public Element createContextElement( final DataSourceExecutorContext context )
{
Element contextElem = new Element( "context" );
SiteEntity site = context.getSite();
SiteProperties siteProperties = context.getSiteProperties();
LanguageEntity language = context.getLanguage();
final HttpServletRequest request = context.getHttpRequest();
// Language context
contextElem.setAttribute( "languagecode", language.getCode() );
// Querystring context
Element queryStringElem =
queryStringContextXmlCreator.createQueryStringElement( context.getHttpRequest(), context.getOriginalSitePath(),
context.getRequestParameters() );
contextElem.addContent( queryStringElem );
// render mode
String mode = "live";
if ( RenderTrace.isTraceOn() )
{
mode = "edit";
}
else if ( request == null || "true".equals( request.getAttribute( Attribute.PREVIEW_ENABLED ) ) )
{
mode = "preview";
}
addElement( "render-mode", mode, contextElem );
// Device context
if ( context.getDeviceClass() != null )
{
addElement( "device-class", context.getDeviceClass(), contextElem );
}
// Locale context
if ( context.getLocale() != null )
{
addElement( "locale", context.getLocale().toString(), contextElem );
}
// User context
if ( context.getUser() != null && !context.getUser().isAnonymous() )
{
contextElem.addContent( userContextXmlCreator.createUserElement( context.getUser() ) );
}
// Site context
if ( site != null )
{
SiteContextXmlCreator siteContextXmlCreator = new SiteContextXmlCreator(menuHandler);
contextElem.addContent( siteContextXmlCreator.createSiteElement( site, siteProperties ) );
}
// Resource context
if ( context.getMenuItem() != null || context.getPageTemplate() != null )
{
ResourceContextXmlCreator contentContextXmlCreator = new ResourceContextXmlCreator( context );
contextElem.addContent( contentContextXmlCreator.createResourceElement() );
}
// Datasource call from a page template
if ( DataSourceType.PAGETEMPLATE.equals( context.getDataSourceType() ) )
{
final Element pageEl;
if ( PageRequestType.CONTENT.equals( context.getPageRequestType() ) )
{
pageEl = pageContextXmlCreator.createPageElementForContentRequest( context.getRegions(), context.getPageTemplate() );
contextElem.addContent( pageEl );
}
else if ( context.getMenuItem() != null )
{
pageEl = pageContextXmlCreator.createPageElementForMenuItemRequest( context.getRegions(), context.getMenuItem(),
context.getPageTemplate() );
contextElem.addContent( pageEl );
}
}
// Datasource call from a portlet
else if ( context.getDataSourceType().equals( DataSourceType.PORTLET ) && context.getWindow() != null )
{
Element portletDocumentEl = null;
final Document portletDocument = context.getPortletDocument();
if ( portletDocument != null )
{
portletDocumentEl = (Element) portletDocument.getRootElement().detach();
}
final Element windowEl =
windowContextXmlCreator.createPortletWindowElement( context.getWindow(), context.isPortletWindowRenderedInline(),
portletDocumentEl );
contextElem.addContent( windowEl );
}
// Profile context
if ( context.getProfile() != null )
{
addElement( "profile", context.getProfile(), contextElem );
}
// Styles context
if ( context.hasCssKeys() )
{
Element frameworkEl = getOrCreateElement( contextElem, "framework" );
Element stylesEl = stylesContextXmlCreator.createStylesElement( context.getCssKeys() );
frameworkEl.addContent( stylesEl );
}
return contextElem;
}
private void addElement( String name, String textContent, Element parent )
{
parent.addContent( new Element( name ).setText( textContent ) );
}
private Element getOrCreateElement( Element parent, String name )
{
Element elem = parent.getChild( name );
if ( elem != null )
{
return elem;
}
elem = new Element( name );
parent.addContent( elem );
return elem;
}
}