/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.resolver; import org.springframework.beans.factory.annotation.Autowired; import com.enonic.cms.framework.xml.XMLDocument; import com.enonic.cms.core.resolver.locale.LocaleResolverException; import com.enonic.cms.core.resource.FileResourceName; import com.enonic.cms.core.resource.ResourceFile; import com.enonic.cms.core.xslt.XsltProcessorException; import com.enonic.cms.core.xslt.portal.PortalXsltProcessor; import com.enonic.cms.core.xslt.portal.PortalXsltProcessorFactory; public abstract class AbstractXsltScriptResolver implements ScriptResolverService { protected final static String RESOLVING_EXCEPTION_MSG = "Failed to resolve value"; private ResolverInputXMLCreator resolverInputXMLCreator; private PortalXsltProcessorFactory xsltProcessorFactory; public ScriptResolverResult resolveValue( ResolverContext context, ResourceFile localeResolverScript ) { XMLDocument resolverInput = getResolverInput( context ); String resolvedValue; try { resolvedValue = resolveWithXsltScript( localeResolverScript, resolverInput ); } catch ( XsltProcessorException e ) { throw new LocaleResolverException( RESOLVING_EXCEPTION_MSG + " using script : " + localeResolverScript.getPath(), e ); } return populateScriptResolverResult( resolvedValue ); } protected abstract ScriptResolverResult populateScriptResolverResult( String resolvedValue ); protected String cleanWhitespaces( String value ) { value = value.replaceAll( "(\\n)", "" ); value = value.replaceAll( "(\\t)", "" ); value = value.replaceAll( "(\\s)", "" ); return value; } private String resolveWithXsltScript( ResourceFile xsl, XMLDocument xml ) throws XsltProcessorException { final PortalXsltProcessor processor = this.xsltProcessorFactory.createProcessor( new FileResourceName( xsl.getPath() ) ); processor.setOmitXmlDecl( true ); String result = processor.process( xml.getAsJDOMSource() ); return cleanWhitespaces( result ); } protected XMLDocument getResolverInput( ResolverContext context ) { return resolverInputXMLCreator.buildResolverInputXML( context ); } @Autowired public void setResolverInputXMLCreator( ResolverInputXMLCreator resolverInputXMLCreator ) { this.resolverInputXMLCreator = resolverInputXMLCreator; } @Autowired public void setXsltProcessorFactory( final PortalXsltProcessorFactory xsltProcessorFactory ) { this.xsltProcessorFactory = xsltProcessorFactory; } }