/*
* Copyright (c) 2005, Rob Gordon.
*/
package org.oddjob.io;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import org.oddjob.arooa.ArooaSession;
import org.oddjob.arooa.ArooaValue;
import org.oddjob.arooa.ClassResolver;
import org.oddjob.arooa.convert.ConversionProvider;
import org.oddjob.arooa.convert.ConversionRegistry;
import org.oddjob.arooa.convert.Convertlet;
import org.oddjob.arooa.convert.ConvertletException;
import org.oddjob.arooa.deploy.annotations.ArooaHidden;
import org.oddjob.arooa.life.ArooaSessionAware;
/**
* @oddjob.description Specify a resource on the class path.
* <p>
* This uses
* Oddjob's internal class path to find the resource which includes all
* Oddballs. Oddballs will be searched in the order they were loaded.
*
* @oddjob.example
*
* Specifiy properties as a resource on the class path.
*
* <pre>
* <variables id='props'>
* <properties>
* <resource resource="org/oddjob/AResource.props"/>
* </properties>
* </variables>
* </pre>
*
* @author Rob Gordon.
*/
public class ResourceType implements ArooaValue, ArooaSessionAware {
public static class Conversions implements ConversionProvider {
public void registerWith(ConversionRegistry registry) {
registry.register(ResourceType.class, InputStream.class,
new Convertlet<ResourceType, InputStream>() {
public InputStream convert(ResourceType from) throws ConvertletException {
try {
return from.toInputStream();
}
catch (IOException e) {
throw new ConvertletException(e);
}
}
});
registry.register(ResourceType.class, URL.class,
new Convertlet<ResourceType, URL>() {
public URL convert(ResourceType from) throws ConvertletException {
return from.toURL();
}
});
registry.register(ResourceType.class, String.class,
new Convertlet<ResourceType, String>() {
public String convert(ResourceType from) throws ConvertletException {
return from.resource;
}
});
}
}
/**
* @oddjob.property
* @oddjob.description The resource
* @oddjob.required Yes.
*/
private String resource;
private ArooaSession session;
public ResourceType() {
}
public ResourceType(String resource) {
this.resource = resource;
}
@Override
@ArooaHidden
public void setArooaSession(ArooaSession session) {
this.session = session;
}
public URL toURL() {
URL url = null;
if (session == null) {
url = getClass().getClassLoader().getResource(
resource);
}
else {
ClassResolver resolver =
session.getArooaDescriptor(
).getClassResolver();
url = resolver.getResource(resource);
}
return url;
}
public InputStream toInputStream() throws IOException {
URL url = toURL();
if (url == null) {
throw new IOException("No Resource found: " + resource);
}
return url.openStream();
}
/**
* Set the resource.
*
* @param resource The resource.
*/
public void setResource(String resource) {
this.resource = resource;
}
public String toString() {
return resource;
}
}