
net.darkmist.alib.res.PkgRes Maven / Gradle / Ivy
The newest version!
/*
* Copyright (C) 2012 Ed Schaller
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package net.darkmist.alib.res;
import java.io.InputStream;
import java.io.IOException;
import org.apache.commons.io.IOUtils;
import net.darkmist.alib.io.Closer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Resource acquisition using paths based on package names.
*/
public class PkgRes
{
private static final Class CLASS = PkgRes.class;
private static final Logger logger = LoggerFactory.getLogger(CLASS);
private ClassLoader loader;
private String prefix;
public PkgRes(Class> cls)
{
if(cls == null)
throw new NullPointerException("cls is null");
this.loader = cls.getClassLoader();
prefix = appendResourcePathPrefixFor(null,cls).toString();
}
public PkgRes(Object obj)
{
Class> cls;
if(obj == null)
throw new NullPointerException("obj is null");
cls = obj.getClass();
loader = cls.getClassLoader();
prefix = appendResourcePathPrefixFor(null,cls).toString();
}
public PkgRes(String pkg, ClassLoader loader)
{
if(pkg == null)
throw new NullPointerException("pkg is null");
if(loader == null)
throw new NullPointerException("loader is null");
prefix = appendResourcePathPrefixFor(null,pkg).toString();
this.loader = loader;
}
/**
* Retrieve the prefix used for resource paths.
* @return the resource path prefix used.
*/
public String getResourcePathPrefix()
{
return prefix;
}
/**
* Retrieve the ClassLoader used to locate resources.
*/
public ClassLoader getClassLoader()
{
return loader;
}
/**
* Get the package name for a class.
* @param cls The class to get the package name for.
* @return the class's pacakge name.
* @throws NullPointerException if cls is null.
*/
public static String getPackageName(Class> cls)
{
Package pkg;
String str;
int pos;
if(cls == null)
throw new NullPointerException("cls is null");
if((pkg = cls.getPackage())!=null)
return pkg.getName();
str = cls.getName();
if((pos = str.lastIndexOf('.'))>=0)
return str.substring(0,pos);
return ""; // default package
}
/**
* Get the package name for a object.
* @param obj The object to get the package name for.
* @return the object's class's pacakge name.
* @throws NullPointerException if obj is null.
*/
public static String getPackageName(Object obj)
{
if(obj == null)
throw new NullPointerException("obj is null");
return getPackageName(obj.getClass());
}
/**
* Apend a package name converted to a resource path prefix.
* @param sb what to append to. If this is null, a new
* StringBuilder is created.
* @param pkgName The name of the package.
* @return Path, starting and ending with a slash, for resources
* prefixed by pkgName.
* @throws NullPointerException if pkgName is null.
*/
protected static StringBuilder appendResourcePathPrefixFor(StringBuilder sb, String pkgName)
{
if(pkgName == null)
throw new NullPointerException("pkgName is null");
if(sb == null)
sb = new StringBuilder(pkgName.length() + 2);
sb.append('/');
if(pkgName.length() == 0)
return sb;
sb.append(pkgName.replace('.','/'));
pkgName = null;
sb.append('/');
return sb;
}
/**
* Apend a package name converted to a resource path prefix.
* @param sb what to append to. If this is null, a new
* StringBuilder is created.
* @param cls The class to get the package name from.
* @return Path, starting and ending with a slash, for resources
* prefixed by the package name.
* @throws NullPointerException if cls is null.
*/
protected static StringBuilder appendResourcePathPrefixFor(StringBuilder sb, Class> cls)
{
if(cls == null)
throw new NullPointerException("cls is null");
return appendResourcePathPrefixFor(sb, getPackageName(cls));
}
/**
* Apend a package name converted to a resource path prefix.
* @param sb what to append to. If this is null, a new
* StringBuilder is created.
* @param obj The object to get the package name from.
* @return Path, starting and ending with a slash, for resources
* prefixed by the package name.
* @throws NullPointerException if obj is null.
*/
protected static StringBuilder appendResourcePathPrefixFor(StringBuilder sb, Object obj)
{
if(obj == null)
throw new NullPointerException("obj is null");
return appendResourcePathPrefixFor(sb, getPackageName(obj));
}
/**
* Gets a resource path using cls's package name as the prefix.
* @param name The name of the resource.
* @param cls The class to get the package prefix from.
* @return Path of a resource prefixed by the class package name.
* @throws NullPointerException if name or cls are null.
*/
public static String getResourcePathFor(CharSequence name, Class> cls)
{
int nameLen;
StringBuilder sb;
if(name==null)
throw new NullPointerException("name is null");
if(cls==null)
throw new NullPointerException("cls is null");
nameLen = name.length();
sb = new StringBuilder(cls.getName().length() + nameLen + 2);
appendResourcePathPrefixFor(sb,cls);
cls = null;
if(name.charAt(0)!='/')
sb.append(name, 1, nameLen);
else
sb.append(name);
name = null;
return sb.toString();
}
/**
* Gets a resource path using obj's class's package name as
* the prefix.
* @param name The name of the resource.
* @param obj The object to use for the package name
* @return Path of a resource prefixed by obj's class package
* name.
* @throws NullPointerException if name or obj are null.
*/
public static String getResourcePathFor(CharSequence name, Object obj)
{
if(obj == null)
throw new NullPointerException("obj is null");
return getResourcePathFor(name,obj.getClass());
}
/**
* Gets a InputStream for a class's package.
* @param name The name of the resource.
* @param cls The class to use for the package name
* @return InputStream for the resource.
* @throws NullPointerException if name or cls are null.
* ResourceException if the resource cannot be found.
*/
public static InputStream getFor(String name, Class> cls)
{
InputStream ret;
if(cls == null)
throw new NullPointerException("cls is null");
if((ret = cls.getResourceAsStream(getResourcePathFor(name,cls)))==null)
throw new ResourceException("Unable to find resource for " + name + " and " + cls);
return ret;
}
/**
* Gets a InputStream for a objects's package.
* @param name The name of the resource.
* @param obj The obj to use for the package name
* @return InputStream for the resource.
* @throws NullPointerException if name or obj are null.
* ResourceException if the resource cannot be found.
*/
public static InputStream getFor(String name, Object obj)
{
if(obj == null)
throw new NullPointerException("obj is null");
return getFor(name,obj.getClass());
}
/**
* Gets a InputStream for a named resource
* @param name The name of the resource.
* @return InputStream for the resource.
* @throws NullPointerException if name is null.
* ResourceException if the resource cannot be found.
*/
public InputStream get(String name)
{
InputStream ret;
if(name == null)
throw new NullPointerException("name is null");
if((ret = loader.getResourceAsStream(prefix + name))==null)
throw new ResourceException("Unable to find resource for " + name);
return ret;
}
/**
* Get a resource as a String.
* @param name The name of the resource
* @param cls the class to use for the package name
* @return The contents of the resource converted to a string
* with the default encoding.
* @throws NullPointerException if name or cls are null.
* ResourceException if the resource cannot be found.
*/
public static String getStringFor(String name, Class> cls)
{
InputStream in = null;
try
{
if((in = getFor(name, cls))==null)
throw new ResourceException("Unablet to find package resource for " + name + " and " + cls);
return IOUtils.toString(in);
}
catch(IOException e)
{
throw new ResourceException("IOException reading resource " + name, e);
}
finally
{
Closer.close(in,logger,"resource InputStream for resource " + name);
}
}
/**
* Get a resource as a String.
* @param name The name of the resource
* @return The contents of the resource converted to a string
* with the default encoding.
* @throws NullPointerException if name or obj are null.
* ResourceException if the resource cannot be found.
*/
public static String getStringFor(String name, Object obj)
{
if(obj == null)
throw new NullPointerException("obj is null");
return getStringFor(name,obj.getClass());
}
/**
* Gets a resource as a String
* @param name The name of the resource.
* @return The contents of the resource converted to a string
* with the default encoding.
* @throws NullPointerException if name is null.
* ResourceException if the resource cannot be found or
* there is a error reading it.
*/
public String getString(String name)
{
InputStream in = null;
if(name == null)
throw new NullPointerException("name is null");
try
{
if((in = loader.getResourceAsStream(prefix + name))==null)
throw new ResourceException("Unable to find resource for " + name);
return IOUtils.toString(in);
}
catch(IOException e)
{
throw new ResourceException("IOException reading resource " + name, e);
}
finally
{
Closer.close(in,logger,"resource InputStream for " + name);
}
}
/**
* Get a resource as a byte array.
* @param name The name of the resource
* @param cls the class to use for the package name
* @return The contents of the resource as a byte array.
* @throws NullPointerException if name or cls are null.
* ResourceException if the resource cannot be found.
*/
public static byte[] getBytesFor(String name, Class> cls)
{
InputStream in = null;
try
{
if((in = getFor(name, cls))==null)
throw new ResourceException("Unablet to find package resource for " + name + " and " + cls);
return IOUtils.toByteArray(in);
}
catch(IOException e)
{
throw new ResourceException("IOException reading resource");
}
finally
{
Closer.close(in,logger,"resource InputStream");
}
}
/**
* Get a resource as a byte array.
* @param name The name of the resource
* @return The contents of the resource as a byte array.
* @throws NullPointerException if name or obj are null.
* ResourceException if the resource cannot be found.
*/
public static byte[] getBytesFor(String name, Object obj)
{
if(obj == null)
throw new NullPointerException("obj is null");
return getBytesFor(name,obj.getClass());
}
/**
* Gets a resource as a byte array.
* @param name The name of the resource.
* @return The contents of the resource as a byte array.
* @throws NullPointerException if name is null.
* ResourceException if the resource cannot be found or
* there is a error reading it.
*/
public byte[] getBytes(String name)
{
InputStream in = null;
if(name == null)
throw new NullPointerException("name is null");
try
{
if((in = loader.getResourceAsStream(prefix + name))==null)
throw new ResourceException("Unable to find resource for " + name);
return IOUtils.toByteArray(in);
}
catch(IOException e)
{
throw new ResourceException("IOException reading resource " + name, e);
}
finally
{
Closer.close(in,logger,"resource InputStream for " + name);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy