/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.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 Lesser General Public License for more details.
*
* Copyright 2005 - 2009 Pentaho Corporation. All rights reserved.
*
*
* @created Jun 24, 2005
* @author James Dixon
*/
package org.pentaho.platform.plugin.action.builtin;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.Node;
import org.pentaho.platform.api.engine.IActionParameter;
import org.pentaho.platform.api.engine.IActionSequenceResource;
import org.pentaho.platform.engine.core.system.PentahoSystem;
import org.pentaho.platform.engine.services.solution.ComponentBase;
import org.pentaho.platform.plugin.action.messages.Messages;
import org.pentaho.platform.util.xml.dom4j.XmlDom4JHelper;
/**
* @author James Dixon
*
* TODO To change the template for this generated type comment go to Window -
* Preferences - Java - Code Style - Code Templates
*/
public class TestComponent extends ComponentBase {
private static final long serialVersionUID = -5888733281367666385L;
/*
* (non-Javadoc)
*
* @see org.pentaho.component.ComponentBase#validate()
*/
@Override
public Log getLogger() {
return LogFactory.getLog(TestComponent.class);
}
private void message(final String message) {
info(message);
System.out.println(message);
}
@Override
protected boolean validateSystemSettings() {
// This component does not have any system settings to validate
return true;
}
@Override
protected boolean validateAction() {
// describe the inputs, outputs and resources available to us
Set inputNames = getInputNames();
Iterator inputNamesIterator = inputNames.iterator();
String inputName;
IActionParameter actionParameter;
while (inputNamesIterator.hasNext()) {
inputName = (String) inputNamesIterator.next();
actionParameter = getInputParameter(inputName);
message(Messages.getInstance().getString("TestComponent.DEBUG_INPUT_DESCRIPTION", inputName, actionParameter.getType())); //$NON-NLS-1$
}
Set outputNames = getOutputNames();
Iterator outputNamesIterator = outputNames.iterator();
String outputName;
while (outputNamesIterator.hasNext()) {
outputName = (String) outputNamesIterator.next();
actionParameter = getOutputItem(outputName);
message(Messages.getInstance().getString("TestComponent.DEBUG_OUTPUT_DESCRIPTION", outputName, actionParameter.getType())); //$NON-NLS-1$
}
Set resourceNames = getResourceNames();
Iterator resourceNamesIterator = resourceNames.iterator();
String resourceName;
IActionSequenceResource actionResource;
while (resourceNamesIterator.hasNext()) {
resourceName = (String) resourceNamesIterator.next();
actionResource = getResource(resourceName);
message(Messages.getInstance()
.getString(
"TestComponent.DEBUG_RESOURCE_DESCRIPTION", resourceName, actionResource.getMimeType(), PentahoSystem.getApplicationContext().getSolutionPath(actionResource.getAddress()))); //$NON-NLS-1$
try {
String content = getResourceAsString(actionResource);
message(Messages.getInstance().getString(
"TestComponent.DEBUG_RESOURCE_CONTENTS", ((content == null) ? "null" : content.substring(0, 100)))); //$NON-NLS-1$ //$NON-NLS-2$
} catch (Exception e) {
message(Messages.getInstance().getString("TestComponent.ERROR_0005_RESOURCE_NOT_LOADED", e.getMessage())); //$NON-NLS-1$
}
}
return true;
}
/*
* (non-Javadoc)
*
* @see org.pentaho.component.ComponentBase#done()
*/
@Override
public void done() {
// TODO Auto-generated method stub
}
/*
* (non-Javadoc)
*
* @see org.pentaho.component.ComponentBase#execute()
*/
@Override
protected boolean executeAction() {
message(Messages.getInstance().getString("TestComponent.DEBUG_EXECUTING_TEST")); //$NON-NLS-1$
Node componentNode = getComponentDefinition();
Set inputNames = getInputNames();
Iterator inputNamesIterator = inputNames.iterator();
String inputName;
IActionParameter actionParameter;
while (inputNamesIterator.hasNext()) {
inputName = (String) inputNamesIterator.next();
actionParameter = getInputParameter(inputName);
message(Messages.getInstance()
.getString(
"TestComponent.DEBUG_INPUT_DESCRIPTION", inputName, actionParameter.getValue().getClass().toString() + "=" + actionParameter.getValue().toString())); //$NON-NLS-1$ //$NON-NLS-2$
}
String test = XmlDom4JHelper.getNodeText("test", componentNode); //$NON-NLS-1$
if ((test == null) || (test.length() < 1)) {
message(componentNode.asXML());
return (true);
}
String newName = XmlDom4JHelper.getNodeText("newname", componentNode); //$NON-NLS-1$
Object theResult = null;
if ("format".equals(test)) { //$NON-NLS-1$
MessageFormat mf = new MessageFormat(XmlDom4JHelper.getNodeText("p1", componentNode, "")); //$NON-NLS-1$ //$NON-NLS-2$
Object obj[] = { getParamFromComponentNode("p2", componentNode), getParamFromComponentNode("p3", componentNode) }; //$NON-NLS-1$ //$NON-NLS-2$
theResult = mf.format(obj);
} else {
Object p1 = getParamFromComponentNode("p1", componentNode); //$NON-NLS-1$
if (p1 == null) {
return (false);
} else if ("toupper".equals(test)) { //$NON-NLS-1$
theResult = p1.toString().toUpperCase();
} else if ("rename".equals(test)) { //$NON-NLS-1$
theResult = p1;
}
else if ("map2params".equals(test)) { //$NON-NLS-1$
if (!(p1 instanceof Map)) {
error(Messages.getInstance().getErrorString("TestComponent.ERROR_0003_PARAMETER_NOT_MAP", "p1")); //$NON-NLS-1$ //$NON-NLS-2$
return (false);
}
Map srcMap = (Map) p1;
for (Iterator it = srcMap.keySet().iterator(); it.hasNext();) {
String key = it.next().toString();
setOutputValue(key, srcMap.get(key));
}
} else if ("print".equals(test)) { //$NON-NLS-1$
String delim = "\r\n***************************************************************\r\n"; //$NON-NLS-1$
theResult = delim + p1.toString() + delim;
} else if ("getkeys".equals(test)) { //$NON-NLS-1$
if (!(p1 instanceof Map)) {
error(Messages.getInstance().getErrorString("TestComponent.ERROR_0003_PARAMETER_NOT_MAP", "p1")); //$NON-NLS-1$ //$NON-NLS-2$
return (false);
}
theResult = new ArrayList(((Map) p1).keySet());
} else {
Object p2 = getParamFromComponentNode("p2", componentNode); //$NON-NLS-1$
if (p2 == null) {
return (false);
}
if ("concat".equals(test)) { //$NON-NLS-1$
theResult = p1.toString() + p2.toString();
} else if ("print2".equals(test)) { //$NON-NLS-1$
String delim = Messages.getInstance().getString("TestComponent.CODE_PRINT_DELIM"); //$NON-NLS-1$
theResult = delim + p1.toString() + " - " + p2.toString() + delim; //$NON-NLS-1$
} else {
Object p3 = getParamFromComponentNode("p3", componentNode); //$NON-NLS-1$
if (p3 == null) {
return (false);
}
if ("merge".equals(test)) { //$NON-NLS-1$
// merge cycles through each property map in list p2.
// For each map, it cycles through the keys in map p1
// and compares the key name
// from p1 with a value from p2. p3 specifies the key in
// p2 to compare with. When a match is found, an entry
// is added to an output
// output list that is identical to the map from p2. The
// value specified by the key in p1 will be added to the
// output under the key "NewKey"
if (!(p1 instanceof Map) || !(p2 instanceof List) || !(p3 instanceof String)) {
error(Messages.getInstance().getErrorString("TestComponent.ERROR_0004_P1_P2_WRONG_TYPE")); //$NON-NLS-1$
return (false);
}
theResult = merge((Map) p1, (List) p2, (String) p3);
} else {
message(Messages.getInstance().getErrorString("TestComponent.ERROR_0001_TEST_NODE_NOT_FOUND")); //$NON-NLS-1$
return false;
}
}
}
}
if (newName != null) {
message(newName + " = " + theResult); //$NON-NLS-1$
try {
setOutputValue(newName, theResult);
} catch (Exception e) {
} // setOutputValue logs an error mesage
} else {
message("The result = " + theResult); //$NON-NLS-1$
}
return (true);
}
/*
* (non-Javadoc)
*
* @see org.pentaho.component.ComponentBase#init()
*/
@Override
public boolean init() {
message(Messages.getInstance().getString("TestComponent.DEBUG_INITIALIZING_TEST")); //$NON-NLS-1$
return true;
}
protected Object getActionParameterValue(final String name) {
try {
return (getInputValue(name));
} catch (Exception e) {
} // Return null if it doesn't exist
return (null);
}
private List merge(final Map hm, final List list, final String keyName) {
ArrayList al = new ArrayList();
for (Iterator it = list.iterator(); it.hasNext();) {
Object item = it.next();
if (item instanceof Map) {
Map resMap = merge(hm, (Map) item, keyName);
if (resMap != null) {
al.add(resMap);
}
}
}
return (al);
}
private Map merge(final Map srcMap, final Map destMap, final String keyName) {
Object keyValue = destMap.get(keyName);
Map rtnMap = null;
for (Iterator it = srcMap.keySet().iterator(); it.hasNext();) {
String key = it.next().toString();
if ((keyValue != null) && key.equalsIgnoreCase(keyValue.toString())) {
rtnMap = new HashMap(destMap);
rtnMap.put("NewKey", srcMap.get(key)); //$NON-NLS-1$
return (rtnMap);
}
}
return (rtnMap);
}
private Object getParamFromComponentNode(final String paramName, final Node componentNode) {
String param = XmlDom4JHelper.getNodeText(paramName, componentNode);
if ((param == null) || (param.length() < 1)) {
error(Messages.getInstance().getErrorString("TestComponent.ERROR_0002_PARAMETER_MISSING", paramName)); //$NON-NLS-1$
return (null);
}
return (getActionParameterValue(param));
}
}