/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.upgrade.task.datasource; import java.util.List; import org.jdom.Comment; import org.jdom.Element; import org.jdom.output.Format; import org.jdom.output.XMLOutputter; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.enonic.cms.upgrade.task.datasource.method.DataSourceMethodConverter; import com.enonic.cms.upgrade.task.datasource.method.DataSourceMethodConverters; import com.enonic.cms.upgrade.task.datasource.method.MethodElementBuilder; import static com.enonic.cms.upgrade.task.datasource.JDOMDocumentHelper.copyAttributeIfExists; import static com.enonic.cms.upgrade.task.datasource.JDOMDocumentHelper.findElements; import static com.enonic.cms.upgrade.task.datasource.JDOMDocumentHelper.getTextNode; public final class DataSourceConverter2 extends DataSourceConverter { private final DataSourceMethodConverters converters; private final XMLOutputter xmlOutputter; public DataSourceConverter2( final DataSourceConverterLogger logger ) { super( logger ); this.converters = new DataSourceMethodConverters(); this.xmlOutputter = new XMLOutputter( Format.getCompactFormat() ); } @Override public Element convert( final Element root ) throws Exception { final Element result = new Element( root.getName() ); copyAttributeIfExists( root, result, "result-element" ); convertContext( root, result ); for ( final Element child : findElements( root, "datasource" ) ) { convertMethod( child, result ); } return result; } private MethodElementBuilder method( final String name ) { return new MethodElementBuilder( name ); } private void convertContext( final Element source, final Element target ) { if ( "true".equals( source.getAttributeValue( "cookie-context" ) ) ) { target.addContent( method( "getCookieContext" ).resultElement( "context" ).build() ); } if ( "true".equals( source.getAttributeValue( "http-context" ) ) ) { target.addContent( method( "getHttpContext" ).resultElement( "context" ).build() ); } if ( "true".equals( source.getAttributeValue( "session-context" ) ) ) { target.addContent( method( "getSessionContext" ).resultElement( "context" ).build() ); } } private String[] findParameterValues( final Element source ) { final List<String> list = Lists.newArrayList(); for ( final Element child : findElements( source, "parameter" ) ) { list.add( getTextNode( child ) ); } return Iterables.toArray( list, String.class ); } private void convertMethod( final Element source, final Element result ) { final String name = source.getAttributeValue( "name" ); final String[] params = findParameterValues( source ); final Element target = createMethod( name, params ); if ( target == null ) { result.addContent( createComment( name, params, source ) ); return; } copyAttributeIfExists( source, target, "result-element" ); copyAttributeIfExists( source, target, "cache" ); copyAttributeIfExists( source, target, "condition" ); result.addContent( target ); } private Element createMethod( final String name, final String[] params ) { final DataSourceMethodConverter converter = this.converters.get( name ); if ( converter == null ) { return createExtension( name, params ); } return converter.convert( params ); } private Comment createComment( final String name, final String[] params, final Element elem ) { this.logger.logWarning( currentContext + " : method name[" + name + "]with[" + params.length + "] parameters not found. Commenting out." ); return new Comment( this.xmlOutputter.outputString( elem ) ); } private Element createExtension( final String name, final String[] params ) { if ( !name.contains( "." ) ) { return null; } final MethodElementBuilder builder = method( "invokeExtension" ); builder.param( "name", name ); for ( int i = 0; i < params.length; i++ ) { builder.param( "param" + ( i + 1 ), params[i] ); } return builder.build(); } }