[Arakhnę-Dev] [170] * Refactoring of URL handlers. |
[ Thread Index |
Date Index
| More arakhne.org/dev Archives
]
Revision: 170
Author: galland
Date: 2010-09-06 22:18:50 +0200 (Mon, 06 Sep 2010)
Log Message:
-----------
* Refactoring of URL handlers.
Modified Paths:
--------------
trunk/arakhneVmutils/java/pom.xml
trunk/arakhneVmutils/java/src/test/java/org/arakhne/vmutil/FileSystemTest.java
Added Paths:
-----------
trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/URLHandlerUtil.java
trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/file/
trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/file/Handler.java
trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/file/HandlerFactory.java
trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/file/URLConnection.java
trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/resource/
trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/resource/Handler.java
trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/resource/HandlerFactory.java
trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/resource/URLConnection.java
trunk/arakhneVmutils/java/src/test/java/org/arakhne/vmutil/file/
trunk/arakhneVmutils/java/src/test/java/org/arakhne/vmutil/file/URLConnectionTest.java
trunk/arakhneVmutils/java/src/test/java/org/arakhne/vmutil/resource/
trunk/arakhneVmutils/java/src/test/java/org/arakhne/vmutil/resource/URLConnectionTest.java
Removed Paths:
-------------
trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/DynamicURLClassLoader.java
trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/DynamicURLStreamHandlerFactory.java
trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/FileResourceURLStreamHandlerFactory.java
trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/FileURLConnection.java
trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/FileURLStreamHandler.java
trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/FileURLStreamHandlerFactory.java
trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/ResourceURLConnection.java
trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/ResourceURLStreamHandler.java
trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/ResourceURLStreamHandlerFactory.java
trunk/arakhneVmutils/java/src/test/java/org/arakhne/vmutil/FileResourceURLStreamHandlerFactoryStub.java
trunk/arakhneVmutils/java/src/test/java/org/arakhne/vmutil/FileURLConnectionTest.java
trunk/arakhneVmutils/java/src/test/java/org/arakhne/vmutil/ResourceURLConnectionTest.java
Modified: trunk/arakhneVmutils/java/pom.xml
===================================================================
--- trunk/arakhneVmutils/java/pom.xml 2010-08-03 17:18:39 UTC (rev 169)
+++ trunk/arakhneVmutils/java/pom.xml 2010-09-06 20:18:50 UTC (rev 170)
@@ -17,7 +17,7 @@
<artifactId>arakhneVmutils-java</artifactId>
<packaging>bundle</packaging>
<groupId>org.arakhne.afc</groupId>
- <version>5.1-SNAPSHOT</version>
+ <version>6.0-SNAPSHOT</version>
<name>${pom.artifactId}</name>
<properties>
Deleted: trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/DynamicURLClassLoader.java
===================================================================
--- trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/DynamicURLClassLoader.java 2010-08-03 17:18:39 UTC (rev 169)
+++ trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/DynamicURLClassLoader.java 2010-09-06 20:18:50 UTC (rev 170)
@@ -1,588 +0,0 @@
-/*
- * $Id$
- *
- * Copyright (C) 2004-2008 Stéphane GALLAND
- *
- * 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
- * This program is free software; you can redistribute it and/or modify
- */
-
-package org.arakhne.vmutil;
-
-import java.io.File;
-import java.io.FilePermission;
-import java.io.IOException;
-import java.net.JarURLConnection;
-import java.net.MalformedURLException;
-import java.net.SocketPermission;
-import java.net.URL;
-import java.net.URLConnection;
-import java.security.AccessControlContext;
-import java.security.AccessController;
-import java.security.CodeSigner;
-import java.security.CodeSource;
-import java.security.Permission;
-import java.security.PermissionCollection;
-import java.security.PrivilegedAction;
-import java.security.PrivilegedExceptionAction;
-import java.security.SecureClassLoader;
-import java.util.Arrays;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.NoSuchElementException;
-import java.util.jar.Attributes;
-import java.util.jar.Manifest;
-import java.util.jar.Attributes.Name;
-import java.util.regex.Pattern;
-
-import sun.misc.Resource;
-import sun.misc.URLClassPath;
-import sun.net.www.ParseUtil;
-import sun.security.util.SecurityConstants;
-
-/** This class loader permits to load classes from
- * a set of classpaths.
- *
- * @author Stéphane GALLAND <galland@xxxxxxxxxxx>
- * @version $Name$ $Revision$ $Date$
- * @mavengroupid org.arakhne.afc
- * @mavenartifactid arakhneVmutils
- */
-@SuppressWarnings("restriction")
-public class DynamicURLClassLoader extends SecureClassLoader {
-
- /**
- * The search path for classes and resources.
- */
- protected URLClassPath _ucp;
-
- /**
- * The context to be used when loading classes and resources
- */
- protected AccessControlContext _acc;
-
- /**
- * Constructs a new ClassPathClassLoader for the given URLs. The URLs will be
- * searched in the order specified for classes and resources after first
- * searching in the specified parent class loader. Any URL that ends with
- * a '/' is assumed to refer to a directory. Otherwise, the URL is assumed
- * to refer to a JAR file which will be downloaded and opened as needed.
- *
- * <p>If there is a security manager, this method first
- * calls the security manager's <code>checkCreateClassLoader</code> method
- * to ensure creation of a class loader is allowed.
- *
- * @param parent the parent class loader for delegation
- * @param acc is the current access context
- * @param urls the URLs from which to load classes and resources
- * @exception SecurityException if a security manager exists and its
- * <code>checkCreateClassLoader</code> method doesn't allow
- * creation of a class loader.
- * @see SecurityManager#checkCreateClassLoader
- */
- protected DynamicURLClassLoader(ClassLoader parent, AccessControlContext acc, URL... urls) {
- super(parent);
- // this is to make the stack depth consistent with 1.1
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- security.checkCreateClassLoader();
- }
- this._ucp = new URLClassPath(mergeClassPath(urls));
- this._acc = acc;
- }
-
- /**
- * Appends the specified URL to the list of URLs to search for
- * classes and resources.
- *
- * @param url the URL to be added to the search path of URLs
- */
- public void addURL(final URL url) {
- AccessController.doPrivileged(new PrivilegedAction<Object>() {
- public Object run() {
- DynamicURLClassLoader.this._ucp.addURL(url);
- return null;
- }
- }, this._acc);
- }
-
- /**
- * Appends the specified URL to the list of URLs to search for
- * classes and resources.
- *
- * @param urls the URLs to be added to the search path of URLs
- */
- public void addURLs(URL... urls) {
- for (URL url : urls) {
- addURL(url);
- }
- }
-
- /**
- * Appends the specified URL to the list of URLs to search for
- * classes and resources.
- *
- * @param urls the URL to be added to the search path of URLs
- */
- public void removeURLs(URL... urls) {
- HashSet<URL> set = new HashSet<URL>();
- set.addAll(Arrays.asList(this._ucp.getURLs()));
- set.removeAll(Arrays.asList(urls));
- URL[] tab = new URL[set.size()];
- set.toArray(tab);
- this._ucp = new URLClassPath(tab);
- tab = null;
- }
-
- /**
- * Appends the specified URL to the list of URLs to search for
- * classes and resources.
- *
- * @param url the URL to be added to the search path of URLs
- */
- public void removeURL(URL url) {
- removeURLs(url);
- }
-
- /**
- * Returns the search path of URLs for loading classes and resources.
- * This includes the original list of URLs specified to the constructor,
- * along with any URLs subsequently appended by the addURL() method.
- * @return the search path of URLs for loading classes and resources.
- */
- public URL[] getURLs() {
- return this._ucp.getURLs();
- }
-
- /**
- * Finds and loads the class with the specified name from the URL search
- * path. Any URLs referring to JAR files are loaded and opened as needed
- * until the class is found.
- *
- * @param name the name of the class
- * @return the resulting class
- * @exception ClassNotFoundException if the class could not be found
- */
- @Override
- protected Class<?> findClass(final String name) throws ClassNotFoundException {
- try {
- return AccessController.doPrivileged(new PrivilegedExceptionAction<Class<?>>() {
- public Class<?> run() throws ClassNotFoundException {
- String path = name.replace('.', '/').concat(".class"); //$NON-NLS-1$
- Resource res = DynamicURLClassLoader.this._ucp.getResource(path, false);
- if (res != null) {
- try {
- return defineClass(name, res);
- }
- catch (IOException e) {
- throw new ClassNotFoundException(name, e);
- }
- }
- throw new ClassNotFoundException(name);
- }
- }, this._acc);
- }
- catch (java.security.PrivilegedActionException pae) {
- throw (ClassNotFoundException) pae.getException();
- }
- }
-
- /**
- * Defines a Class using the class bytes obtained from the specified
- * Resource. The resulting Class must be resolved before it can be
- * used.
- *
- * @param name is the name of the class to define
- * @param res is the resource from which the class byte-code could be obtained
- * @return the loaded class.
- * @throws IOException in case the byte-code was unavailable.
- */
- protected Class<?> defineClass(String name, Resource res) throws IOException {
- int i = name.lastIndexOf('.');
- URL url = res.getCodeSourceURL();
- if (i != -1) {
- String pkgname = name.substring(0, i);
- // Check if package already loaded.
- Package pkg = getPackage(pkgname);
- Manifest man = res.getManifest();
- if (pkg != null) {
- // Package found, so check package sealing.
- if (pkg.isSealed()) {
- // Verify that code source URL is the same.
- if (!pkg.isSealed(url)) {
- throw new SecurityException(
- "sealing violation: package " + pkgname + " is sealed"); //$NON-NLS-1$ //$NON-NLS-2$
- }
-
- } else {
- // Make sure we are not attempting to seal the package
- // at this code source URL.
- if ((man != null) && isSealed(pkgname, man)) {
- throw new SecurityException(
- "sealing violation: can't seal package " + pkgname + //$NON-NLS-1$
- ": already loaded"); //$NON-NLS-1$
- }
- }
- } else {
- if (man != null) {
- definePackage(pkgname, man, url);
- } else {
- definePackage(pkgname, null, null, null, null, null, null, null);
- }
- }
- }
- // Now read the class bytes and define the class
- java.nio.ByteBuffer bb = res.getByteBuffer();
- if (bb != null) {
- // Use (direct) ByteBuffer:
- CodeSigner[] signers = res.getCodeSigners();
- CodeSource cs = new CodeSource(url, signers);
- return defineClass(name, bb, cs);
- }
-
- byte[] b = res.getBytes();
- // must read certificates AFTER reading bytes.
- CodeSigner[] signers = res.getCodeSigners();
- CodeSource cs = new CodeSource(url, signers);
- return defineClass(name, b, 0, b.length, cs);
-
- }
-
- /**
- * Defines a new package by name in this ClassLoader. The attributes
- * contained in the specified Manifest will be used to obtain package
- * version and sealing information. For sealed packages, the additional
- * URL specifies the code source URL from which the package was loaded.
- *
- * @param name the package name
- * @param man the Manifest containing package version and sealing
- * information
- * @param url the code source url for the package, or null if none
- * @exception IllegalArgumentException if the package name duplicates
- * an existing package either in this class loader or one
- * of its ancestors
- * @return the newly defined Package object
- */
- protected Package definePackage(String name, Manifest man, URL url)
- throws IllegalArgumentException
- {
- String path = name.replace('.', '/').concat("/"); //$NON-NLS-1$
- String specTitle = null, specVersion = null, specVendor = null;
- String implTitle = null, implVersion = null, implVendor = null;
- String sealed = null;
- URL sealBase = null;
-
- Attributes attr = man.getAttributes(path);
- if (attr != null) {
- specTitle = attr.getValue(Name.SPECIFICATION_TITLE);
- specVersion = attr.getValue(Name.SPECIFICATION_VERSION);
- specVendor = attr.getValue(Name.SPECIFICATION_VENDOR);
- implTitle = attr.getValue(Name.IMPLEMENTATION_TITLE);
- implVersion = attr.getValue(Name.IMPLEMENTATION_VERSION);
- implVendor = attr.getValue(Name.IMPLEMENTATION_VENDOR);
- sealed = attr.getValue(Name.SEALED);
- }
- attr = man.getMainAttributes();
- if (attr != null) {
- if (specTitle == null) {
- specTitle = attr.getValue(Name.SPECIFICATION_TITLE);
- }
- if (specVersion == null) {
- specVersion = attr.getValue(Name.SPECIFICATION_VERSION);
- }
- if (specVendor == null) {
- specVendor = attr.getValue(Name.SPECIFICATION_VENDOR);
- }
- if (implTitle == null) {
- implTitle = attr.getValue(Name.IMPLEMENTATION_TITLE);
- }
- if (implVersion == null) {
- implVersion = attr.getValue(Name.IMPLEMENTATION_VERSION);
- }
- if (implVendor == null) {
- implVendor = attr.getValue(Name.IMPLEMENTATION_VENDOR);
- }
- if (sealed == null) {
- sealed = attr.getValue(Name.SEALED);
- }
- }
- if ("true".equalsIgnoreCase(sealed)) { //$NON-NLS-1$
- sealBase = url;
- }
- return definePackage(name, specTitle, specVersion, specVendor,
- implTitle, implVersion, implVendor, sealBase);
- }
-
- /*
- * Returns true if the specified package name is sealed according to the
- * given manifest.
- */
- private boolean isSealed(String name, Manifest man) {
- String path = name.replace('.', '/').concat("/"); //$NON-NLS-1$
- Attributes attr = man.getAttributes(path);
- String sealed = null;
- if (attr != null) {
- sealed = attr.getValue(Name.SEALED);
- }
- if (sealed == null) {
- if ((attr = man.getMainAttributes()) != null) {
- sealed = attr.getValue(Name.SEALED);
- }
- }
- return "true".equalsIgnoreCase(sealed); //$NON-NLS-1$
- }
-
- /**
- * Finds the resource with the specified name on the URL search path.
- *
- * @param name the name of the resource
- * @return a <code>URL</code> for the resource, or <code>null</code>
- * if the resource could not be found.
- */
- @Override
- public URL findResource(final String name) {
- /*
- * The same restriction to finding classes applies to resources
- */
- URL url =
- AccessController.doPrivileged(new PrivilegedAction<URL>() {
- public URL run() {
- return DynamicURLClassLoader.this._ucp.findResource(name, true);
- }
- }, this._acc);
-
- return url != null ? this._ucp.checkURL(url) : null;
- }
-
- /**
- * Returns an Enumeration of URLs representing all of the resources
- * on the URL search path having the specified name.
- *
- * @param name the resource name
- * @exception IOException if an I/O exception occurs
- * @return an <code>Enumeration</code> of <code>URL</code>s
- */
- @Override
- public Enumeration<URL> findResources(final String name) throws IOException {
- final Enumeration<?> e = this._ucp.findResources(name, true);
-
- return new Enumeration<URL>() {
- private URL url = null;
-
- private boolean next() {
- if (this.url != null) {
- return true;
- }
- do {
- URL u = AccessController.doPrivileged(new PrivilegedAction<URL>() {
- public URL run() {
- if (!e.hasMoreElements())
- return null;
- return (URL)e.nextElement();
- }
- }, DynamicURLClassLoader.this._acc);
- if (u == null) break;
- this.url = DynamicURLClassLoader.this._ucp.checkURL(u);
- }
- while (this.url == null);
-
- return (this.url != null);
- }
-
- public URL nextElement() {
- if (!next()) {
- throw new NoSuchElementException();
- }
- URL u = this.url;
- this.url = null;
- return u;
- }
-
- public boolean hasMoreElements() {
- return next();
- }
- };
- }
-
- /**
- * Returns the permissions for the given codesource object.
- * The implementation of this method first calls super.getPermissions
- * and then adds permissions based on the URL of the codesource.
- * <p>
- * If the protocol is "file"
- * and the path specifies a file, then permission to read that
- * file is granted. If protocol is "file" and the path is
- * a directory, permission is granted to read all files
- * and (recursively) all files and subdirectories contained in
- * that directory.
- * <p>
- * If the protocol is not "file", then
- * to connect to and accept connections from the URL's host is granted.
- * @param codesource the codesource
- * @return the permissions granted to the codesource
- */
- @Override
- protected PermissionCollection getPermissions(CodeSource codesource) {
- PermissionCollection perms = super.getPermissions(codesource);
-
- URL url = codesource.getLocation();
-
- Permission p;
- URLConnection urlConnection;
-
- try {
- urlConnection = url.openConnection();
- p = urlConnection.getPermission();
- }
- catch (java.io.IOException ioe) {
- p = null;
- urlConnection = null;
- }
-
- if ((p!=null)&&(p instanceof FilePermission)) {
- // if the permission has a separator char on the end,
- // it means the codebase is a directory, and we need
- // to add an additional permission to read recursively
- String path = p.getName();
- if (path.endsWith(File.separator)) {
- path += "-"; //$NON-NLS-1$
- p = new FilePermission(path, SecurityConstants.FILE_READ_ACTION);
- }
- }
- else if ((p == null) && (URISchemeType.FILE.isURL(url))) {
- String path = url.getFile().replace('/', File.separatorChar);
- path = ParseUtil.decode(path);
- if (path.endsWith(File.separator))
- path += "-"; //$NON-NLS-1$
- p = new FilePermission(path, SecurityConstants.FILE_READ_ACTION);
- }
- else {
- URL locUrl = url;
- if (urlConnection instanceof JarURLConnection) {
- locUrl = ((JarURLConnection)urlConnection).getJarFileURL();
- }
- String host = locUrl.getHost();
- if (host == null)
- host = "localhost"; //$NON-NLS-1$
- p = new SocketPermission(host,
- SecurityConstants.SOCKET_CONNECT_ACCEPT_ACTION);
- }
-
- // make sure the person that created this class loader
- // would have this permission
-
- final SecurityManager sm = System.getSecurityManager();
- if (sm != null) {
- final Permission fp = p;
- AccessController.doPrivileged(new PrivilegedAction<Object>() {
- public Object run() throws SecurityException {
- sm.checkPermission(fp);
- return null;
- }
- }, this._acc);
- }
- perms.add(p);
-
- return perms;
- }
-
- /**
- * Creates a new instance of DynamicURLClassLoader for the specified
- * URLs and parent class loader. If a security manager is
- * installed, the <code>loadClass</code> method of the URLClassLoader
- * returned by this method will invoke the
- * <code>SecurityManager.checkPackageAccess</code> method before
- * loading the class.
- *
- * @param parent the parent class loader for delegation
- * @param urls the URLs to search for classes and resources
- * @return the resulting class loader
- */
- public static DynamicURLClassLoader newInstance(final ClassLoader parent, final URL... urls) {
- // Save the caller's context
- final AccessControlContext acc = AccessController.getContext();
- // Need a privileged block to create the class loader
- DynamicURLClassLoader ucl =
- AccessController.doPrivileged(new PrivilegedAction<DynamicURLClassLoader>() {
- public DynamicURLClassLoader run() {
- // Now set the context on the loader using the one we saved,
- // not the one inside the privileged block...
- return new FactoryDynamicURLClassLoader(parent, acc, urls);
- }
- });
- return ucl;
- }
-
- /**
- * Merge the specified URLs to the current classpath.
- */
- private static URL[] mergeClassPath(URL... urls) {
- String path = System.getProperty("java.class.path"); //$NON-NLS-1$
- String separator = System.getProperty("path.separator"); //$NON-NLS-1$
- String[] parts = path.split(Pattern.quote(separator));
- URL[] u = new URL[parts.length+urls.length];
- for(int i=0; i<parts.length; i++) {
- try {
- u[i] = new File(parts[i]).toURI().toURL();
- }
- catch (MalformedURLException _) {
- // ignore exception
- }
- }
- System.arraycopy(urls,0,u,parts.length,urls.length);
- return u;
- }
-
- /**
- * @author Stéphane GALLAND <galland@xxxxxxxxxxx>
- * @version $Name$ $Revision$ $Date$
- * @mavengroupid org.arakhne.afc
- * @mavenartifactid arakhneVmutils
- */
- protected final static class FactoryDynamicURLClassLoader extends DynamicURLClassLoader {
-
- /**
- * @param parent is the parent class loader.
- * @param acc is the accessible context.
- * @param urls is the list of urls to insert inside the class loading path.
- */
- protected FactoryDynamicURLClassLoader(ClassLoader parent, AccessControlContext acc, URL... urls) {
- super(parent,acc,urls);
- }
-
- /** {@inheritDoc}
- *
- * @param name {@inheritDoc}
- * @param resolve {@inheritDoc}
- * @return {@inheritDoc}
- * @throws ClassNotFoundException {@inheritDoc}
- */
- @Override
- public final synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
- // First check if we have permission to access the package. This
- // should go away once we've added support for exported packages.
- SecurityManager sm = System.getSecurityManager();
- if (sm != null) {
- int i = name.lastIndexOf('.');
- if (i != -1) {
- sm.checkPackageAccess(name.substring(0, i));
- }
- }
- return super.loadClass(name, resolve);
- }
-
- }
-
-}
Deleted: trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/DynamicURLStreamHandlerFactory.java
===================================================================
--- trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/DynamicURLStreamHandlerFactory.java 2010-08-03 17:18:39 UTC (rev 169)
+++ trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/DynamicURLStreamHandlerFactory.java 2010-09-06 20:18:50 UTC (rev 170)
@@ -1,133 +0,0 @@
-/*
- * $Id$
- *
- * Copyright (C) 2010 Stéphane GALLAND
- *
- * 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
- * This program is free software; you can redistribute it and/or modify
- */
-package org.arakhne.vmutil;
-
-import java.net.URL;
-import java.net.URLStreamHandler;
-import java.net.URLStreamHandlerFactory;
-import java.util.Collections;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-
-/**
- * This class defines a factory for <code>URL</code> stream protocol handlers
- * which is generic and extendable.
- * <p>
- * It is used by the <code>URL</code> class to create a
- * <code>URLStreamHandler</code> for protocols.
- * <p>
- * To use this factory, invoke the following code only ONCE time:
- * <code>URL.setURLStreamHandlerFactory(new GenericURLStreamHandlerFactory());</code>.
- * <p>
- * By default this factory known the following protocols:
- * <ul>
- * <li><code>file</code>: {@link FileURLStreamHandler}</li>
- * <li><code>resource</code>: {@link ResourceURLStreamHandler}</li>
- * </ul>
- *
- * @author Stéphane GALLAND <galland@xxxxxxxxxxx>
- * @version $Name$ $Revision$ $Date$
- * @mavengroupid org.arakhne.afc
- * @mavenartifactid arakhneVmutils
- * @see URLStreamHandlerFactory
- * @see URL#setURLStreamHandlerFactory(URLStreamHandlerFactory)
- * @since 4.2
- */
-public class DynamicURLStreamHandlerFactory
-implements URLStreamHandlerFactory {
-
- private final Map<String, Class<? extends URLStreamHandler>> handlers
- = new TreeMap<String, Class<? extends URLStreamHandler>>();
-
- /**
- * Create an URLStreamHandler factory with default protocols.
- */
- public DynamicURLStreamHandlerFactory() {
- addHandler(URISchemeType.FILE.name().toLowerCase(), FileURLStreamHandler.class);
- addHandler(URISchemeType.RESOURCE.name().toLowerCase(), ResourceURLStreamHandler.class);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public URLStreamHandler createURLStreamHandler(String protocol) {
- Class<? extends URLStreamHandler> handler = this.handlers.get(protocol.toLowerCase());
- if (handler!=null) {
- try {
- return handler.newInstance();
- }
- catch (Throwable _) {
- // Ignore errors.
- }
- }
- // Force the default factory to retreive stream handler.
- return null;
- }
-
- /** Add an handler for the given protocol.
- *
- * @param protocol is the protocol to register.
- * @param handler is the type of handler to instance when treating an URL with given protocol.
- * @return the handler previously binded to the given protocol, or <code>null</code>.
- */
- public Class<? extends URLStreamHandler> addHandler(String protocol, Class<? extends URLStreamHandler> handler) {
- return this.handlers.put(protocol.toLowerCase(), handler);
- }
-
- /** Remove handler for the given protocol.
- *
- * @param protocol is the protocol to remove.
- * @return the handler previously binded to the given protocol, or <code>null</code>.
- */
- public Class<? extends URLStreamHandler> removeHandler(String protocol) {
- return this.handlers.remove(protocol.toLowerCase());
- }
-
- /** Replies handler for the given protocol.
- *
- * @param protocol is the protocol to search for.
- * @return the handler binded to the given protocol, or <code>null</code>.
- */
- public Class<? extends URLStreamHandler> getHandler(String protocol) {
- return this.handlers.get(protocol.toLowerCase());
- }
-
- /** Replies if the given protocol is supported.
- *
- * @param protocol is the protocol.
- * @return <code>true</code> if the given protocol is known, otherwise
- * <code>false</code>
- */
- public boolean contains(String protocol) {
- return this.handlers.containsKey(protocol.toLowerCase());
- }
-
- /** Replies an unmodifiable set of the known protocols.
- *
- * @return the known protocols
- */
- public Set<String> getProtocols() {
- return Collections.unmodifiableSet(this.handlers.keySet());
- }
-
-}
Deleted: trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/FileResourceURLStreamHandlerFactory.java
===================================================================
--- trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/FileResourceURLStreamHandlerFactory.java 2010-08-03 17:18:39 UTC (rev 169)
+++ trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/FileResourceURLStreamHandlerFactory.java 2010-09-06 20:18:50 UTC (rev 170)
@@ -1,61 +0,0 @@
-/*
- * $Id$
- *
- * Copyright (C) 2010 Stéphane GALLAND
- *
- * 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
- * This program is free software; you can redistribute it and/or modify
- */
-package org.arakhne.vmutil;
-
-import java.net.URL;
-import java.net.URLStreamHandler;
-import java.net.URLStreamHandlerFactory;
-
-/**
- * This class defines a factory for <code>URL</code> stream
- * "resource" and "file" protocol handlers.
- * <p>
- * It is used by the <code>URL</code> class to create a
- * <code>URLStreamHandler</code> for a "resource" protocol.
- * <p>
- * To use this factory, invoke the following code only ONCE time:
- * <code>URL.setURLStreamHandlerFactory(new FileResourceURLStreamHandlerFactory());</code>.
- *
- * @author Stéphane GALLAND <galland@xxxxxxxxxxx>
- * @version $Name$ $Revision$ $Date$
- * @mavengroupid org.arakhne.afc
- * @mavenartifactid arakhneVmutils
- * @see URLStreamHandlerFactory
- * @see URL#setURLStreamHandlerFactory(URLStreamHandlerFactory)
- * @since 4.2
- */
-public class FileResourceURLStreamHandlerFactory
-implements URLStreamHandlerFactory {
-
- /**
- * {@inheritDoc}
- */
- @Override
- public URLStreamHandler createURLStreamHandler(String protocol) {
- if (URISchemeType.RESOURCE.isScheme(protocol))
- return new ResourceURLStreamHandler();
- if (URISchemeType.FILE.isScheme(protocol))
- return new FileURLStreamHandler();
- // Force the default factory to retreive stream handler.
- return null;
- }
-
-}
Deleted: trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/FileURLConnection.java
===================================================================
--- trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/FileURLConnection.java 2010-08-03 17:18:39 UTC (rev 169)
+++ trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/FileURLConnection.java 2010-09-06 20:18:50 UTC (rev 170)
@@ -1,206 +0,0 @@
-/*
- * $Id$
- *
- * Copyright (C) 2010 Alexandre WILLAUME, Stéphane GALLAND
- *
- * 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
- * This program is free software; you can redistribute it and/or modify
- */
-package org.arakhne.vmutil;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URL;
-import java.net.URLConnection;
-import java.net.UnknownServiceException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.activation.MimetypesFileTypeMap;
-
-/**
- * The class <code>FileURLConnection</code> is implementing
- * connection between an URL and a local file.
- * Instances of this class can be used both to
- * read from and to write to the resource referenced by the file URL.
- * <p>
- * Supported header fields are:
- * <ul>
- * <li><code>content-type</code></li>
- * <li><code>content-length</code></li>
- * <li><code>last-modified</code></li>
- * </ul>
- *
- * @author Alexandre WILLAUME <willaume@xxxxxxxxxxx>
- * @author Stéphane GALLAND <galland@xxxxxxxxxxx>
- * @version $Name$ $Revision$ $Date$
- * @mavengroupid org.arakhne.afc
- * @mavenartifactid arakhneVmutils
- * @see URLConnection
- * @since 4.2
- */
-class FileURLConnection extends URLConnection {
-
- private File file = null;
-
- private String contentType = null;
-
- /**
- * @param url is the "file"-protocol url to use.
- */
- protected FileURLConnection(URL url) {
- super(url);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public String getHeaderField(int n) {
- try {
- connect();
- }
- catch(IOException e) {
- throw new IllegalStateException(e);
- }
- switch(n) {
- case 0: // content-type
- return this.contentType;
- case 1: // content-length
- return Long.toString(this.file.length());
- case 2: // last-modified
- return Long.toString(this.file.lastModified());
- }
- return null;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public String getHeaderField(String name) {
- try {
- connect();
- }
- catch(IOException e) {
- throw new IllegalStateException(e);
- }
- if ("content-type".equals(name)) { //$NON-NLS-1$
- return this.contentType;
- }
- if ("content-length".equals(name)) { //$NON-NLS-1$
- return Long.toString(this.file.length());
- }
- if ("last-modified".equals(name)) { //$NON-NLS-1$
- return Long.toString(this.file.lastModified());
- }
- return null;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public String getHeaderFieldKey(int n) {
- switch(n) {
- case 0:
- return "content-type"; //$NON-NLS-1$
- case 1:
- return "content-length"; //$NON-NLS-1$
- case 2:
- return "last-modified"; //$NON-NLS-1$
- }
- return null;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public Map<String,List<String>> getHeaderFields() {
- try {
- connect();
- }
- catch(IOException e) {
- throw new IllegalStateException(e);
- }
- Map<String, List<String>> flds = new HashMap<String, List<String>>();
- flds.put("content-type", singletonList(this.contentType)); //$NON-NLS-1$
- flds.put("content-length", singletonList(Long.toString(this.file.length()))); //$NON-NLS-1$
- flds.put("last-modified", singletonList(Long.toString(this.file.lastModified()))); //$NON-NLS-1$
- return flds;
- }
-
- private List<String> singletonList(String value) {
- if (value==null) return null;
- return Collections.singletonList(value);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void connect() throws IOException {
- if (!this.connected) {
- this.file = FileSystem.convertUrlToFile(this.url);
- if (this.file==null)
- throw new FileNotFoundException(this.url.toExternalForm());
- this.contentType = new MimetypesFileTypeMap().getContentType(this.file);
- this.connected = true;
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public OutputStream getOutputStream() throws IOException {
- connect();
- if (getDoOutput()) {
- OutputStream os = new FileOutputStream(this.file);
- if (getUseCaches()) {
- os = new BufferedOutputStream(os);
- }
- return os;
- }
- throw new UnknownServiceException("URL connection cannot do output"); //$NON-NLS-1$
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public InputStream getInputStream() throws IOException {
- connect();
- if (getDoInput()) {
- InputStream is = new FileInputStream(this.file);
- if (getUseCaches()) {
- is = new BufferedInputStream(is);
- }
- return is;
- }
- throw new UnknownServiceException("URL connection cannot do input"); //$NON-NLS-1$
- }
-
-}
Deleted: trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/FileURLStreamHandler.java
===================================================================
--- trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/FileURLStreamHandler.java 2010-08-03 17:18:39 UTC (rev 169)
+++ trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/FileURLStreamHandler.java 2010-09-06 20:18:50 UTC (rev 170)
@@ -1,64 +0,0 @@
-/*
- * $Id$
- *
- * Copyright (C) 2010 Alexandre WILLAUME, Stéphane GALLAND
- *
- * 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
- * This program is free software; you can redistribute it and/or modify
- */
-package org.arakhne.vmutil;
-
-import java.io.IOException;
-import java.net.URL;
-import java.net.URLConnection;
-import java.net.URLStreamHandler;
-
-/**
- * The class <code>FileURLStreamHandler</code> is supporting file protocol
- * for URL streams. This stream protocol
- * handler knows how to make a connection for "file" protocol.
- * <p>
- * In most cases, an instance of a <code>URLStreamHandler</code>
- * subclass is not created directly by an application. Rather, the
- * first time a protocol name is encountered when constructing a
- * <code>URL</code>, the appropriate stream protocol handler is
- * automatically loaded.
- * <p>
- * To use this factory, invoke the following code only ONCE time:
- * <code>URL.setURLStreamHandlerFactory(new FileURLStreamHandlerFactory());</code>.
- *
- * @author Alexandre WILLAUME <willaume@xxxxxxxxxxx>
- * @author Stéphane GALLAND <galland@xxxxxxxxxxx>
- * @version $Name$ $Revision$ $Date$
- * @mavengroupid org.arakhne.afc
- * @mavenartifactid arakhneVmutils
- * @see URLStreamHandler
- * @see FileURLStreamHandlerFactory
- * @since 4.2
- */
-class FileURLStreamHandler extends URLStreamHandler {
-
- /**
- * {@inheritDoc}
- */
- @Override
- protected URLConnection openConnection(URL url) throws IOException {
- if (URISchemeType.FILE.isURL(url)) {
- return new FileURLConnection(url);
- }
- throw new UnsupportedOperationException("Unsupported protocol: "+url); //$NON-NLS-1$
- }
-
-}
Deleted: trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/FileURLStreamHandlerFactory.java
===================================================================
--- trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/FileURLStreamHandlerFactory.java 2010-08-03 17:18:39 UTC (rev 169)
+++ trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/FileURLStreamHandlerFactory.java 2010-09-06 20:18:50 UTC (rev 170)
@@ -1,60 +0,0 @@
-/*
- * $Id$
- *
- * Copyright (C) 2010 Alexandre WILLAUME, Stéphane GALLAND
- *
- * 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
- * This program is free software; you can redistribute it and/or modify
- */
-package org.arakhne.vmutil;
-
-import java.net.URL;
-import java.net.URLStreamHandler;
-import java.net.URLStreamHandlerFactory;
-
-/**
- * This class defines a factory for <code>URL</code> stream
- * "file" protocol handlers.
- * <p>
- * It is used by the <code>URL</code> class to create a
- * <code>URLStreamHandler</code> for a "file" protocol.
- * <p>
- * To use this factory, invoke the following code only ONCE time:
- * <code>URL.setURLStreamHandlerFactory(new FileURLStreamHandlerFactory());</code>.
- *
- * @author Alexandre WILLAUME <willaume@xxxxxxxxxxx>
- * @author Stéphane GALLAND <galland@xxxxxxxxxxx>
- * @version $Name$ $Revision$ $Date$
- * @mavengroupid org.arakhne.afc
- * @mavenartifactid arakhneVmutils
- * @see URLStreamHandlerFactory
- * @see URL#setURLStreamHandlerFactory(URLStreamHandlerFactory)
- * @since 4.2
- */
-public class FileURLStreamHandlerFactory
-implements URLStreamHandlerFactory {
-
- /**
- * {@inheritDoc}
- */
- @Override
- public URLStreamHandler createURLStreamHandler(String protocol) {
- if (URISchemeType.FILE.isScheme(protocol))
- return new FileURLStreamHandler();
- // Force the default factory to retreive stream handler.
- return null;
- }
-
-}
Deleted: trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/ResourceURLConnection.java
===================================================================
--- trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/ResourceURLConnection.java 2010-08-03 17:18:39 UTC (rev 169)
+++ trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/ResourceURLConnection.java 2010-09-06 20:18:50 UTC (rev 170)
@@ -1,157 +0,0 @@
-/*
- * $Id$
- *
- * Copyright (C) 2010 Alexandre WILLAUME, Stéphane GALLAND
- *
- * 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
- * This program is free software; you can redistribute it and/or modify
- */
-package org.arakhne.vmutil;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.List;
-import java.util.Map;
-
-/**
- * The class <code>ResourceURLConnection</code> is implementing
- * connection between an URL and a Java resource.
- * Instances of this class can be used to
- * read from the resource referenced by the resource URL. Write
- * is allowed depending on where resource is located.
- * <p>
- * Supported header fields are the same as the real resource URL
- * (basicaly, file or jar protocols).
- *
- * @author Stéphane GALLAND <galland@xxxxxxxxxxx>
- * @version $Name$ $Revision$ $Date$
- * @mavengroupid org.arakhne.afc
- * @mavenartifactid arakhneVmutils
- * @see URLConnection
- * @since 4.2
- */
-class ResourceURLConnection extends URLConnection {
-
- private URL location = null;
- private URLConnection connection = null;
-
- /**
- * @param url is the "file"-protocol url to use.
- */
- protected ResourceURLConnection(URL url) {
- super(url);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public String getHeaderField(int n) {
- try {
- connect();
- }
- catch(IOException e) {
- throw new IllegalStateException(e);
- }
- return this.connection.getHeaderField(n);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public String getHeaderField(String name) {
- try {
- connect();
- }
- catch(IOException e) {
- throw new IllegalStateException(e);
- }
- return this.connection.getHeaderField(name);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public String getHeaderFieldKey(int n) {
- try {
- connect();
- }
- catch(IOException e) {
- throw new IllegalStateException(e);
- }
- return this.connection.getHeaderFieldKey(n);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public Map<String,List<String>> getHeaderFields() {
- try {
- connect();
- }
- catch(IOException e) {
- throw new IllegalStateException(e);
- }
- return this.connection.getHeaderFields();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void connect() throws IOException {
- if (!this.connected) {
- this.location = Resources.getResource(this.url.getFile());
- if (this.location==null)
- throw new ResourceNotFoundException(this.url.toExternalForm());
- this.connection = this.location.openConnection();
- if (this.connection==null)
- throw new ResourceNotFoundException(this.url.toExternalForm());
- this.connection.setDoInput(getDoInput());
- this.connection.setDoOutput(getDoOutput());
- this.connection.setAllowUserInteraction(getAllowUserInteraction());
- this.connection.setConnectTimeout(getConnectTimeout());
- this.connection.setDefaultUseCaches(getDefaultUseCaches());
- this.connection.setReadTimeout(getReadTimeout());
- this.connection.setIfModifiedSince(getIfModifiedSince());
- this.connected = true;
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public OutputStream getOutputStream() throws IOException {
- connect();
- return this.connection.getOutputStream();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public InputStream getInputStream() throws IOException {
- connect();
- return this.connection.getInputStream();
- }
-
-}
Deleted: trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/ResourceURLStreamHandler.java
===================================================================
--- trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/ResourceURLStreamHandler.java 2010-08-03 17:18:39 UTC (rev 169)
+++ trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/ResourceURLStreamHandler.java 2010-09-06 20:18:50 UTC (rev 170)
@@ -1,63 +0,0 @@
-/*
- * $Id$
- *
- * Copyright (C) 2010 Alexandre WILLAUME, Stéphane GALLAND
- *
- * 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
- * This program is free software; you can redistribute it and/or modify
- */
-package org.arakhne.vmutil;
-
-import java.io.IOException;
-import java.net.URL;
-import java.net.URLConnection;
-import java.net.URLStreamHandler;
-
-/**
- * The class <code>ResourceURLStreamHandler</code> is supporting resource protocol
- * for URL streams. This stream protocol
- * handler knows how to make a connection for "resource" protocol.
- * <p>
- * In most cases, an instance of a <code>URLStreamHandler</code>
- * subclass is not created directly by an application. Rather, the
- * first time a protocol name is encountered when constructing a
- * <code>URL</code>, the appropriate stream protocol handler is
- * automatically loaded.
- * <p>
- * To use this factory, invoke the following code only ONCE time:
- * <code>URL.setURLStreamHandlerFactory(new ResourceURLStreamHandlerFactory());</code>.
- *
- * @author Stéphane GALLAND <galland@xxxxxxxxxxx>
- * @version $Name$ $Revision$ $Date$
- * @mavengroupid org.arakhne.afc
- * @mavenartifactid arakhneVmutils
- * @see URLStreamHandler
- * @see ResourceURLStreamHandlerFactory
- * @since 4.2
- */
-class ResourceURLStreamHandler extends URLStreamHandler {
-
- /**
- * {@inheritDoc}
- */
- @Override
- protected URLConnection openConnection(URL url) throws IOException {
- if (URISchemeType.RESOURCE.isURL(url)) {
- return new ResourceURLConnection(url);
- }
- throw new UnsupportedOperationException("Unsupported protocol: "+url); //$NON-NLS-1$
- }
-
-}
Deleted: trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/ResourceURLStreamHandlerFactory.java
===================================================================
--- trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/ResourceURLStreamHandlerFactory.java 2010-08-03 17:18:39 UTC (rev 169)
+++ trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/ResourceURLStreamHandlerFactory.java 2010-09-06 20:18:50 UTC (rev 170)
@@ -1,59 +0,0 @@
-/*
- * $Id$
- *
- * Copyright (C) 2010 Stéphane GALLAND
- *
- * 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
- * This program is free software; you can redistribute it and/or modify
- */
-package org.arakhne.vmutil;
-
-import java.net.URL;
-import java.net.URLStreamHandler;
-import java.net.URLStreamHandlerFactory;
-
-/**
- * This class defines a factory for <code>URL</code> stream
- * "resource" protocol handlers.
- * <p>
- * It is used by the <code>URL</code> class to create a
- * <code>URLStreamHandler</code> for a "resource" protocol.
- * <p>
- * To use this factory, invoke the following code only ONCE time:
- * <code>URL.setURLStreamHandlerFactory(new ResourceURLStreamHandlerFactory());</code>.
- *
- * @author Stéphane GALLAND <galland@xxxxxxxxxxx>
- * @version $Name$ $Revision$ $Date$
- * @mavengroupid org.arakhne.afc
- * @mavenartifactid arakhneVmutils
- * @see URLStreamHandlerFactory
- * @see URL#setURLStreamHandlerFactory(URLStreamHandlerFactory)
- * @since 4.2
- */
-public class ResourceURLStreamHandlerFactory
-implements URLStreamHandlerFactory {
-
- /**
- * {@inheritDoc}
- */
- @Override
- public URLStreamHandler createURLStreamHandler(String protocol) {
- if (URISchemeType.RESOURCE.isScheme(protocol))
- return new ResourceURLStreamHandler();
- // Force the default factory to retreive stream handler.
- return null;
- }
-
-}
Added: trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/URLHandlerUtil.java
===================================================================
--- trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/URLHandlerUtil.java (rev 0)
+++ trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/URLHandlerUtil.java 2010-09-06 20:18:50 UTC (rev 170)
@@ -0,0 +1,119 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2004-2009 Stéphane GALLAND
+ *
+ * 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
+ * This program is free software; you can redistribute it and/or modify
+ */
+
+package org.arakhne.vmutil;
+
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+
+/** Utilities around URLHandler.
+ *
+ * @author Stéphane GALLAND <galland@xxxxxxxxxxx>
+ * @version $Name$ $Revision$ $Date$
+ * @mavengroupid org.arakhne.afc
+ * @mavenartifactid arakhneVmutils
+ * @since 6.0
+ */
+public class URLHandlerUtil {
+
+ private static final String HANDLER_PACKAGES = "java.protocol.handler.pkgs"; //$NON-NLS-1$
+
+ private static void install(String... packageNames) {
+ List<String> array = new LinkedList<String>();
+
+ String str = System.getProperty(HANDLER_PACKAGES);
+ if (str!=null && !"".equals(str)) { //$NON-NLS-1$
+ array.addAll(Arrays.asList(str.split("\\|"))); //$NON-NLS-1$
+ }
+
+ for(String packageName : packageNames) {
+ if (!array.contains(packageName)) {
+ array.add(0, packageName);
+ }
+ }
+
+ StringBuffer buffer = new StringBuffer();
+ for(String s : array) {
+ if (buffer.length()>0)
+ buffer.append('|');
+ buffer.append(s);
+ }
+
+ String nstr = buffer.toString();
+ if (!nstr.equals(str)) {
+ System.setProperty(HANDLER_PACKAGES, nstr);
+ }
+ }
+
+ private static void uninstall(String... packageNames) {
+ List<String> array = new LinkedList<String>();
+
+ String str = System.getProperty(HANDLER_PACKAGES);
+ if (str!=null && !"".equals(str)) { //$NON-NLS-1$
+ array.addAll(Arrays.asList(str.split("\\|"))); //$NON-NLS-1$
+ }
+
+ array.removeAll(Arrays.asList(packageNames));
+
+ StringBuffer buffer = new StringBuffer();
+ for(String s : array) {
+ if (buffer.length()>0)
+ buffer.append('|');
+ buffer.append(s);
+ }
+
+ String nstr = buffer.toString();
+ if (!nstr.equals(str)) {
+ System.setProperty(HANDLER_PACKAGES, nstr);
+ }
+ }
+
+ /** Install the URL handlers provided by Arakhnê
+ * libraries.
+ * <p>
+ * Handlers are provided for:<ul>
+ * <li><code>file</code>: handler for files which is supported input and output.</li>
+ * <li><code>resource</code>: handler for resource URL.</li>
+ * </ul>
+ *
+ * @see #uninstallArakhneHandlers()
+ */
+ public static void installArakhneHandlers() {
+ install(URLHandlerUtil.class.getPackage().getName());
+ }
+
+ /** Uninstall the URL handlers provided by Arakhnê
+ * libraries.
+ * <p>
+ * Handlers are provided for:<ul>
+ * <li><code>file</code>: handler for files which is supported input and output.</li>
+ * <li><code>resource</code>: handler for resource URL.</li>
+ * </ul>
+ *
+ * @see #installArakhneHandlers()
+ */
+ public static void uninstallArakhneHandlers() {
+ uninstall(URLHandlerUtil.class.getPackage().getName());
+ }
+
+}
+
Added: trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/file/Handler.java
===================================================================
--- trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/file/Handler.java (rev 0)
+++ trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/file/Handler.java 2010-09-06 20:18:50 UTC (rev 170)
@@ -0,0 +1,65 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2010 Alexandre WILLAUME, Stéphane GALLAND
+ *
+ * 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
+ * This program is free software; you can redistribute it and/or modify
+ */
+package org.arakhne.vmutil.file;
+
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLStreamHandler;
+
+import org.arakhne.vmutil.URISchemeType;
+
+/**
+ * The class <code>Handler</code> is supporting file protocol
+ * for URL streams. This stream protocol
+ * handler knows how to make a connection for "file" protocol.
+ * <p>
+ * In most cases, an instance of a <code>URLStreamHandler</code>
+ * subclass is not created directly by an application. Rather, the
+ * first time a protocol name is encountered when constructing a
+ * <code>URL</code>, the appropriate stream protocol handler is
+ * automatically loaded.
+ * <p>
+ * To use this factory, invoke the following code only ONCE time:
+ * <code>URL.setURLStreamHandlerFactory(new FileURLStreamHandlerFactory());</code>.
+ *
+ * @author Alexandre WILLAUME <willaume@xxxxxxxxxxx>
+ * @author Stéphane GALLAND <galland@xxxxxxxxxxx>
+ * @version $Name$ $Revision$ $Date$
+ * @mavengroupid org.arakhne.afc
+ * @mavenartifactid arakhneVmutils
+ * @see URLStreamHandler
+ * @see HandlerFactory
+ * @since 6.0
+ */
+public class Handler extends URLStreamHandler {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected URLConnection openConnection(URL url) throws IOException {
+ if (URISchemeType.FILE.isURL(url)) {
+ return new URLConnection(url);
+ }
+ throw new UnsupportedOperationException("Unsupported protocol: "+url); //$NON-NLS-1$
+ }
+
+}
Added: trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/file/HandlerFactory.java
===================================================================
--- trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/file/HandlerFactory.java (rev 0)
+++ trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/file/HandlerFactory.java 2010-09-06 20:18:50 UTC (rev 170)
@@ -0,0 +1,61 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2010 Stéphane GALLAND
+ *
+ * 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
+ * This program is free software; you can redistribute it and/or modify
+ */
+package org.arakhne.vmutil.file;
+
+import java.net.URL;
+import java.net.URLStreamHandler;
+import java.net.URLStreamHandlerFactory;
+
+import org.arakhne.vmutil.URISchemeType;
+
+/**
+ * This class defines a factory for <code>URL</code> stream
+ * "resource" and "file" protocol handlers.
+ * <p>
+ * It is used by the <code>URL</code> class to create a
+ * <code>URLStreamHandler</code> for a "resource" protocol.
+ * <p>
+ * To use this factory, invoke the following code only ONCE time:
+ * <code>URL.setURLStreamHandlerFactory(new FileResourceURLStreamHandlerFactory());</code>.
+ *
+ * @author Stéphane GALLAND <galland@xxxxxxxxxxx>
+ * @version $Name$ $Revision$ $Date$
+ * @mavengroupid org.arakhne.afc
+ * @mavenartifactid arakhneVmutils
+ * @see URLStreamHandlerFactory
+ * @see URL#setURLStreamHandlerFactory(URLStreamHandlerFactory)
+ * @since 6.0
+ */
+public class HandlerFactory
+implements URLStreamHandlerFactory {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public URLStreamHandler createURLStreamHandler(String protocol) {
+ if (URISchemeType.FILE.isScheme(protocol))
+ return new Handler();
+ // Force the default factory to retreive stream handler.
+ return null;
+ }
+
+}
Added: trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/file/URLConnection.java
===================================================================
--- trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/file/URLConnection.java (rev 0)
+++ trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/file/URLConnection.java 2010-09-06 20:18:50 UTC (rev 170)
@@ -0,0 +1,207 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2010 Alexandre WILLAUME, Stéphane GALLAND
+ *
+ * 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
+ * This program is free software; you can redistribute it and/or modify
+ */
+package org.arakhne.vmutil.file;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URL;
+import java.net.UnknownServiceException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.activation.MimetypesFileTypeMap;
+
+import org.arakhne.vmutil.FileSystem;
+
+/**
+ * The class <code>URLConnection</code> is implementing
+ * connection between an URL and a local file.
+ * Instances of this class can be used both to
+ * read from and to write to the resource referenced by the file URL.
+ * <p>
+ * Supported header fields are:
+ * <ul>
+ * <li><code>content-type</code></li>
+ * <li><code>content-length</code></li>
+ * <li><code>last-modified</code></li>
+ * </ul>
+ *
+ * @author Alexandre WILLAUME <willaume@xxxxxxxxxxx>
+ * @author Stéphane GALLAND <galland@xxxxxxxxxxx>
+ * @version $Name$ $Revision$ $Date$
+ * @mavengroupid org.arakhne.afc
+ * @mavenartifactid arakhneVmutils
+ * @see java.net.URLConnection
+ * @since 6.0
+ */
+class URLConnection extends java.net.URLConnection {
+
+ private File file = null;
+
+ private String contentType = null;
+
+ /**
+ * @param url is the "file"-protocol url to use.
+ */
+ protected URLConnection(URL url) {
+ super(url);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String getHeaderField(int n) {
+ try {
+ connect();
+ }
+ catch(IOException e) {
+ throw new IllegalStateException(e);
+ }
+ switch(n) {
+ case 0: // content-type
+ return this.contentType;
+ case 1: // content-length
+ return Long.toString(this.file.length());
+ case 2: // last-modified
+ return Long.toString(this.file.lastModified());
+ }
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String getHeaderField(String name) {
+ try {
+ connect();
+ }
+ catch(IOException e) {
+ throw new IllegalStateException(e);
+ }
+ if ("content-type".equals(name)) { //$NON-NLS-1$
+ return this.contentType;
+ }
+ if ("content-length".equals(name)) { //$NON-NLS-1$
+ return Long.toString(this.file.length());
+ }
+ if ("last-modified".equals(name)) { //$NON-NLS-1$
+ return Long.toString(this.file.lastModified());
+ }
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String getHeaderFieldKey(int n) {
+ switch(n) {
+ case 0:
+ return "content-type"; //$NON-NLS-1$
+ case 1:
+ return "content-length"; //$NON-NLS-1$
+ case 2:
+ return "last-modified"; //$NON-NLS-1$
+ }
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Map<String,List<String>> getHeaderFields() {
+ try {
+ connect();
+ }
+ catch(IOException e) {
+ throw new IllegalStateException(e);
+ }
+ Map<String, List<String>> flds = new HashMap<String, List<String>>();
+ flds.put("content-type", singletonList(this.contentType)); //$NON-NLS-1$
+ flds.put("content-length", singletonList(Long.toString(this.file.length()))); //$NON-NLS-1$
+ flds.put("last-modified", singletonList(Long.toString(this.file.lastModified()))); //$NON-NLS-1$
+ return flds;
+ }
+
+ private List<String> singletonList(String value) {
+ if (value==null) return null;
+ return Collections.singletonList(value);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void connect() throws IOException {
+ if (!this.connected) {
+ this.file = FileSystem.convertUrlToFile(this.url);
+ if (this.file==null)
+ throw new FileNotFoundException(this.url.toExternalForm());
+ this.contentType = new MimetypesFileTypeMap().getContentType(this.file);
+ this.connected = true;
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public OutputStream getOutputStream() throws IOException {
+ connect();
+ if (getDoOutput()) {
+ OutputStream os = new FileOutputStream(this.file);
+ if (getUseCaches()) {
+ os = new BufferedOutputStream(os);
+ }
+ return os;
+ }
+ throw new UnknownServiceException("URL connection cannot do output"); //$NON-NLS-1$
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public InputStream getInputStream() throws IOException {
+ connect();
+ if (getDoInput()) {
+ InputStream is = new FileInputStream(this.file);
+ if (getUseCaches()) {
+ is = new BufferedInputStream(is);
+ }
+ return is;
+ }
+ throw new UnknownServiceException("URL connection cannot do input"); //$NON-NLS-1$
+ }
+
+}
Added: trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/resource/Handler.java
===================================================================
--- trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/resource/Handler.java (rev 0)
+++ trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/resource/Handler.java 2010-09-06 20:18:50 UTC (rev 170)
@@ -0,0 +1,64 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2010 Alexandre WILLAUME, Stéphane GALLAND
+ *
+ * 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
+ * This program is free software; you can redistribute it and/or modify
+ */
+package org.arakhne.vmutil.resource;
+
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLStreamHandler;
+
+import org.arakhne.vmutil.URISchemeType;
+
+/**
+ * The class <code>Handler</code> is supporting resource protocol
+ * for URL streams. This stream protocol
+ * handler knows how to make a connection for "resource" protocol.
+ * <p>
+ * In most cases, an instance of a <code>URLStreamHandler</code>
+ * subclass is not created directly by an application. Rather, the
+ * first time a protocol name is encountered when constructing a
+ * <code>URL</code>, the appropriate stream protocol handler is
+ * automatically loaded.
+ * <p>
+ * To use this factory, invoke the following code only ONCE time:
+ * <code>URL.setURLStreamHandlerFactory(new ResourceURLStreamHandlerFactory());</code>.
+ *
+ * @author Stéphane GALLAND <galland@xxxxxxxxxxx>
+ * @version $Name$ $Revision$ $Date$
+ * @mavengroupid org.arakhne.afc
+ * @mavenartifactid arakhneVmutils
+ * @see URLStreamHandler
+ * @see HandlerFactory
+ * @since 6.0
+ */
+public class Handler extends URLStreamHandler {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected URLConnection openConnection(URL url) throws IOException {
+ if (URISchemeType.RESOURCE.isURL(url)) {
+ return new URLConnection(url);
+ }
+ throw new UnsupportedOperationException("Unsupported protocol: "+url); //$NON-NLS-1$
+ }
+
+}
Added: trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/resource/HandlerFactory.java
===================================================================
--- trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/resource/HandlerFactory.java (rev 0)
+++ trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/resource/HandlerFactory.java 2010-09-06 20:18:50 UTC (rev 170)
@@ -0,0 +1,61 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2010 Stéphane GALLAND
+ *
+ * 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
+ * This program is free software; you can redistribute it and/or modify
+ */
+package org.arakhne.vmutil.resource;
+
+import java.net.URL;
+import java.net.URLStreamHandler;
+import java.net.URLStreamHandlerFactory;
+
+import org.arakhne.vmutil.URISchemeType;
+
+/**
+ * This class defines a factory for <code>URL</code> stream
+ * "resource" protocol handlers.
+ * <p>
+ * It is used by the <code>URL</code> class to create a
+ * <code>URLStreamHandler</code> for a "resource" protocol.
+ * <p>
+ * To use this factory, invoke the following code only ONCE time:
+ * <code>URL.setURLStreamHandlerFactory(new ResourceURLStreamHandlerFactory());</code>.
+ *
+ * @author Stéphane GALLAND <galland@xxxxxxxxxxx>
+ * @version $Name$ $Revision$ $Date$
+ * @mavengroupid org.arakhne.afc
+ * @mavenartifactid arakhneVmutils
+ * @see URLStreamHandlerFactory
+ * @see URL#setURLStreamHandlerFactory(URLStreamHandlerFactory)
+ * @since 6.0
+ */
+public class HandlerFactory
+implements URLStreamHandlerFactory {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public URLStreamHandler createURLStreamHandler(String protocol) {
+ if (URISchemeType.RESOURCE.isScheme(protocol))
+ return new Handler();
+ // Force the default factory to retreive stream handler.
+ return null;
+ }
+
+}
Added: trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/resource/URLConnection.java
===================================================================
--- trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/resource/URLConnection.java (rev 0)
+++ trunk/arakhneVmutils/java/src/main/java/org/arakhne/vmutil/resource/URLConnection.java 2010-09-06 20:18:50 UTC (rev 170)
@@ -0,0 +1,159 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2010 Alexandre WILLAUME, Stéphane GALLAND
+ *
+ * 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
+ * This program is free software; you can redistribute it and/or modify
+ */
+package org.arakhne.vmutil.resource;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URL;
+import java.util.List;
+import java.util.Map;
+
+import org.arakhne.vmutil.ResourceNotFoundException;
+import org.arakhne.vmutil.Resources;
+
+/**
+ * The class <code>URLConnection</code> is implementing
+ * connection between an URL and a Java resource.
+ * Instances of this class can be used to
+ * read from the resource referenced by the resource URL. Write
+ * is allowed depending on where resource is located.
+ * <p>
+ * Supported header fields are the same as the real resource URL
+ * (basicaly, file or jar protocols).
+ *
+ * @author Stéphane GALLAND <galland@xxxxxxxxxxx>
+ * @version $Name$ $Revision$ $Date$
+ * @mavengroupid org.arakhne.afc
+ * @mavenartifactid arakhneVmutils
+ * @see URLConnection
+ * @since 6.0
+ */
+class URLConnection extends java.net.URLConnection {
+
+ private URL location = null;
+ private java.net.URLConnection connection = null;
+
+ /**
+ * @param url is the "file"-protocol url to use.
+ */
+ protected URLConnection(URL url) {
+ super(url);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String getHeaderField(int n) {
+ try {
+ connect();
+ }
+ catch(IOException e) {
+ throw new IllegalStateException(e);
+ }
+ return this.connection.getHeaderField(n);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String getHeaderField(String name) {
+ try {
+ connect();
+ }
+ catch(IOException e) {
+ throw new IllegalStateException(e);
+ }
+ return this.connection.getHeaderField(name);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String getHeaderFieldKey(int n) {
+ try {
+ connect();
+ }
+ catch(IOException e) {
+ throw new IllegalStateException(e);
+ }
+ return this.connection.getHeaderFieldKey(n);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Map<String,List<String>> getHeaderFields() {
+ try {
+ connect();
+ }
+ catch(IOException e) {
+ throw new IllegalStateException(e);
+ }
+ return this.connection.getHeaderFields();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void connect() throws IOException {
+ if (!this.connected) {
+ this.location = Resources.getResource(this.url.getFile());
+ if (this.location==null)
+ throw new ResourceNotFoundException(this.url.toExternalForm());
+ this.connection = this.location.openConnection();
+ if (this.connection==null)
+ throw new ResourceNotFoundException(this.url.toExternalForm());
+ this.connection.setDoInput(getDoInput());
+ this.connection.setDoOutput(getDoOutput());
+ this.connection.setAllowUserInteraction(getAllowUserInteraction());
+ this.connection.setConnectTimeout(getConnectTimeout());
+ this.connection.setDefaultUseCaches(getDefaultUseCaches());
+ this.connection.setReadTimeout(getReadTimeout());
+ this.connection.setIfModifiedSince(getIfModifiedSince());
+ this.connected = true;
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public OutputStream getOutputStream() throws IOException {
+ connect();
+ return this.connection.getOutputStream();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public InputStream getInputStream() throws IOException {
+ connect();
+ return this.connection.getInputStream();
+ }
+
+}
Deleted: trunk/arakhneVmutils/java/src/test/java/org/arakhne/vmutil/FileResourceURLStreamHandlerFactoryStub.java
===================================================================
--- trunk/arakhneVmutils/java/src/test/java/org/arakhne/vmutil/FileResourceURLStreamHandlerFactoryStub.java 2010-08-03 17:18:39 UTC (rev 169)
+++ trunk/arakhneVmutils/java/src/test/java/org/arakhne/vmutil/FileResourceURLStreamHandlerFactoryStub.java 2010-09-06 20:18:50 UTC (rev 170)
@@ -1,67 +0,0 @@
-/*
- * $Id$
- *
- * Copyright (C) 2010 Stéphane GALLAND
- *
- * 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
- * This program is free software; you can redistribute it and/or modify
- */
-package org.arakhne.vmutil;
-
-import java.net.URLStreamHandler;
-
-/**
- * @author Stéphane GALLAND <galland@xxxxxxxxxxx>
- * @version $Name$ $Revision$ $Date$
- * @mavengroupid org.arakhne.afc
- * @mavenartifactid arakhneVmutils
- */
-class FileResourceURLStreamHandlerFactoryStub
-extends FileResourceURLStreamHandlerFactory {
-
- /** Singleton.
- */
- public static final FileResourceURLStreamHandlerFactoryStub SINGLETON = new FileResourceURLStreamHandlerFactoryStub();
-
- private volatile boolean used = false;
-
- /**
- */
- private FileResourceURLStreamHandlerFactoryStub() {
- //
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public URLStreamHandler createURLStreamHandler(String protocol) {
- if (this.used) return super.createURLStreamHandler(protocol);
- return null;
- }
-
- /** Enable this factory.
- */
- public void enable() {
- this.used = true;
- }
-
- /** Disable this factory.
- */
- public void disable() {
- this.used = false;
- }
-
-}
Modified: trunk/arakhneVmutils/java/src/test/java/org/arakhne/vmutil/FileSystemTest.java
===================================================================
--- trunk/arakhneVmutils/java/src/test/java/org/arakhne/vmutil/FileSystemTest.java 2010-08-03 17:18:39 UTC (rev 169)
+++ trunk/arakhneVmutils/java/src/test/java/org/arakhne/vmutil/FileSystemTest.java 2010-09-06 20:18:50 UTC (rev 170)
@@ -94,7 +94,7 @@
@Override
public void setUp() throws Exception {
super.setUp();
- FileResourceURLStreamHandlerFactoryStub.SINGLETON.disable();
+ URLHandlerUtil.installArakhneHandlers();
// Disable native library loading during unit tests
this.oldLibraryLoaderState = LibraryLoader.isEnable();
LibraryLoader.setEnable(false);
@@ -106,8 +106,8 @@
@Override
public void tearDown() throws Exception {
// Restore library loading state
- FileResourceURLStreamHandlerFactoryStub.SINGLETON.disable();
LibraryLoader.setEnable(this.oldLibraryLoaderState);
+ URLHandlerUtil.uninstallArakhneHandlers();
super.tearDown();
}
Deleted: trunk/arakhneVmutils/java/src/test/java/org/arakhne/vmutil/FileURLConnectionTest.java
===================================================================
--- trunk/arakhneVmutils/java/src/test/java/org/arakhne/vmutil/FileURLConnectionTest.java 2010-08-03 17:18:39 UTC (rev 169)
+++ trunk/arakhneVmutils/java/src/test/java/org/arakhne/vmutil/FileURLConnectionTest.java 2010-09-06 20:18:50 UTC (rev 170)
@@ -1,153 +0,0 @@
-/*
- * $Id$
- *
- * Copyright (C) 2010 Stéphane GALLAND
- *
- * 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
- * This program is free software; you can redistribute it and/or modify
- */
-package org.arakhne.vmutil;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.Collections;
-import java.util.Map;
-
-import junit.framework.TestCase;
-
-/**
- * @author Stéphane GALLAND <galland@xxxxxxxxxxx>
- * @version $Name$ $Revision$ $Date$
- * @mavengroupid org.arakhne.afc
- * @mavenartifactid arakhneVmutils
- */
-public class FileURLConnectionTest extends TestCase {
-
- private FileURLConnection connection;
-
- static {
- try {
- URL.setURLStreamHandlerFactory(FileResourceURLStreamHandlerFactoryStub.SINGLETON);
- }
- catch(Error _) {
- // Duplicate registration of the factory.
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setUp() throws Exception {
- super.setUp();
- FileResourceURLStreamHandlerFactoryStub.SINGLETON.enable();
- URL resourceUrl = Resources.getResource("org/arakhne/vmutil/test.txt"); //$NON-NLS-1$
- assertNotNull(resourceUrl);
- this.connection = new FileURLConnection(resourceUrl);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void tearDown() throws Exception {
- this.connection = null;
- FileResourceURLStreamHandlerFactoryStub.SINGLETON.disable();
- super.tearDown();
- }
-
- /**
- */
- public void testGetHeaderFieldKeyInt() {
- assertEquals("content-type", this.connection.getHeaderFieldKey(0)); //$NON-NLS-1$
- assertEquals("content-length", this.connection.getHeaderFieldKey(1)); //$NON-NLS-1$
- assertEquals("last-modified", this.connection.getHeaderFieldKey(2)); //$NON-NLS-1$
- assertNull(this.connection.getHeaderFieldKey(3));
- }
-
- /**
- */
- public void testGetHeaderFieldInt() {
- assertEquals("text/plain", this.connection.getHeaderField(0)); //$NON-NLS-1$
- assertEquals("19", this.connection.getHeaderField(1)); //$NON-NLS-1$
- assertNotNull(this.connection.getHeaderField(2));
- assertNull(this.connection.getHeaderField(3));
- }
-
- /**
- */
- public void testGetHeaderFieldString() {
- assertEquals("text/plain", this.connection.getHeaderField("content-type")); //$NON-NLS-1$ //$NON-NLS-2$
- assertEquals("19", this.connection.getHeaderField("content-length")); //$NON-NLS-1$ //$NON-NLS-2$
- assertNotNull(this.connection.getHeaderField("last-modified")); //$NON-NLS-1$
- assertNull(this.connection.getHeaderField("expires")); //$NON-NLS-1$
- }
-
- /**
- */
- public void testGetHeaderFields() {
- Map<?,?> map = this.connection.getHeaderFields();
- assertNotNull(map);
- assertEquals(3, map.size());
- assertEquals(Collections.singletonList("text/plain"), map.get("content-type")); //$NON-NLS-1$ //$NON-NLS-2$
- assertEquals(Collections.singletonList("19"), map.get("content-length")); //$NON-NLS-1$ //$NON-NLS-2$
- assertNotNull(map.get("last-modified")); //$NON-NLS-1$
- assertNull(map.get("expires")); //$NON-NLS-1$
- }
-
- /**
- * @throws IOException
- */
- public void testGetInputStream() throws IOException {
- InputStream is = this.connection.getInputStream();
- BufferedReader br = new BufferedReader(new InputStreamReader(is));
- String line = br.readLine();
- br.close();
- assertEquals("FOR UNIT TEST ONLY ", line); //$NON-NLS-1$
- }
-
- /**
- * @throws IOException
- */
- public void testGetOutputStream() throws IOException {
- File tmpFile = File.createTempFile("unittest", ".txt"); //$NON-NLS-1$ //$NON-NLS-2$
- tmpFile.deleteOnExit();
-
- URLConnection con = new FileURLConnection(tmpFile.toURI().toURL());
- con.setDoOutput(true);
-
- OutputStream os = con.getOutputStream();
- BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
- bw.write("HELLO WORLD!"); //$NON-NLS-1$
- bw.close();
-
- assertEquals(12, tmpFile.length());
-
- BufferedReader br = new BufferedReader(new FileReader(tmpFile));
- String line = br.readLine();
- br.close();
- assertEquals("HELLO WORLD!", line); //$NON-NLS-1$
- }
-
-}
Deleted: trunk/arakhneVmutils/java/src/test/java/org/arakhne/vmutil/ResourceURLConnectionTest.java
===================================================================
--- trunk/arakhneVmutils/java/src/test/java/org/arakhne/vmutil/ResourceURLConnectionTest.java 2010-08-03 17:18:39 UTC (rev 169)
+++ trunk/arakhneVmutils/java/src/test/java/org/arakhne/vmutil/ResourceURLConnectionTest.java 2010-09-06 20:18:50 UTC (rev 170)
@@ -1,83 +0,0 @@
-/*
- * $Id$
- *
- * Copyright (C) 2010 Stéphane GALLAND
- *
- * 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
- * This program is free software; you can redistribute it and/or modify
- */
-package org.arakhne.vmutil;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
-
-import junit.framework.TestCase;
-
-/**
- * @author Stéphane GALLAND <galland@xxxxxxxxxxx>
- * @version $Name$ $Revision$ $Date$
- * @mavengroupid org.arakhne.afc
- * @mavenartifactid arakhneVmutils
- */
-public class ResourceURLConnectionTest extends TestCase {
-
- private ResourceURLConnection connection;
-
- static {
- try {
- URL.setURLStreamHandlerFactory(FileResourceURLStreamHandlerFactoryStub.SINGLETON);
- }
- catch(Error _) {
- // Duplicate registration of the factory.
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setUp() throws Exception {
- super.setUp();
- FileResourceURLStreamHandlerFactoryStub.SINGLETON.enable();
- URL resourceUrl = new URL("resource:org/arakhne/vmutil/test.txt"); //$NON-NLS-1$
- assertNotNull(resourceUrl);
- this.connection = new ResourceURLConnection(resourceUrl);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void tearDown() throws Exception {
- this.connection = null;
- FileResourceURLStreamHandlerFactoryStub.SINGLETON.disable();
- super.tearDown();
- }
-
- /**
- * @throws IOException
- */
- public void testGetInputStream() throws IOException {
- InputStream is = this.connection.getInputStream();
- BufferedReader br = new BufferedReader(new InputStreamReader(is));
- String line = br.readLine();
- br.close();
- assertEquals("FOR UNIT TEST ONLY ", line); //$NON-NLS-1$
- }
-
-}
Copied: trunk/arakhneVmutils/java/src/test/java/org/arakhne/vmutil/file/URLConnectionTest.java (from rev 165, trunk/arakhneVmutils/java/src/test/java/org/arakhne/vmutil/FileURLConnectionTest.java)
===================================================================
--- trunk/arakhneVmutils/java/src/test/java/org/arakhne/vmutil/file/URLConnectionTest.java (rev 0)
+++ trunk/arakhneVmutils/java/src/test/java/org/arakhne/vmutil/file/URLConnectionTest.java 2010-09-06 20:18:50 UTC (rev 170)
@@ -0,0 +1,146 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2010 Stéphane GALLAND
+ *
+ * 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
+ * This program is free software; you can redistribute it and/or modify
+ */
+package org.arakhne.vmutil.file;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.net.URL;
+import java.util.Collections;
+import java.util.Map;
+
+import org.arakhne.vmutil.Resources;
+import org.arakhne.vmutil.URLHandlerUtil;
+
+import junit.framework.TestCase;
+
+/**
+ * @author Stéphane GALLAND <galland@xxxxxxxxxxx>
+ * @version $Name$ $Revision$ $Date$
+ * @mavengroupid org.arakhne.afc
+ * @mavenartifactid arakhneVmutils
+ */
+public class URLConnectionTest extends TestCase {
+
+ private URLConnection connection;
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ URLHandlerUtil.installArakhneHandlers();
+ URL resourceUrl = Resources.getResource("org/arakhne/vmutil/test.txt"); //$NON-NLS-1$
+ assertNotNull(resourceUrl);
+ this.connection = new URLConnection(resourceUrl);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void tearDown() throws Exception {
+ this.connection = null;
+ URLHandlerUtil.uninstallArakhneHandlers();
+ super.tearDown();
+ }
+
+ /**
+ */
+ public void testGetHeaderFieldKeyInt() {
+ assertEquals("content-type", this.connection.getHeaderFieldKey(0)); //$NON-NLS-1$
+ assertEquals("content-length", this.connection.getHeaderFieldKey(1)); //$NON-NLS-1$
+ assertEquals("last-modified", this.connection.getHeaderFieldKey(2)); //$NON-NLS-1$
+ assertNull(this.connection.getHeaderFieldKey(3));
+ }
+
+ /**
+ */
+ public void testGetHeaderFieldInt() {
+ assertEquals("text/plain", this.connection.getHeaderField(0)); //$NON-NLS-1$
+ assertEquals("19", this.connection.getHeaderField(1)); //$NON-NLS-1$
+ assertNotNull(this.connection.getHeaderField(2));
+ assertNull(this.connection.getHeaderField(3));
+ }
+
+ /**
+ */
+ public void testGetHeaderFieldString() {
+ assertEquals("text/plain", this.connection.getHeaderField("content-type")); //$NON-NLS-1$ //$NON-NLS-2$
+ assertEquals("19", this.connection.getHeaderField("content-length")); //$NON-NLS-1$ //$NON-NLS-2$
+ assertNotNull(this.connection.getHeaderField("last-modified")); //$NON-NLS-1$
+ assertNull(this.connection.getHeaderField("expires")); //$NON-NLS-1$
+ }
+
+ /**
+ */
+ public void testGetHeaderFields() {
+ Map<?,?> map = this.connection.getHeaderFields();
+ assertNotNull(map);
+ assertEquals(3, map.size());
+ assertEquals(Collections.singletonList("text/plain"), map.get("content-type")); //$NON-NLS-1$ //$NON-NLS-2$
+ assertEquals(Collections.singletonList("19"), map.get("content-length")); //$NON-NLS-1$ //$NON-NLS-2$
+ assertNotNull(map.get("last-modified")); //$NON-NLS-1$
+ assertNull(map.get("expires")); //$NON-NLS-1$
+ }
+
+ /**
+ * @throws IOException
+ */
+ public void testGetInputStream() throws IOException {
+ InputStream is = this.connection.getInputStream();
+ BufferedReader br = new BufferedReader(new InputStreamReader(is));
+ String line = br.readLine();
+ br.close();
+ assertEquals("FOR UNIT TEST ONLY ", line); //$NON-NLS-1$
+ }
+
+ /**
+ * @throws IOException
+ */
+ public void testGetOutputStream() throws IOException {
+ File tmpFile = File.createTempFile("unittest", ".txt"); //$NON-NLS-1$ //$NON-NLS-2$
+ tmpFile.deleteOnExit();
+
+ URLConnection con = new URLConnection(tmpFile.toURI().toURL());
+ con.setDoOutput(true);
+
+ OutputStream os = con.getOutputStream();
+ BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
+ bw.write("HELLO WORLD!"); //$NON-NLS-1$
+ bw.close();
+
+ assertEquals(12, tmpFile.length());
+
+ BufferedReader br = new BufferedReader(new FileReader(tmpFile));
+ String line = br.readLine();
+ br.close();
+ assertEquals("HELLO WORLD!", line); //$NON-NLS-1$
+ }
+
+}
Copied: trunk/arakhneVmutils/java/src/test/java/org/arakhne/vmutil/resource/URLConnectionTest.java (from rev 165, trunk/arakhneVmutils/java/src/test/java/org/arakhne/vmutil/ResourceURLConnectionTest.java)
===================================================================
--- trunk/arakhneVmutils/java/src/test/java/org/arakhne/vmutil/resource/URLConnectionTest.java (rev 0)
+++ trunk/arakhneVmutils/java/src/test/java/org/arakhne/vmutil/resource/URLConnectionTest.java 2010-09-06 20:18:50 UTC (rev 170)
@@ -0,0 +1,76 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2010 Stéphane GALLAND
+ *
+ * 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
+ * This program is free software; you can redistribute it and/or modify
+ */
+package org.arakhne.vmutil.resource;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+
+import org.arakhne.vmutil.URLHandlerUtil;
+
+import junit.framework.TestCase;
+
+/**
+ * @author Stéphane GALLAND <galland@xxxxxxxxxxx>
+ * @version $Name$ $Revision$ $Date$
+ * @mavengroupid org.arakhne.afc
+ * @mavenartifactid arakhneVmutils
+ */
+public class URLConnectionTest extends TestCase {
+
+ private URLConnection connection;
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ URLHandlerUtil.installArakhneHandlers();
+ URL resourceUrl = new URL("resource:org/arakhne/vmutil/test.txt"); //$NON-NLS-1$
+ assertNotNull(resourceUrl);
+ this.connection = new URLConnection(resourceUrl);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void tearDown() throws Exception {
+ this.connection = null;
+ URLHandlerUtil.uninstallArakhneHandlers();
+ super.tearDown();
+ }
+
+ /**
+ * @throws IOException
+ */
+ public void testGetInputStream() throws IOException {
+ InputStream is = this.connection.getInputStream();
+ BufferedReader br = new BufferedReader(new InputStreamReader(is));
+ String line = br.readLine();
+ br.close();
+ assertEquals("FOR UNIT TEST ONLY ", line); //$NON-NLS-1$
+ }
+
+}