/*
* 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 2008 Pentaho Corporation. All rights reserved.
*
*/
package org.pentaho.platform.engine.services.solution;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.InvalidParameterException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.pentaho.platform.api.engine.IContentGenerator;
import org.pentaho.platform.api.engine.IParameterProvider;
import org.pentaho.platform.api.engine.IPluginManager;
import org.pentaho.platform.api.repository.IContentItem;
import org.pentaho.platform.api.repository.ISolutionRepository;
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.services.messages.Messages;
import org.pentaho.platform.util.web.MimeHelper;
public class SolutionUrlContentGenerator extends BaseContentGenerator {
private static final long serialVersionUID = 8445693289282403228L;
public static final int TYPE_UNKNOWN = 0;
public static final int TYPE_STATIC = 1;
public static final int TYPE_PLUGIN = 2;
@Override
public void createContent() throws Exception {
OutputStream out = null;
if( outputHandler == null ) {
error( Messages.getInstance().getErrorString("SimpleContentGenerator.ERROR_0001_NO_OUTPUT_HANDLER") ); //$NON-NLS-1$
throw new InvalidParameterException( Messages.getInstance().getString("SimpleContentGenerator.ERROR_0001_NO_OUTPUT_HANDLER") ); //$NON-NLS-1$
}
IParameterProvider params = parameterProviders.get( "path" ); //$NON-NLS-1$
String urlPath = params.getStringParameter("path", null); //$NON-NLS-1$
ActionInfo pathInfo = ActionInfo.parseActionString(urlPath);
if( pathInfo == null ) {
// there is no path so we don't know what to return
error( Messages.getInstance().getErrorString("SolutionURLContentGenerator.ERROR_0001_NO_FILEPATH") ); //$NON-NLS-1$
return;
}
if( PentahoSystem.debug ) debug( "SolutionResourceContentGenerator urlPath="+urlPath); //$NON-NLS-1$
int type = TYPE_UNKNOWN;
// work out what this thing is
String filename = pathInfo.getActionName();
String extension = ""; //$NON-NLS-1$
int index = filename.lastIndexOf('.');
if (index != -1) {
extension = filename.substring(index+1);
}
// is this a plugin file type?
if( type == TYPE_UNKNOWN ) {
IPluginManager pluginManager = PentahoSystem.get( IPluginManager.class, userSession );
if( pluginManager != null ) {
IContentGenerator contentGenerator = pluginManager.getContentGeneratorForType(extension, userSession);
if( contentGenerator != null ) {
// set up the path parameters
IParameterProvider requestParams = parameterProviders.get( IParameterProvider.SCOPE_REQUEST );
if( requestParams instanceof SimpleParameterProvider ) {
((SimpleParameterProvider) requestParams).setParameter("solution", pathInfo.getSolutionName()); //$NON-NLS-1$
((SimpleParameterProvider) requestParams).setParameter("path", pathInfo.getPath()); //$NON-NLS-1$
((SimpleParameterProvider) requestParams).setParameter("name", pathInfo.getActionName()); //$NON-NLS-1$
((SimpleParameterProvider) requestParams).setParameter("action", pathInfo.getActionName()); //$NON-NLS-1$
}
// delegate over to the content generator for this file type
contentGenerator.setCallbacks( callbacks );
contentGenerator.setInstanceId( instanceId );
contentGenerator.setItemName( itemName );
contentGenerator.setLoggingLevel( loggingLevel );
contentGenerator.setMessagesList( messages );
contentGenerator.setOutputHandler( outputHandler );
contentGenerator.setParameterProviders( parameterProviders );
contentGenerator.setSession( userSession );
contentGenerator.setUrlFactory( urlFactory );
contentGenerator.createContent();
return;
}
}
}
// get the mime-type
String mimeType = MimeHelper.getMimeTypeFromFileName(filename);
if( mimeType != null && mimeType.equals( MimeHelper.MIMETYPE_XACTION ) ) {
mimeType = null;
}
// is this a static file type?
if( urlPath.contains( "/web/" ) && mimeType != null ) { //$NON-NLS-1$
// this is a static file type
type = TYPE_STATIC;
}
if( type == TYPE_UNKNOWN ) {
// should not handle this file type
warn( Messages.getInstance().getErrorString("SolutionURLContentGenerator.ERROR_0002_CANNOT_HANDLE_TYPE", urlPath ) ); //$NON-NLS-1$
return;
}
IContentItem contentItem = outputHandler.getOutputContentItem( "response", "content", "", instanceId, mimeType ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
if( contentItem == null ) {
error( Messages.getInstance().getErrorString("SimpleContentGenerator.ERROR_0002_NO_CONTENT_ITEM") ); //$NON-NLS-1$
throw new InvalidParameterException( Messages.getInstance().getString("SimpleContentGenerator.ERROR_0002_NO_CONTENT_ITEM") ); //$NON-NLS-1$
}
contentItem.setMimeType( mimeType );
out = contentItem.getOutputStream( itemName );
if( out == null ) {
error( Messages.getInstance().getErrorString("SimpleContentGenerator.ERROR_0003_NO_OUTPUT_STREAM") ); //$NON-NLS-1$
throw new InvalidParameterException( Messages.getInstance().getString("SimpleContentGenerator.ERROR_0003_NO_OUTPUT_STREAM") ); //$NON-NLS-1$
}
// TODO support cache control settings
ISolutionRepository repo = PentahoSystem.get(ISolutionRepository.class, userSession);
InputStream in = repo.getResourceInputStream(urlPath, false, ISolutionRepository.ACTION_EXECUTE);
if( in == null ) {
error( Messages.getInstance().getErrorString("SolutionURLContentGenerator.ERROR_0003_RESOURCE_NOT_FOUND", urlPath ) ); //$NON-NLS-1$
return;
}
try {
byte buffer[] = new byte[4096];
int n = in.read(buffer);
while( n != -1 ) {
out.write(buffer, 0, n);
n = in.read(buffer);
}
} finally {
out.close();
}
}
@Override
public Log getLogger() {
return LogFactory.getLog(SolutionUrlContentGenerator.class);
}
}