if ( PentahoSystem.debug ) {
debug( "GenericServlet contentGeneratorId=" + contentGeneratorId ); //$NON-NLS-1$
debug( "GenericServlet urlPath=" + urlPath ); //$NON-NLS-1$
}
IPentahoSession session = getPentahoSession( request );
IPluginManager pluginManager = PentahoSystem.get( IPluginManager.class, session );
if ( pluginManager == null ) {
OutputStream out = response.getOutputStream();
String message =
Messages.getInstance().getErrorString(
"GenericServlet.ERROR_0001_BAD_OBJECT", IPluginManager.class.getSimpleName() ); //$NON-NLS-1$
error( message );
out.write( message.getBytes() );
return;
}
// TODO make doing the HTTP headers configurable per content generator
SimpleParameterProvider headerParams = new SimpleParameterProvider();
Enumeration names = request.getHeaderNames();
while ( names.hasMoreElements() ) {
String name = (String) names.nextElement();
String value = request.getHeader( name );
headerParams.setParameter( name, value );
}
String pluginId = pluginManager.getServicePlugin( pathInfo );
if ( pluginId != null && pluginManager.isStaticResource( pathInfo ) ) {
boolean cacheOn = "true".equals( pluginManager
.getPluginSetting( pluginId, "settings/cache", "false" ) ); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
String maxAge = (String) pluginManager.getPluginSetting( pluginId, "settings/max-age", null ); //$NON-NLS-1$
allowBrowserCache( maxAge, pathParams );
String mimeType = MimeHelper.getMimeTypeFromFileName( pathInfo );
if ( mimeType != null ) {
response.setContentType( mimeType );
}
OutputStream out = response.getOutputStream();
// do we have this resource cached?
ByteArrayOutputStream byteStream = null;
if ( cacheOn ) {
byteStream = (ByteArrayOutputStream) cache.getFromRegionCache( CACHE_FILE, pathInfo );
}
if ( byteStream != null ) {
IOUtils.write( byteStream.toByteArray(), out );
return;
}
InputStream resourceStream = pluginManager.getStaticResource( pathInfo );
if ( resourceStream != null ) {
try {
byteStream = new ByteArrayOutputStream();
IOUtils.copy( resourceStream, byteStream );
// if cache is enabled, drop file in cache
if ( cacheOn ) {
cache.putInRegionCache( CACHE_FILE, pathInfo, byteStream );
}
// write it out
IOUtils.write( byteStream.toByteArray(), out );
return;
} finally {
IOUtils.closeQuietly( resourceStream );
}
}
logger.error( Messages.getInstance().getErrorString(
"GenericServlet.ERROR_0004_RESOURCE_NOT_FOUND", pluginId, pathInfo ) ); //$NON-NLS-1$
response.sendError( 404 );
return;
}
// content generators defined in plugin.xml are registered with 2 aliases, one is the id, the other is type
// so, we can still retrieve a content generator by id, even though this is not the correct way to find
// it. the correct way is to look up a content generator by pluginManager.getContentGenerator(type,
// perspectiveName)
IContentGenerator contentGenerator = (IContentGenerator) pluginManager.getBean( contentGeneratorId );
if ( contentGenerator == null ) {
OutputStream out = response.getOutputStream();
String message =
Messages.getInstance().getErrorString(
"GenericServlet.ERROR_0002_BAD_GENERATOR",
ESAPI.encoder().encodeForHTML( contentGeneratorId ) ); //$NON-NLS-1$
error( message );
out.write( message.getBytes() );
return;
}
// set the classloader of the current thread to the class loader of
// the plugin so that it can load its libraries
// Note: we cannot ask the contentGenerator class for it's classloader, since the cg may
// actually be a proxy object loaded by main the WebAppClassloader
Thread.currentThread().setContextClassLoader( pluginManager.getClassLoader( pluginId ) );
// String proxyClass = PentahoSystem.getSystemSetting( module+"/plugin.xml" ,
// "plugin/content-generators/"+contentGeneratorId,
// "content generator not found");
IParameterProvider requestParameters = new HttpRequestParameterProvider( request );