/*
* 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 2006 - 2009 Pentaho Corporation. All rights reserved.
*
*
* @created May 4, 2006
* @author James Dixon
*/
package org.pentaho.platform.plugin.action.examples;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.MessageFormat;
import java.util.HashMap;
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.actionsequence.dom.IActionDefinition;
import org.pentaho.commons.connection.IPentahoStreamSource;
import org.pentaho.platform.api.engine.IActionParameter;
import org.pentaho.platform.api.engine.IActionSequenceResource;
import org.pentaho.platform.api.engine.IComponent;
import org.pentaho.platform.api.engine.ILogger;
import org.pentaho.platform.api.engine.IPentahoSession;
import org.pentaho.platform.api.engine.IRuntimeContext;
import org.pentaho.platform.api.engine.ISelectionMapper;
import org.pentaho.platform.api.repository.IContentItem;
import org.pentaho.platform.api.util.IVersionHelper;
import org.pentaho.platform.engine.core.system.PentahoSystem;
import org.pentaho.platform.engine.services.solution.StandardSettings;
import org.pentaho.platform.plugin.action.messages.Messages;
public class ComponentImplementationExample extends Object implements IComponent {
protected int loggingLevel = ILogger.UNKNOWN;
public static final String LOGID_MASK1 = "{0}:{1}:{2}: "; //$NON-NLS-1$
public static final String LOGID_MASK2 = "{0}:{1}:{2}:{3} "; //$NON-NLS-1$
public static final String LOGID_SEPARATOR = ":"; //$NON-NLS-1$
public String EMPTYLOGID = "::: "; //$NON-NLS-1$
private String logId = EMPTYLOGID;
protected static final boolean debug = PentahoSystem.debug;
private IRuntimeContext runtimeContext;
private IPentahoSession sessionContext;
private String processId;
private String actionName;
private String instanceId;
private String id;
private boolean baseInitOk;
private boolean componentInitOk;
private Node componentDefinition;
private Map<String, String> componentDefinitionMap;
private HashMap settings;
private IActionDefinition actionDefinition;
protected boolean executeAction() throws Throwable {
// TODO add your execute code here
return false;
}
public boolean validateAction() {
// TODO add any validation code in here and return true
return false;
}
protected boolean validateSystemSettings() {
// TODO add any validation of system settings here and return true
return false;
}
public void done() {
// TODO add any cleanup code here
}
public boolean init() {
// TODO add any initialization code and return true
return false;
}
public void setLogId(final String lId) {
logId = lId;
}
public Log getLogger() {
return LogFactory.getLog(this.getClass());
}
public void genLogIdFromSession(final IPentahoSession sess) {
genLogIdFromInfo(sess.getId() != null ? sess.getId() : "", //$NON-NLS-1$
sess.getProcessId() != null ? sess.getProcessId() : "", //$NON-NLS-1$
sess.getActionName() != null ? sess.getActionName() : "" //$NON-NLS-1$
);
}
public void genLogIdFromInfo(final String sessId, final String procId, final String actName) {
Object[] args = { sessId, procId, actName };
setLogId(MessageFormat.format(ComponentImplementationExample.LOGID_MASK1, args));
}
public void genLogIdFromInfo(final String sessId, final String procId, final String actName, final String instId) {
Object[] args = { sessId, procId, actName, instId };
setLogId(MessageFormat.format(ComponentImplementationExample.LOGID_MASK2, args));
}
/* ILogger Implementation */
public String getObjectName() {
return this.getClass().getName();
}
public int getLoggingLevel() {
return loggingLevel;
}
public void setLoggingLevel(final int logLevel) {
this.loggingLevel = logLevel;
}
private List messages;
public List getMessages() {
return messages;
}
public void setMessages(final List messages) {
this.messages = messages;
}
public void trace(final String message) {
if (loggingLevel <= ILogger.TRACE) {
if (messages != null) {
messages.add(Messages.getInstance().getString("Message.USER_DEBUG", message, getClass().getName())); //$NON-NLS-1$
}
getLogger().trace(getLogId() + message);
}
}
public void debug(final String message) {
if (loggingLevel <= ILogger.DEBUG) {
if (messages != null) {
messages.add(Messages.getInstance().getString("Message.USER_DEBUG", message, getClass().getName())); //$NON-NLS-1$
}
getLogger().debug(getLogId() + message);
}
}
public void info(final String message) {
if (loggingLevel <= ILogger.INFO) {
if (messages != null) {
messages.add(Messages.getInstance().getString("Message.USER_INFO", message, getClass().getName())); //$NON-NLS-1$
}
getLogger().info(getLogId() + message);
}
}
public void warn(final String message) {
if (loggingLevel <= ILogger.WARN) {
if (messages != null) {
messages.add(Messages.getInstance().getString("Message.USER_WARNING", message, getClass().getName())); //$NON-NLS-1$
}
getLogger().warn(getLogId() + message);
}
}
public void error(final String message) {
if (loggingLevel <= ILogger.ERROR) {
if (messages != null) {
messages.add(Messages.getInstance().getString("Message.USER_ERROR", message, getClass().getName())); //$NON-NLS-1$
}
getLogger().error(getLogId() + message);
}
}
public void fatal(final String message) {
if (loggingLevel <= ILogger.FATAL) {
if (messages != null) {
messages.add(Messages.getInstance().getString("Message.USER_ERROR", message, getClass().getName())); //$NON-NLS-1$
}
getLogger().fatal(getLogId() + message);
}
}
public void trace(final String message, final Throwable error) {
if (loggingLevel <= ILogger.TRACE) {
if (messages != null) {
messages.add(Messages.getInstance().getString("Message.USER_DEBUG", message, getClass().getName())); //$NON-NLS-1$
}
getLogger().trace(getLogId() + message, error);
}
}
public void debug(final String message, final Throwable error) {
if (loggingLevel <= ILogger.DEBUG) {
if (messages != null) {
messages.add(Messages.getInstance().getString("Message.USER_DEBUG", message, getClass().getName())); //$NON-NLS-1$
}
getLogger().debug(getLogId() + message, error);
}
}
public void info(final String message, final Throwable error) {
if (loggingLevel <= ILogger.INFO) {
if (messages != null) {
messages.add(Messages.getInstance().getString("Message.USER_INFO", message, getClass().getName())); //$NON-NLS-1$
}
getLogger().info(getLogId() + message, error);
}
}
public void warn(final String message, final Throwable error) {
if (loggingLevel <= ILogger.WARN) {
if (messages != null) {
messages.add(Messages.getInstance().getString("Message.USER_WARNING", message, getClass().getName())); //$NON-NLS-1$
}
getLogger().warn(getLogId() + message, error);
}
}
public void error(final String message, final Throwable error) {
if (loggingLevel <= ILogger.ERROR) {
if (messages != null) {
messages.add(Messages.getInstance().getString("Message.USER_ERROR", message, getClass().getName())); //$NON-NLS-1$
}
IVersionHelper versionHelper = PentahoSystem.get(IVersionHelper.class, null);
getLogger().error("Error Start: Pentaho " + versionHelper.getVersionInformation(this.getClass())); //$NON-NLS-1$
getLogger().error(getLogId() + message, error);
getLogger().error("Error end:"); //$NON-NLS-1$
}
}
public void fatal(final String message, final Throwable error) {
if (loggingLevel <= ILogger.FATAL) {
if (messages != null) {
messages.add(Messages.getInstance().getString("Message.USER_ERROR", message, getClass().getName())); //$NON-NLS-1$
}
IVersionHelper versionHelper = PentahoSystem.get(IVersionHelper.class, null);
getLogger().error("Error: Pentaho " + versionHelper.getVersionInformation(this.getClass())); //$NON-NLS-1$
getLogger().fatal(getLogId() + message, error);
getLogger().error("Error end:"); //$NON-NLS-1$
}
}
public static String getUserString(final String type) {
return Messages.getInstance().getString("Message.USER_" + type); //$NON-NLS-1$
}
public void setInstanceId(final String instanceId) {
this.instanceId = instanceId;
}
public String getInstanceId() {
return instanceId;
}
public void setActionName(final String actionName) {
this.actionName = actionName;
}
public String getActionName() {
return actionName;
}
public void setProcessId(final String processId) {
this.processId = processId;
}
public String getProcessId() {
return processId;
}
public void setComponentDefinitionMap(final Map<String, String> componentDefinitionMap) {
this.componentDefinitionMap = componentDefinitionMap;
}
public void setComponentDefinition(final Node componentDefinition) {
this.componentDefinition = componentDefinition;
}
public Node getComponentDefinition() {
return componentDefinition;
}
public void setRuntimeContext(final IRuntimeContext runtimeContext) {
this.runtimeContext = runtimeContext;
}
public IRuntimeContext getRuntimeContext() {
return runtimeContext;
}
public void setSession(final IPentahoSession session) {
this.sessionContext = session;
}
public IPentahoSession getSession() {
return sessionContext;
}
protected void saveSetting(final String name, final Object value) {
settings.put(name, value);
}
protected Object getSetting(final String name) {
return settings.get(name);
}
protected String getStringSetting(final String name) {
Object value = settings.get(name);
if (value == null) {
return null;
} else if (value instanceof String) {
return (String) value;
} else {
return value.toString();
}
}
public String getLogId() {
return logId;
}
protected boolean isDefinedInput(final String inputName) {
if (runtimeContext.getInputNames().contains(inputName)) {
return true;
} else {
return getComponentSetting(inputName) != null;
}
}
protected boolean isDefinedOutput(final String outputName) {
return runtimeContext.getOutputNames().contains(outputName);
}
protected boolean isDefinedResource(final String resourceName) {
return runtimeContext.getResourceNames().contains(resourceName);
}
public final int validate() {
logId = Messages.getInstance().getString("Base.CODE_LOG_ID", instanceId, runtimeContext.getHandle(), actionName); //$NON-NLS-1$
if (ComponentImplementationExample.debug) {
debug(Messages.getInstance().getString("Base.DEBUG_VALIDATING_COMPONENT", actionName)); //$NON-NLS-1$
// grab the parameters first
}
id = Messages.getInstance().getString("Base.CODE_COMPONENT_ID", processId, actionName); //$NON-NLS-1$
// now get picky about values
baseInitOk = ((instanceId != null) && (sessionContext != null) && (processId != null) && (actionName != null));
boolean systemSettingsValidate = validateSystemSettings();
if (baseInitOk && systemSettingsValidate) {
componentInitOk = validateAction();
}
if (getInitOk()) {
return IRuntimeContext.RUNTIME_CONTEXT_VALIDATE_OK;
}
return IRuntimeContext.RUNTIME_CONTEXT_VALIDATE_FAIL;
}
public boolean getInitOk() {
return baseInitOk && componentInitOk;
}
protected Set getOutputNames() {
return runtimeContext.getOutputNames();
}
protected Set getInputNames() {
return runtimeContext.getInputNames();
}
protected Set getResourceNames() {
return runtimeContext.getResourceNames();
}
protected boolean feedbackAllowed() {
return runtimeContext.feedbackAllowed();
}
protected IActionSequenceResource getResource(final String resourceName) {
return runtimeContext.getResourceDefintion(resourceName);
}
protected InputStream getResourceInputStream(final IActionSequenceResource resource) throws FileNotFoundException {
return runtimeContext.getResourceInputStream(resource);
}
protected InputStream getInputStream(final String inputName) {
return runtimeContext.getInputStream(inputName);
}
protected int getOutputPreference() {
return runtimeContext.getOutputPreference();
}
protected IContentItem getOutputItem(final String outputName, final String mimeType, final String extension) {
return runtimeContext.getOutputItem(outputName, mimeType, extension);
}
protected void audit(final String messageType, final String message, final String value, final int duration) {
runtimeContext.audit(messageType, message, value, duration);
}
protected boolean getInputBooleanValue(final String inputName, final boolean defaultValue) {
String strValue = getInputStringValue(inputName);
if (strValue == null) {
return defaultValue;
} else if ("true".equalsIgnoreCase(strValue)) { //$NON-NLS-1$
return true;
} else if ("false".equalsIgnoreCase(strValue)) { //$NON-NLS-1$
return false;
} else {
return defaultValue;
}
}
protected long getInputLongValue(final String inputName, final long defaultValue) {
String strValue = getInputStringValue(inputName);
if (strValue == null) {
return defaultValue;
}
try {
return Long.parseLong(strValue);
} catch (Exception e) {
return defaultValue;
}
}
protected String getInputStringValue(final String inputName) {
// first check to see if we have an input parameter that we can use for
// this.
String value = null;
if (runtimeContext.getInputNames().contains(inputName)) {
value = runtimeContext.getInputParameterStringValue(inputName);
} else if (componentDefinitionMap.containsKey(inputName)) {
value = componentDefinitionMap.get(inputName);
} else {
// now check the component node from the action definition.
Node node = componentDefinition.selectSingleNode(inputName);
if (node == null) {
return null;
}
value = node.getText();
}
value = this.applyInputsToFormat(value);
return value;
}
protected Object getInputValue(final String inputName) {
// first check to see if we have an input parameter that we can use for
// this.
if (runtimeContext.getInputNames().contains(inputName)) {
return runtimeContext.getInputParameterValue(inputName);
}
// now check the component node from the action definition.
Node node = componentDefinition.selectSingleNode(inputName);
if (node == null) {
return null;
}
return node.getText();
}
private String getComponentSetting(final String path) {
// first check to see if we have an input parameter that we can use for
// this.
if (runtimeContext.getInputNames().contains(path)) {
return runtimeContext.getInputParameterStringValue(path);
}
// now check the component node from the action definition.
Node node = componentDefinition.selectSingleNode(path);
if (node == null) {
return null;
}
return node.getText();
}
public void promptNeeded() {
runtimeContext.promptNeeded();
}
public void promptNow() {
runtimeContext.promptNow();
}
public String getResourceAsString(final IActionSequenceResource resource) {
try {
return runtimeContext.getResourceAsString(resource);
} catch (Exception e) {
return null;
}
}
public String getInitFailMessage() {
return null;
}
public String createNewInstance(final boolean persisted, final Map parameters, final boolean forceImmediateWrite) {
return runtimeContext.createNewInstance(persisted, parameters, forceImmediateWrite);
}
public void inputMissingError(final String paramName) {
error(Messages.getInstance().getErrorString("ComponentBase.ERROR_0003_INPUT_PARAM_MISSING", paramName)); //$NON-NLS-1$
}
public void outputMissingError(final String paramName) {
error(Messages.getInstance().getErrorString("ComponentBase.ERROR_0004_OUTPUT_PARAM_MISSING", paramName)); //$NON-NLS-1$
}
public void resourceMissingError(final String paramName) {
error(Messages.getInstance().getErrorString("ComponentBase.ERROR_0005_RESOURCE_PARAM_MISSING", paramName)); //$NON-NLS-1$
}
public void resourceComponentSettingError(final String paramName) {
error(Messages.getInstance().getErrorString("ComponentBase.ERROR_0006_COMPONENT_SETTING_PARAM_MISSING", paramName)); //$NON-NLS-1$
}
public int execute() {
// see if we have a custom XSL for the parameter page, if required
String xsl = getComponentSetting("xsl"); //$NON-NLS-1$
if (xsl != null) {
runtimeContext.setParameterXsl(xsl);
}
// see if we have a target window for the output
String target = getComponentSetting("target"); //$NON-NLS-1$
if (target != null) {
runtimeContext.setParameterTarget(target);
}
if (loggingLevel == ILogger.UNKNOWN) {
warn(Messages.getInstance().getString("Base.WARNING_LOGGING_LEVEL_UNKNOWN")); //$NON-NLS-1$
loggingLevel = ILogger.DEBUG;
}
int result = IRuntimeContext.RUNTIME_STATUS_FAILURE;
if (sessionContext == null) {
error(Messages.getInstance().getErrorString("Base.ERROR_0001_INVALID_SESSION")); //$NON-NLS-1$
return result;
}
if (ComponentImplementationExample.debug) {
debug(Messages.getInstance().getString("Base.DEBUG_VALIDATION_RESULT") + getInitOk()); //$NON-NLS-1$
}
if (!getInitOk()) {
return result;
}
try {
result = (executeAction() ? IRuntimeContext.RUNTIME_STATUS_SUCCESS : IRuntimeContext.RUNTIME_STATUS_FAILURE);
if ((result == IRuntimeContext.RUNTIME_STATUS_SUCCESS) && runtimeContext.isPromptPending()) {
// see if we need to prevent further components from executing
if (isDefinedInput(StandardSettings.HANDLE_ALL_PROMPTS)) {
runtimeContext.promptNow();
}
}
} catch (Throwable e) {
error(Messages.getInstance().getErrorString("Base.ERROR_0002_EXECUTION_FAILED"), e); //$NON-NLS-1$
}
return result;
}
public String getId() {
return id;
}
public String getActionTitle() {
return runtimeContext.getActionTitle();
}
protected IContentItem getOutputContentItem(final String mimeType) {
return runtimeContext.getOutputContentItem(mimeType);
}
protected IContentItem getOutputContentItem(final String outputName, final String mimeType) {
return runtimeContext.getOutputContentItem(outputName, mimeType);
}
protected void setOutputValue(final String outputName, final Object value) {
runtimeContext.setOutputValue(outputName, value);
}
protected OutputStream getDefaultOutputStream(final String mimeType) {
IContentItem contentItem = runtimeContext.getOutputContentItem(mimeType);
if (contentItem != null) {
try {
return contentItem.getOutputStream(getActionName());
} catch (Exception e) {
}
}
return null;
}
protected String applyInputsToFormat(final String format) {
return runtimeContext.applyInputsToFormat(format);
}
protected IActionParameter getOutputItem(final String outputName) {
return runtimeContext.getOutputParameter(outputName);
}
protected String getSolutionName() {
return runtimeContext.getSolutionName();
}
protected String getSolutionPath() {
return runtimeContext.getSolutionPath();
}
protected IActionParameter getInputParameter(final String parameterName) {
return runtimeContext.getInputParameter(parameterName);
}
protected String getContentUrl(final IContentItem contentItem) {
return runtimeContext.getContentUrl(contentItem);
}
protected boolean isPromptPending() {
return runtimeContext.isPromptPending();
}
protected void setFeedbackMimeType(final String mimeType) {
IContentItem feedbackContentItem = runtimeContext.getFeedbackContentItem();
feedbackContentItem.setMimeType(mimeType);
}
protected void setOutputMimeType(final String mimeType) {
IContentItem outputContentItem = runtimeContext.getOutputContentItem(mimeType);
outputContentItem.setMimeType(mimeType);
}
protected OutputStream getFeedbackOutputStream() {
IContentItem feedbackContentItem = runtimeContext.getFeedbackContentItem();
if (feedbackContentItem != null) {
try {
return feedbackContentItem.getOutputStream(getActionName());
} catch (Exception e) {
}
}
return null;
}
@SuppressWarnings("deprecation")
protected void createFeedbackParameter(final IActionParameter actionParam) {
runtimeContext.createFeedbackParameter(actionParam);
runtimeContext.promptNeeded();
}
protected void createFeedbackParameter(final ISelectionMapper selMap, final String fieldName,
final Object defaultValues) {
runtimeContext.createFeedbackParameter(selMap, fieldName, defaultValues);
runtimeContext.promptNeeded();
}
protected void createFeedbackParameter(final String fieldName, final String displayName, final String hint,
final String defaultValue, final boolean visible) {
runtimeContext.createFeedbackParameter(fieldName, displayName, hint, defaultValue, visible);
runtimeContext.promptNeeded();
}
public void createFeedbackParameter(final String fieldName, final String displayName, final String hint,
final Object defaultValues, final List values, final Map dispNames, final String displayStyle) {
runtimeContext
.createFeedbackParameter(fieldName, displayName, hint, defaultValues, values, dispNames, displayStyle);
runtimeContext.promptNeeded();
}
protected IPentahoStreamSource getDataSource(final String parameterName) {
return runtimeContext.getDataSource(parameterName);
}
protected IPentahoStreamSource getResourceDataSource(final IActionSequenceResource resource)
throws FileNotFoundException {
return runtimeContext.getResourceDataSource(resource);
}
public void setActionDefinition(final IActionDefinition actionDefinition) {
this.actionDefinition = actionDefinition;
}
public IActionDefinition getActionDefinition() {
return actionDefinition;
}
}