/* * Copyright 2001-2013 Geert Bevin (gbevin[remove] at uwyn dot com) * Licensed under the Apache License, Version 2.0 (the "License") */ package com.uwyn.rife.resources; import com.uwyn.rife.resources.exceptions.CantOpenResourceStreamException; import com.uwyn.rife.resources.exceptions.CantRetrieveResourceContentException; import com.uwyn.rife.resources.exceptions.ResourceFinderErrorException; import com.uwyn.rife.tools.FileUtils; import com.uwyn.rife.tools.InputStreamUser; import com.uwyn.rife.tools.exceptions.FileUtilsErrorException; import com.uwyn.rife.tools.exceptions.InnerClassException; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; /** * This class offers <code>ResourceFinder</code> capabilities for resources that * are available through the classloader. This is done for directories as well * as for jar files. Basically, this corresponds to the resources that are * available through the classpath. * <p/> * Since the application's classloader isn't supposed to change in a global way, * the <code>ResourceFinderClasspath</code> class can only be instantiated * through the static <code>getInstance()</code> method that always returns * the same instance as a singleton. * * @author Geert Bevin (gbevin[remove] at uwyn dot com) * @see com.uwyn.rife.resources.ResourceFinder * @since 1.0 */ public class ResourceFinderClasspath extends AbstractResourceFinder { protected ResourceFinderClasspath() { } /** * Returns the shared singleton instance of the * <code>ResourceFinderClasspath</code> class. * * @return the singleton <code>ResourceFinderClasspath</code> instance * @since 1.0 */ public static ResourceFinderClasspath getInstance() { return ResourceFinderClasspathSingleton.INSTANCE; } public URL getResource(String name) { URL resource; if (this.getClass().getClassLoader() != null) { // Try the class loader that loaded this class. resource = this.getClass().getClassLoader().getResource(name); } else { // Try the system class loader. resource = ClassLoader.getSystemClassLoader().getResource(name); } if (null == resource) { // if not found in classpath fall back to default resource = this.getClass().getResource(name); } return resource; } public <ResultType> ResultType useStream(URL resource, InputStreamUser user) throws ResourceFinderErrorException, InnerClassException { if (null == resource || null == user) { return null; } try { URLConnection connection = resource.openConnection(); connection.setUseCaches(false); try (InputStream stream = connection.getInputStream()) { return (ResultType)user.useInputStream(stream); } } catch (IOException e) { throw new CantOpenResourceStreamException(resource, e); } } public String getContent(URL resource, String encoding) throws ResourceFinderErrorException { if (null == resource) { return null; } try { return FileUtils.readString(resource, encoding); } catch (FileUtilsErrorException e) { throw new CantRetrieveResourceContentException(resource, encoding, e); } } public long getModificationTime(URL resource) throws ResourceFinderErrorException { return ModificationTimeClasspath.getModificationTime(resource); } }