[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&eacute;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&eacute;phane GALLAND &lt;galland@xxxxxxxxxxx&gt;
- * @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&eacute;phane GALLAND &lt;galland@xxxxxxxxxxx&gt;
-     * @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&eacute;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&eacute;phane GALLAND &lt;galland@xxxxxxxxxxx&gt;
- * @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&eacute;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&eacute;phane GALLAND &lt;galland@xxxxxxxxxxx&gt;
- * @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&eacute;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 &lt;willaume@xxxxxxxxxxx&gt;
- * @author St&eacute;phane GALLAND &lt;galland@xxxxxxxxxxx&gt;
- * @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&eacute;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 &lt;willaume@xxxxxxxxxxx&gt;
- * @author St&eacute;phane GALLAND &lt;galland@xxxxxxxxxxx&gt;
- * @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&eacute;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 &lt;willaume@xxxxxxxxxxx&gt;
- * @author St&eacute;phane GALLAND &lt;galland@xxxxxxxxxxx&gt;
- * @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&eacute;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&eacute;phane GALLAND &lt;galland@xxxxxxxxxxx&gt;
- * @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&eacute;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&eacute;phane GALLAND &lt;galland@xxxxxxxxxxx&gt;
- * @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&eacute;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&eacute;phane GALLAND &lt;galland@xxxxxxxxxxx&gt;
- * @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&eacute;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&eacute;phane GALLAND &lt;galland@xxxxxxxxxxx&gt;
+ * @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&ecirc;
+	 * 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&ecirc;
+	 * 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&eacute;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 &lt;willaume@xxxxxxxxxxx&gt;
+ * @author St&eacute;phane GALLAND &lt;galland@xxxxxxxxxxx&gt;
+ * @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&eacute;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&eacute;phane GALLAND &lt;galland@xxxxxxxxxxx&gt;
+ * @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&eacute;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 &lt;willaume@xxxxxxxxxxx&gt;
+ * @author St&eacute;phane GALLAND &lt;galland@xxxxxxxxxxx&gt;
+ * @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&eacute;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&eacute;phane GALLAND &lt;galland@xxxxxxxxxxx&gt;
+ * @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&eacute;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&eacute;phane GALLAND &lt;galland@xxxxxxxxxxx&gt;
+ * @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&eacute;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&eacute;phane GALLAND &lt;galland@xxxxxxxxxxx&gt;
+ * @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&eacute;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&eacute;phane GALLAND &lt;galland@xxxxxxxxxxx&gt;
- * @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&eacute;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&eacute;phane GALLAND &lt;galland@xxxxxxxxxxx&gt;
- * @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&eacute;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&eacute;phane GALLAND &lt;galland@xxxxxxxxxxx&gt;
- * @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&eacute;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&eacute;phane GALLAND &lt;galland@xxxxxxxxxxx&gt;
+ * @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&eacute;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&eacute;phane GALLAND &lt;galland@xxxxxxxxxxx&gt;
+ * @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$
+    }
+
+}


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/