/* * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License, version 2 as published by the Free Software * Foundation. * * You should have received a copy of the GNU General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/gpl-2.0.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * * Copyright 2006 - 2013 Pentaho Corporation. All rights reserved. */ package org.pentaho.platform.uifoundation.component.xml; import org.dom4j.Document; import org.dom4j.Element; import org.pentaho.platform.api.engine.ILogger; import org.pentaho.platform.api.engine.IPentahoSession; import org.pentaho.platform.api.util.XmlParseException; import org.pentaho.platform.engine.core.system.PentahoSystem; import org.pentaho.platform.engine.services.solution.PentahoEntityResolver; import org.pentaho.platform.uifoundation.component.FilterDefinition; import org.pentaho.platform.uifoundation.messages.Messages; import org.pentaho.platform.util.UUIDUtil; import org.pentaho.platform.util.xml.XForm; import org.pentaho.platform.util.xml.dom4j.XmlDom4JHelper; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; /** * This class stores the defintion of filters that are used by FilterComponent to generate content for user * interfaces. * * This object supports mulitple filters. It stores information about the sources of the values for each filters. * It generates an XForm snippet to represent the selections. * * @author James Dixon * */ public class FilterPanel { public static final boolean debug = PentahoSystem.debug; // TODO, move to Java 5, generic as ArrayList<FilterDefinition> ArrayList filterList; String error; String name; ILogger logger; // TODO sbarkdull, this may be worth reimplementing, and not using a DOM Document // but using SAX to parse the document. Note that the document is parsed in this // constructor, and then thrown away. This is usually a good sign that SAX // is a more optimal solution. On the other hand, these documents are small, and there // are few of them, so maybe it is no big deal. public FilterPanel( final IPentahoSession session, final Document document, final ILogger logger ) throws FilterPanelException { this.logger = logger; filterList = new ArrayList(); if ( document != null ) { // create the filter definitions List filterNodes = document.selectNodes( "filters/filter" ); //$NON-NLS-1$ Iterator filtersIterator = filterNodes.iterator(); while ( filtersIterator.hasNext() ) { Element filterNode = (Element) filtersIterator.next(); FilterDefinition filterDefinition = FilterDefinitionFactory.create( filterNode, session, logger ); filterList.add( filterDefinition ); } if ( filterList.size() == 0 ) { error = Messages.getInstance().getString( "FilterPanel.ERROR_0001_NO_FILTERS" ); //$NON-NLS-1$ return; } } } public List getFilters() { return filterList; } public boolean populate( final Map parameterProviders, final Map defaultValues ) { int fail = 0; if ( filterList != null ) { Iterator filtersIterator = filterList.iterator(); while ( filtersIterator.hasNext() ) { FilterDefinition filterDefinition = (FilterDefinition) filtersIterator.next(); if ( filterDefinition.populate( parameterProviders, (String[]) defaultValues .get( filterDefinition.getName() ) ) ) { boolean ignore = true; } else { fail++; } } } return ( fail == 0 ); } public Document getXForm( final String actionUrl ) { StringBuffer content = new StringBuffer(); Document document = null; // String strUuid = UUID.randomUUID().toString().replaceAll( "-", "_"); String strUuid = UUIDUtil.getUUIDAsString().replaceAll( "-", "_" ); //$NON-NLS-1$ //$NON-NLS-2$ content.append( "<filters xmlns:xf=\"http://www.w3.org/2002/xforms\"><id>" + strUuid + "</id><title><![CDATA[" + //$NON-NLS-1$ //$NON-NLS-2$ Messages.getInstance().getEncodedString( name ) + "]]></title><description></description><help></help>" + //$NON-NLS-1$ "<action><![CDATA[" + actionUrl + "]]></action>" ); //$NON-NLS-1$ //$NON-NLS-2$ if ( error != null ) { content.append( "<error>" ); //$NON-NLS-1$ content.append( error ); content.append( "</error>" ); //$NON-NLS-1$ } else if ( filterList == null ) { content.append( "<error>" ); //$NON-NLS-1$ content.append( Messages.getInstance().getString( "FilterPanel.ERROR_0003_NO_FILTER_VALUES" ) ); //$NON-NLS-1$ content.append( "</error>" ); //$NON-NLS-1$ } else { try { Iterator filtersIterator = filterList.iterator(); StringBuffer xformHeader = new StringBuffer(); String formName = null; while ( filtersIterator.hasNext() ) { FilterDefinition filterDefinition = (FilterDefinition) filtersIterator.next(); String filterName = filterDefinition.getName(); if ( formName == null ) { formName = filterName; } String title = filterDefinition.getTitle(); StringBuffer xformBody = new StringBuffer(); // XForm.createXFormHeader(name, xformHeader); filterDefinition.getXForm( xformHeader, xformBody ); // XForm.completeXForm(XForm.OUTPUT_HTML, filterName, new StringBuffer(), xformBody); // content.append( "<filter name=\""+filterName+"\">" // ).append(filterContent).append( "</filter>" ); // //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ content.append( "<filter><name><![CDATA[" + filterName + "]]></name>" ) //$NON-NLS-1$ //$NON-NLS-2$ .append( "<title><![CDATA[" + title + "]]></title><control>" ) //$NON-NLS-1$ //$NON-NLS-2$ .append( xformBody ).append( "</control></filter>" ); //$NON-NLS-1$ } XForm.completeXFormHeader( formName, xformHeader ); content.append( xformHeader ); } catch ( Exception e ) { logger.error( Messages.getInstance().getErrorString( "FilterPanel.ERROR_0004_COULD_NOT_CREATE_CONTENT" ), e ); //$NON-NLS-1$ } } content.append( "</filters>" ); //$NON-NLS-1$ if ( FilterPanel.debug ) { logger.debug( content.toString() ); } try { document = XmlDom4JHelper.getDocFromString( content.toString(), new PentahoEntityResolver() ); } catch ( XmlParseException e ) { logger.error( Messages.getInstance().getErrorString( "FilterPanel.ERROR_0004_COULD_NOT_CREATE_CONTENT" ), e ); //$NON-NLS-1$ } return document; } }