/*
*
* 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 2005 - 2008 Pentaho Corporation. All rights reserved.
*
* @created Aug 31, 2005
* @author James Dixon
*/
package org.pentaho.platform.uifoundation.component.xml;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
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;
/**
* 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 ok = 0;
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()))) {
ok++;
} 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;
}
}