org.pentaho.platform.plugin.action.examples.ComponentImplementationExample.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.platform.plugin.action.examples.ComponentImplementationExample.java

Source

/*!
 * 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 (c) 2002-2013 Pentaho Corporation..  All rights reserved.
 */

package org.pentaho.platform.plugin.action.examples;

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;

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;

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(), //$NON-NLS-1$
                actionName);
        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", //$NON-NLS-1$
                paramName));
    }

    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) {
                //ignore
            }
        }
        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 "";
    }

    protected String getSolutionPath() {
        return runtimeContext.getSolutionPath();
    }

    protected IActionParameter getInputParameter(final String parameterName) {
        return runtimeContext.getInputParameter(parameterName);
    }

    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) {
                //ignore
            }
        }
        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 getResourceDataSource(final IActionSequenceResource resource)
            throws FileNotFoundException {
        return runtimeContext.getResourceDataSource(resource);
    }

    public void setActionDefinition(final IActionDefinition actionDefinition) {
        this.actionDefinition = actionDefinition;
    }

    public IActionDefinition getActionDefinition() {
        return actionDefinition;
    }
}