/*
* 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 2006 - 2008 Pentaho Corporation. All rights reserved.
*
* @created Jan 13, 2006
* @author James Dixon
*/
package org.pentaho.platform.engine.services.solution;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.pentaho.platform.api.engine.IExecutionListener;
import org.pentaho.platform.api.engine.ILogger;
import org.pentaho.platform.api.engine.IOutputHandler;
import org.pentaho.platform.api.engine.IParameterProvider;
import org.pentaho.platform.api.engine.IPentahoSession;
import org.pentaho.platform.api.engine.IPentahoUrlFactory;
import org.pentaho.platform.api.engine.IRuntimeContext;
import org.pentaho.platform.api.engine.ISolutionEngine;
import org.pentaho.platform.engine.core.output.SimpleOutputHandler;
import org.pentaho.platform.engine.core.solution.ActionInfo;
import org.pentaho.platform.engine.core.solution.SimpleParameterProvider;
import org.pentaho.platform.engine.core.system.PentahoSystem;
import org.pentaho.platform.engine.core.system.StandaloneSession;
import org.pentaho.platform.engine.services.BaseRequestHandler;
import org.pentaho.platform.util.web.SimpleUrlFactory;
// TODO sbarkdull, ton's of opportunity here for some refactoring to get rid of european reuse
public class SolutionHelper {
/**
*
*
* Runs an action sequence. This method uses the base URL set by the
* Application Context
*
* @param description
* An identifier for this process. This is used for auditing and
* logging purposes only.
* @param userId
* The user (or user agent) that is requesting this execution.
* This is used for auditing and logging and also can be used in
* action sequences (for example to filter data)
* @param actionSequence
* Path to the action sequence file
* @param parameters
* Parameters to be passed to the action sequence
* @param outputStream
* The output stream for content generated by the action
* sequence. Can be null.
* @return
*/
public static ISolutionEngine execute(final String description, final String userId, final String actionSequence,
final Map parameters, final OutputStream outputStream) {
StandaloneSession session = new StandaloneSession(userId);
return SolutionHelper.execute(description, session, actionSequence, parameters, outputStream, null, true);
}
/**
*
*
* Runs an action sequence. This method uses the base URL set by the
* Application Context
*
* @param description
* An identifier for this process. This is used for auditing and
* logging purposes only.
* @param session
* The user session that is requesting this execution.
* This is used for auditing and logging and also can be used in
* action sequences (for example to filter data)
* @param actionSequence
* Path to the action sequence file
* @param parameters
* Parameters to be passed to the action sequence
* @param outputStream
* The output stream for content generated by the action
* sequence. Can be null.
* @return
*/
public static ISolutionEngine execute(final String description, final IPentahoSession session,
final String actionSequence, final Map parameters, final OutputStream outputStream) {
return SolutionHelper.execute(description, session, actionSequence, parameters, outputStream, null, true);
}
/**
*
*
* Runs an action sequence. This method uses the base URL set by the
* Application Context
*
* @param description
* An identifier for this process. This is used for auditing and
* logging purposes only.
* @param session
* The user session that is requesting this execution.
* This is used for auditing and logging and also can be used in
* action sequences (for example to filter data)
* @param actionSequence
* Path to the action sequence file
* @param parameters
* Parameters to be passed to the action sequence
* @param outputStream
* The output stream for content generated by the action
* sequence. Can be null.
* @param collateMessages
* Collate a messages list or not. Chose false for very large processes
* @return
*/
public static ISolutionEngine execute(final String description, final IPentahoSession session,
final String actionSequence, final Map parameters, final OutputStream outputStream, final boolean collateMessages) {
return SolutionHelper
.execute(description, session, actionSequence, parameters, outputStream, null, collateMessages);
}
private static ISolutionEngine execute(final String description, final IPentahoSession session,
final String actionSequence, final Map parameters, final OutputStream outputStream,
final IExecutionListener execListener, final boolean collateMessages) {
return SolutionHelper.execute(description, session, actionSequence, parameters, outputStream, execListener,
collateMessages, true);
}
/**
*
*
* Runs an action sequence. This method uses the base URL set by the
* Application Context
*
* @param description
* An identifier for this process. This is used for auditing and
* logging purposes only.
* @param session
* The user session that is requesting this execution.
* This is used for auditing and logging and also can be used in
* action sequences (for example to filter data)
* @param actionSequence
* Path to the action sequence file
* @param parameters
* Parameters to be passed to the action sequence
* @param outputStream
* The output stream for content generated by the action
* sequence. Can be null.
* @param execListener
* An execution listener for feedback during execution. Can be null.
* @return
*/
public static ISolutionEngine execute(final String description, final IPentahoSession session,
final String actionSequence, final Map parameters, OutputStream outputStream,
final IExecutionListener execListener, final boolean collateMessages, final boolean manageHibernate) {
if (manageHibernate) {
PentahoSystem.systemEntryPoint();
}
ISolutionEngine solutionEngine = null;
try {
solutionEngine = PentahoSystem.get(ISolutionEngine.class, session);
solutionEngine.init(session);
solutionEngine.setlistener(execListener);
SimpleParameterProvider parameterProvider = new SimpleParameterProvider(parameters);
//Modifications by Ezequiel Cuellar
//Old code.
//String baseUrl = PentahoSystem.getApplicationContext().getBaseUrl();
//New code. Since the SubActionComponent is being instantiated below to return feedback
//it is necesary to configure the baseUrl to include the ViewAction.
String baseUrl = PentahoSystem.getApplicationContext().getBaseUrl();
if( baseUrl == null ) {
baseUrl = "void"; //$NON-NLS-1$
}
Object actionUrlComponent = parameters.get(StandardSettings.ACTION_URL_COMPONENT);
if ((actionUrlComponent != null) && (actionUrlComponent.toString().length() > 0)) {
baseUrl += actionUrlComponent.toString();
} else {
baseUrl += "ViewAction?";//$NON-NLS-1$
}
HashMap<String,IParameterProvider> parameterProviderMap = new HashMap<String,IParameterProvider>();
parameterProviderMap.put(IParameterProvider.SCOPE_REQUEST, parameterProvider);
IPentahoUrlFactory urlFactory = new SimpleUrlFactory(baseUrl);
ActionInfo solutionRef = ActionInfo.parseActionString(actionSequence);
String processName = description;
boolean persisted = false;
//for now, the messages list needs to be untyped since we may put exceptions as well as strings in it
List<?> messages = null;
if (collateMessages) {
messages = new ArrayList();
}
if (outputStream == null) {
outputStream = new ByteArrayOutputStream(0);
}
SimpleOutputHandler outputHandler = null;
if (outputStream != null) {
//Modifications by Ezequiel Cuellar
//Old code.
//outputHandler = new SimpleOutputHandler(outputStream, false);
//New code. Without setting the allowFeedback parameter to true it is assumed that SubActionComponent instances
//are never capable of returning feedback which may not always be the case.
outputHandler = new SimpleOutputHandler(outputStream, true);
outputHandler.setOutputPreference(IOutputHandler.OUTPUT_TYPE_DEFAULT);
}
solutionEngine.execute(solutionRef.getSolutionName(), solutionRef.getPath(), solutionRef.getActionName(),
processName, false, true, null, persisted, parameterProviderMap, outputHandler, null, urlFactory, messages);
} finally {
if (manageHibernate) {
PentahoSystem.systemExitPoint();
}
}
return solutionEngine;
}
/**
* doAction executes an action within the bi platform and returns true if successful.
*
* Snagged from ChartHelper
*
* @param solutionName the solution name
* @param actionPath the action path
* @param actionName the action name
* @param processId the process id
* @param parameterProvider the collection of parameters to customize the chart
* @param outputStream the output object
* @param userSession the user session object
* @param messages a collection to store error and logging messages
* @param logger logging object
*
* @return the runtime context
*/
public static boolean doAction(final String solutionName, final String actionPath, final String actionName,
final String processId, final IParameterProvider parameterProvider, final OutputStream outputStream,
final IPentahoSession userSession, final ArrayList messages, final ILogger logger) {
int status = IRuntimeContext.RUNTIME_STATUS_FAILURE;
IRuntimeContext runtime = null;
try {
runtime = SolutionHelper.doActionInternal(solutionName, actionPath, actionName, processId, parameterProvider,
outputStream, userSession, messages, logger);
if (runtime != null) {
status = runtime.getStatus();
}
} finally {
if (runtime != null) {
runtime.dispose();
}
}
return status == IRuntimeContext.RUNTIME_STATUS_SUCCESS;
}
/**
* doAction executes an action within the bi platform and returns the runtime context.
*
* Snagged from ChartHelper
*
* @param solutionName the solution name
* @param actionPath the action path
* @param actionName the action name
* @param processId the process id
* @param parameterProvider the collection of parameters to customize the chart
* @param userSession the user session object
* @param messages a collection to store error and logging messages
* @param logger logging object
*
* @return the runtime context
*/
public static IRuntimeContext doAction(final String solutionName, final String actionPath, final String actionName,
final String processId, final IParameterProvider parameterProvider, final IPentahoSession userSession,
final ArrayList messages, final ILogger logger) {
return doActionInternal(solutionName, actionPath, actionName, processId, parameterProvider, null, userSession,
messages, logger);
}
private static IRuntimeContext doActionInternal(final String solutionName, final String actionPath,
final String actionName, final String processId, final IParameterProvider parameterProvider,
final OutputStream outputStream, final IPentahoSession userSession, final ArrayList messages, final ILogger logger) {
SimpleOutputHandler outputHandler = new SimpleOutputHandler(outputStream, false);
BaseRequestHandler requestHandler = new BaseRequestHandler(userSession, null, outputHandler, parameterProvider,
null);
requestHandler.setProcessId(processId);
requestHandler.setAction(actionPath, actionName);
requestHandler.setSolutionName(solutionName);
return requestHandler.handleActionRequest(0, 0);
}
}