/* * 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; } }