/** * Copyright (C) 2009 Orbeon, Inc. * * This program 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 program 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. * * The full text of the license is available at http://www.gnu.org/copyleft/lesser.html */ package org.orbeon.oxf.resources; import org.apache.log4j.Logger; import org.orbeon.oxf.common.OXFException; import org.orbeon.oxf.util.LoggerFactory; import org.orbeon.oxf.util.NetUtils; import org.orbeon.oxf.util.StringUtils; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.Writer; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.util.Map; /** * The URL resource manager is able to load ressources from any * URL supported by the JVM. */ public class URLResourceManagerImpl extends ResourceManagerBase { private static Logger logger = LoggerFactory.createLogger(URLResourceManagerImpl.class); protected URL baseURL; // protected Map urlCache = Collections.synchronizedMap(new HashMap()); public URLResourceManagerImpl(Map props) throws OXFException { super(props); String root = (String) props.get(URLResourceManagerFactory.BASE_URL); if (root == null) throw new OXFException("Property " + URLResourceManagerFactory.BASE_URL + " must be set."); // Clean-up URL root = StringUtils.trimAllToEmpty(root); if (!root.endsWith("/")) root = root + "/"; try { baseURL = new URL(root); } catch (MalformedURLException e) { throw new OXFException(e); } } /** * Returns a binary input stream for the specified key. The key could point * to any document type (text or binary). * @param key A Resource Manager key * @return a input stream */ public InputStream getContentAsStream(String key) { if (logger.isDebugEnabled()) logger.debug("getContentAsStream(" + key + ")"); URL url = getURL(key); try { return url.openStream(); } catch (IOException ioe) { throw new ResourceNotFoundException(key);// NOTE: could also pass resolved URL in addition } } /** * Gets the last modified timestamp for the specified resource * @param key A Resource Manager key * @param doNotThrowResourceNotFound * @return a timestamp */ public long lastModifiedImpl(String key, boolean doNotThrowResourceNotFound) { URL url = getURL(key); try { return NetUtils.getLastModified(url); } catch (IOException e) { if (doNotThrowResourceNotFound) return -1; else throw new ResourceNotFoundException(key);// NOTE: could also pass resolved URL in addition } } /** * Returns the length of the file denoted by this abstract pathname. * @return The length, in bytes, of the file denoted by this abstract pathname, or 0L if the file does not exist */ public int length(String key) { if (logger.isDebugEnabled()) logger.debug("length(" + key + ")"); final URL url = getURL(key); try { final URLConnection conn = url.openConnection(); if (conn instanceof HttpURLConnection) ((HttpURLConnection) conn).setRequestMethod("HEAD"); try { return conn.getContentLength(); } finally { conn.getInputStream().close(); } } catch (IOException e) { throw new ResourceNotFoundException(key);// NOTE: could also pass resolved URL in addition } } /** * Indicates if the resource manager implementation supports write operations * @return true if write operations are allowed */ public boolean canWrite(String key) { return false; } /** * Allows writing to the resource * @param key A Resource Manager key * @return an output stream */ public OutputStream getOutputStream(String key) { throw new OXFException("Write Operation not supported"); } /** * Allow writing to the resource * @param key A Resource Manager key * @return a writer */ public Writer getWriter(String key) { throw new OXFException("Write Operation not supported"); } public String getRealPath(String key) { return null; } private URL getURL(String key) { try { if (key.startsWith("/")) return new URL(baseURL, key.substring(1)); else return new URL(baseURL, key); } catch (MalformedURLException e) { throw new ResourceNotFoundException(key); } } }