/*
* Carrot2 project.
*
* Copyright (C) 2002-2016, Dawid Weiss, Stanisław Osiński.
* All rights reserved.
*
* Refer to the full license file "carrot2.LICENSE"
* in the root folder of the repository checkout or at:
* http://www.carrot2.org/carrot2.LICENSE
*/
package org.carrot2.workbench.velocity;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import org.apache.commons.collections.ExtendedProperties;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.runtime.resource.Resource;
import org.apache.velocity.runtime.resource.loader.ResourceLoader;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.osgi.framework.Bundle;
/**
* A Velocity {@link ResourceLoader} that loads resources relative to a given bundle.
* A local cache is used to store resource URLs to increase performance.
*/
public final class BundleResourceLoader extends ResourceLoader
{
/**
* Set this Velocity property to the identifier of the bundle that should be used to
* load templates.
*/
public static final String BUNDLE_ID = "bundle.id";
/**
* Bundle relative to which resources are resolved.
*/
private Bundle bundle;
/**
* Prefix prepended to all resources.
*/
private String prefix;
/*
*
*/
public BundleResourceLoader(String pluginId, String prefix)
{
this.bundle = locateBundle(pluginId);
this.prefix = prefix;
}
/**
*
*/
@Override
public InputStream getResourceStream(String s) throws ResourceNotFoundException
{
final URL resource = FileLocator.find(bundle, new Path(prefix + s), null);
if (resource == null)
{
throw new ResourceNotFoundException("Not found: " + s);
}
try
{
return resource.openStream();
}
catch (IOException e)
{
throw new ResourceNotFoundException("Failed to open: " + s, e);
}
}
/**
*
*/
@Override
public void init(ExtendedProperties props)
{
if (bundle != null)
{
return;
}
final String bundleID = props.getString(BUNDLE_ID, null);
if (bundleID == null)
{
throw new RuntimeException("Initialize bundle key in Velocity properties: "
+ BUNDLE_ID);
}
this.bundle = locateBundle(bundleID);
}
/**
*
*/
@Override
public boolean isSourceModified(Resource resource)
{
return false;
}
/**
*
*/
@Override
public long getLastModified(Resource resource)
{
return 0L;
}
/*
*
*/
private Bundle locateBundle(String bundleID)
{
final Bundle bundle = Platform.getBundle(bundleID);
if (bundle == null)
{
throw new RuntimeException("Bundle not found: " + bundleID);
}
return bundle;
}
}