Author: desruisseaux
Date: Wed May 29 19:41:45 2013
New Revision: 1487611
URL: http://svn.apache.org/r1487611
Log:
Ported IOUtilities internal methods.
Added:
sis/branches/JDK7/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/IOUtilities.java
(with props)
sis/branches/JDK7/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/IOUtilitiesTest.java
(with props)
Modified:
sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/util/Exceptions.java
sis/branches/JDK7/storage/sis-storage/src/test/java/org/apache/sis/test/suite/StorageTestSuite.java
Modified:
sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/util/Exceptions.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/util/Exceptions.java?rev=1487611&r1=1487610&r2=1487611&view=diff
==============================================================================
---
sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/util/Exceptions.java
[UTF-8] (original)
+++
sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/util/Exceptions.java
[UTF-8] Wed May 29 19:41:45 2013
@@ -110,7 +110,7 @@ public final class Exceptions extends St
* {@linkplain Throwable#getLocalizedMessage() localized message} of the
given exception
* on the next line. If the exception has a {@linkplain
Throwable#getCause() causes}, then
* the localized message of the cause is formatted on the next line and
the process is
- * repeated for the whole cause chain.
+ * repeated for the whole cause chain, omitting duplicated messages.
*
* <p>{@link SQLException} is handled especially in order to process the
* {@linkplain SQLException#getNextException() next exception} instead
than the cause.</p>
Added:
sis/branches/JDK7/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/IOUtilities.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK7/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/IOUtilities.java?rev=1487611&view=auto
==============================================================================
---
sis/branches/JDK7/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/IOUtilities.java
(added)
+++
sis/branches/JDK7/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/IOUtilities.java
[UTF-8] Wed May 29 19:41:45 2013
@@ -0,0 +1,404 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sis.internal.storage;
+
+import java.util.Locale;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URL;
+import java.net.URLDecoder;
+import java.net.URISyntaxException;
+import java.net.MalformedURLException;
+import java.nio.file.Path;
+import java.nio.file.Files;
+import java.nio.channels.Channels;
+import java.nio.channels.ReadableByteChannel;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.FileSystemNotFoundException;
+import java.nio.file.Paths;
+import org.apache.sis.util.CharSequences;
+import org.apache.sis.util.Exceptions;
+import org.apache.sis.util.Static;
+import org.apache.sis.util.resources.Errors;
+
+
+/**
+ * Utility methods related to I/O operations. Many methods in this class
accept arbitrary {@link Object} argument
+ * and perform a sequence of {@code instanceof} checks. Since this approach
provides no type safety and since the
+ * sequence of {@code instanceof} checks is somewhat arbitrary, those methods
can not be in public API.
+ *
+ * <p>Unless otherwise specified, giving an instance of unknown type or a
{@code null} value cause the methods to
+ * return {@code null}. No exception is thrown for unknown type - callers must
check that the return value is not
+ * null. However exceptions may be thrown for malformed URI or URL.</p>
+ *
+ * @author Martin Desruisseaux (Geomatys)
+ * @author Johann Sorel (Geomatys)
+ * @since 0.3 (derived from geotk-3.00)
+ * @version 0.3
+ * @module
+ */
+public final class IOUtilities extends Static {
+ /**
+ * Do not allow instantiation of this class.
+ */
+ private IOUtilities() {
+ }
+
+ /**
+ * Returns the filename from a {@link Path}, {@link File}, {@link URL},
{@link URI} or {@link CharSequence}
+ * instance. If the given argument is specialized type like {@code Path}
or {@code File}, then this method uses
+ * dedicated API like {@link Path#getFileName()}. Otherwise this method
gets a string representation of the path
+ * and returns the part after the last {@code '/'} or platform-dependent
name separator character, if any.
+ *
+ * @param path The path as an instance of one of the above-cited types,
or {@code null}.
+ * @return The filename in the given path, or {@code null} if the given
object is null or of unknown type.
+ */
+ public static String filename(final Object path) {
+ return part(path, false);
+ }
+
+ /**
+ * Returns the filename extension from a {@link Path}, {@link File},
{@link URL}, {@link URI} or
+ * {@link CharSequence} instance. If no extension is found, returns an
empty string. If the given
+ * object is of unknown type, return {@code null}.
+ *
+ * @param path The path as an instance of one of the above-cited types,
or {@code null}.
+ * @return The extension in the given path, or an empty string if none, or
{@code null}
+ * if the given object is null or of unknown type.
+ */
+ public static String extension(final Object path) {
+ return part(path, true);
+ }
+
+ /**
+ * Implementation of {@link #filename(Object)} and {@link
#extension(Object)} methods.
+ */
+ private static String part(final Object path, final boolean extension) {
+ int fromIndex = 0;
+ final String name;
+ if (path instanceof File) {
+ name = ((File) path).getName();
+ } else if (path instanceof Path) {
+ name = ((Path) path).getFileName().toString();
+ } else {
+ char separator = '/';
+ if (path instanceof URL) {
+ name = ((URL) path).getPath();
+ } else if (path instanceof URI) {
+ name = ((URI) path).getPath();
+ } else if (path instanceof CharSequence) {
+ name = path.toString();
+ separator = File.separatorChar;
+ } else {
+ return null;
+ }
+ fromIndex = name.lastIndexOf('/') + 1;
+ if (separator != '/') {
+ // Search for platform-specific character only if the object
is neither a URL or a URI.
+ fromIndex = Math.max(fromIndex,
CharSequences.lastIndexOf(name, separator, fromIndex, name.length()) + 1);
+ }
+ }
+ if (extension) {
+ fromIndex = CharSequences.lastIndexOf(name, '.', fromIndex,
name.length()) + 1;
+ if (fromIndex <= 1) { // If the dot is the first character, do not
consider as a filename extension.
+ return "";
+ }
+ }
+ return name.substring(fromIndex);
+ }
+
+ /**
+ * Encodes the characters that are not legal for the {@link
URI#URI(String)} constructor.
+ * Note that in addition to unreserved characters ("{@code _-!.~'()*}"),
the reserved
+ * characters ("{@code ?/[]@}") and the punctuation characters ("{@code
,;:$&+=}")
+ * are left unchanged, so they will be processed with their special
meaning by the
+ * URI constructor.
+ *
+ * <p>The current implementations replaces only the space characters,
control characters
+ * and the {@code %} character. Future versions may replace more
characters as we learn
+ * from experience.</p>
+ *
+ * @param path The path to encode, or {@code null}.
+ * @return The encoded path, or {@code null} if and only if the given path
was null.
+ */
+ public static String encodeURI(final String path) {
+ if (path == null) {
+ return null;
+ }
+ StringBuilder buffer = null;
+ final int length = path.length();
+ for (int i=0; i<length;) {
+ final int c = path.codePointAt(i);
+ final int n = Character.charCount(c);
+ if (!Character.isSpaceChar(c) && !Character.isISOControl(c) && c
!= '%') {
+ /*
+ * The character is valid, or is punction character, or is a
reserved character.
+ * All those characters should be handled properly by the
URI(String) constructor.
+ */
+ if (buffer != null) {
+ buffer.appendCodePoint(c);
+ }
+ } else {
+ /*
+ * The character is invalid, so we need to escape it. Note
that the encoding
+ * is fixed to UTF-8 as of java.net.URI specification (see its
class javadoc).
+ */
+ if (buffer == null) {
+ buffer = new StringBuilder(path);
+ buffer.setLength(i);
+ }
+ for (final byte b : path.substring(i,
i+n).getBytes(StandardCharsets.UTF_8)) {
+ buffer.append('%');
+ final String hex = Integer.toHexString(b &
0xFF).toUpperCase(Locale.ROOT);
+ if (hex.length() < 2) {
+ buffer.append('0');
+ }
+ buffer.append(hex);
+ }
+ }
+ i += n;
+ }
+ return (buffer != null) ? buffer.toString() : path;
+ }
+
+ /**
+ * Converts a {@link URL} to a {@link URI}. This is equivalent to a call
to the standard {@link URL#toURI()}
+ * method, except for the following functionalities:
+ *
+ * <ul>
+ * <li>Optionally decodes the {@code "%XX"} sequences, where {@code
"XX"} is a number.</li>
+ * <li>Converts various exceptions into subclasses of {@link
IOException}.</li>
+ * </ul>
+ *
+ * @param url The URL to convert, or {@code null}.
+ * @param encoding If the URL is encoded in a {@code
application/x-www-form-urlencoded}
+ * MIME format, the character encoding (normally {@code "UTF-8"}).
If the URL is
+ * not encoded, then {@code null}.
+ * @return The URI for the given URL, or {@code null} if the given URL was
null.
+ * @throws IOException if the URL can not be converted to a URI.
+ *
+ * @see URI#URI(String)
+ */
+ public static URI toURI(final URL url, final String encoding) throws
IOException {
+ if (url == null) {
+ return null;
+ }
+ /*
+ * Convert the URL to an URI, taking in account the encoding if any.
+ *
+ * Note: URL.toURI() is implemented as new URI(URL.toString()) where
toString()
+ * delegates to toExternalForm(), and all those methods are final. So
we really
+ * don't lost anything by doing those steps ourself.
+ */
+ String path = url.toExternalForm();
+ if (encoding != null) {
+ path = URLDecoder.decode(path, encoding);
+ }
+ path = encodeURI(path);
+ try {
+ return new URI(path);
+ } catch (URISyntaxException cause) {
+ /*
+ * Occurs only if the URL is not compliant with RFC 2396.
Otherwise every URL
+ * should succeed, so a failure can actually be considered as a
malformed URL.
+ */
+ final MalformedURLException e = new
MalformedURLException(Exceptions.formatChainedMessages(
+ null, Errors.format(Errors.Keys.IllegalArgumentValue_2,
"URL", path), cause));
+ e.initCause(cause);
+ throw e;
+ }
+ }
+
+ /**
+ * Converts a {@link URL} to a {@link File}. This is equivalent to a call
to the standard
+ * {@link URL#toURI()} method followed by a call to the {@link
File#File(URI)} constructor,
+ * except for the following functionalities:
+ *
+ * <ul>
+ * <li>Optionally decodes the {@code "%XX"} sequences, where {@code
"XX"} is a number.</li>
+ * <li>Converts various exceptions into subclasses of {@link
IOException}.</li>
+ * </ul>
+ *
+ * @param url The URL to convert, or {@code null}.
+ * @param encoding If the URL is encoded in a {@code
application/x-www-form-urlencoded}
+ * MIME format, the character encoding (normally {@code "UTF-8"}).
If the URL is
+ * not encoded, then {@code null}.
+ * @return The file for the given URL, or {@code null} if the given URL
was null.
+ * @throws IOException if the URL can not be converted to a file.
+ *
+ * @see File#File(URI)
+ */
+ public static File toFile(final URL url, final String encoding) throws
IOException {
+ if (url == null) {
+ return null;
+ }
+ final URI uri = toURI(url, encoding);
+ /*
+ * We really want to call the File constructor expecting a URI
argument,
+ * not the constructor expecting a String argument, because the one for
+ * the URI argument performs additional platform-specific parsing.
+ */
+ try {
+ return new File(uri);
+ } catch (IllegalArgumentException cause) {
+ /*
+ * Typically happen when the URI contains fragment that can not be
represented
+ * in a File (e.g. a Query part), so it could be considered as if
the URI with
+ * the fragment part can not represent an existing file.
+ */
+ final MalformedURLException e = new
MalformedURLException(Exceptions.formatChainedMessages(
+ null, Errors.format(Errors.Keys.IllegalArgumentValue_2,
"URL", url), cause));
+ e.initCause(cause);
+ throw e;
+ }
+ }
+
+ /**
+ * Converts a {@link URL} to a {@link Path}. This is equivalent to a call
to the standard
+ * {@link URL#toURI()} method followed by a call to the {@link
Paths#get(URI)} static method,
+ * except for the following functionalities:
+ *
+ * <ul>
+ * <li>Optionally decodes the {@code "%XX"} sequences, where {@code
"XX"} is a number.</li>
+ * <li>Converts various exceptions into subclasses of {@link
IOException}.</li>
+ * </ul>
+ *
+ * @param url The URL to convert, or {@code null}.
+ * @param encoding If the URL is encoded in a {@code
application/x-www-form-urlencoded}
+ * MIME format, the character encoding (normally {@code "UTF-8"}).
If the URL is
+ * not encoded, then {@code null}.
+ * @return The path for the given URL, or {@code null} if the given URL
was null.
+ * @throws IOException if the URL can not be converted to a path.
+ *
+ * @see Paths#get(URI)
+ */
+ public static Path toPath(final URL url, final String encoding) throws
IOException {
+ if (url == null) {
+ return null;
+ }
+ final URI uri = toURI(url, encoding);
+ try {
+ return Paths.get(uri);
+ } catch (IllegalArgumentException | FileSystemNotFoundException cause)
{
+ final MalformedURLException e = new
MalformedURLException(Exceptions.formatChainedMessages(
+ null, Errors.format(Errors.Keys.IllegalArgumentValue_2,
"URL", url), cause));
+ e.initCause(cause);
+ throw e;
+ }
+ }
+
+ /**
+ * Parses the following path as a {@link File} if possible, or a {@link
URL} otherwise.
+ * In the special case where the given {@code path} is a URL using the
{@code "file"} protocol,
+ * the URL is converted to a {@link File} object using the given {@code
encoding} for decoding
+ * the {@code "%XX"} sequences, if any.
+ *
+ * {@section Rational}
+ * A URL can represent a file, but {@link URL#openStream()} appears to
return a {@code BufferedInputStream}
+ * wrapping the {@link FileInputStream}, which is not a desirable feature
when we want to obtain a channel.
+ *
+ * <p>There is no {@code toPathOrURL} methods because {@link Path} can be
associated to various file systems.
+ * It would be possible (not necessarily desirable, but at least doable)
do create {@code Path} for HTTP or
+ * FTP protocols.</p>
+ *
+ * @param path The path to convert, or {@code null}.
+ * @param encoding If the URL is encoded in a {@code
application/x-www-form-urlencoded}
+ * MIME format, the character encoding (normally {@code "UTF-8"}).
If the URL is
+ * not encoded, then {@code null}. This argument is ignored if the
given path does
+ * not need to be converted from URL to {@code File}.
+ * @return The path as a {@link File} if possible, or a {@link URL}
otherwise.
+ * @throws IOException If the given path is not a file and can't be parsed
as a URL.
+ */
+ public static Object toFileOrURL(final String path, final String encoding)
throws IOException {
+ if (path == null) {
+ return null;
+ }
+ // Check if the path seems to be an ordinary file.
+ if (path.indexOf('?') < 0 && path.indexOf('#') < 0) {
+ final int s = path.indexOf(':');
+ /*
+ * If the ':' character is found, the part before it is probably a
protocol in a URL,
+ * except in the particular case where there is just one letter
before ':'. In such
+ * case, it may be the drive letter of a Windows file.
+ */
+ if (s<0 || (s==1 && Character.isLetter(path.charAt(0)) &&
!path.regionMatches(2, "//", 0, 2))) {
+ return new File(path);
+ }
+ }
+ final URL url = new URL(path);
+ if (url.getProtocol().equalsIgnoreCase("file")) {
+ return toFile(url, encoding);
+ }
+ return url;
+ }
+
+ /**
+ * Returns a byte channel from the given input, or {@code null} if the
input is of unknown type.
+ * More specifically:
+ *
+ * <ul>
+ * <li>If the given input is {@code null}, then this method returns
{@code null}.</li>
+ * <li>If the given input is a {@link ReadableByteChannel} or an {@link
InputStream},
+ * then it is returned directly, or indirectly as a wrapper.</li>
+ * <li>If the given input if a {@link Path}, {@link File}, {@link URL},
{@link URI}
+ * or {@link CharSequence}, then a new channel is opened.</li>
+ * </ul>
+ *
+ * @param input The file to open, or {@code null}.
+ * @param encoding If the URL is encoded in a {@code
application/x-www-form-urlencoded}
+ * MIME format, the character encoding (normally {@code "UTF-8"}).
If the URL is
+ * not encoded, then {@code null}. This argument is ignored if the
given path does
+ * not need to be converted from URL to {@code File}.
+ * @return The input stream for the given file, or {@code null} if the
given type is unknown.
+ * @throws IOException If an error occurred while opening the given file.
+ */
+ public static ReadableByteChannel open(Object input, final String
encoding) throws IOException {
+ if (input instanceof ReadableByteChannel) {
+ return (ReadableByteChannel) input;
+ }
+ if (input instanceof InputStream) {
+ /*
+ * Channels.newChannel(InputStream) checks for FileInputStream,
but it requires that exact class.
+ * Concequently we have to perform our own check if we want to
allow any FileInputStream subclass
+ * to have their 'getChannel()' method invoked.
+ */
+ if (input instanceof FileInputStream) {
+ return ((FileInputStream) input).getChannel();
+ }
+ return Channels.newChannel((InputStream) input);
+ }
+ if (input instanceof Path) {
+ return Files.newByteChannel((Path) input);
+ }
+ if (input instanceof CharSequence) { // Needs to be before the check
for File or URL.
+ input = toFileOrURL(input.toString(), encoding);
+ }
+ if (input instanceof File) {
+ return new FileInputStream((File) input).getChannel();
+ }
+ if (input instanceof URI) { // Needs to be before the check for URL.
+ input = ((URI) input).toURL();
+ }
+ if (input instanceof URL) {
+ return Channels.newChannel(((URL) input).openStream());
+ }
+ return null;
+ }
+}
Propchange:
sis/branches/JDK7/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/IOUtilities.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
sis/branches/JDK7/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/IOUtilities.java
------------------------------------------------------------------------------
svn:mime-type = text/plain;charset=UTF-8
Added:
sis/branches/JDK7/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/IOUtilitiesTest.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK7/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/IOUtilitiesTest.java?rev=1487611&view=auto
==============================================================================
---
sis/branches/JDK7/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/IOUtilitiesTest.java
(added)
+++
sis/branches/JDK7/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/IOUtilitiesTest.java
[UTF-8] Wed May 29 19:41:45 2013
@@ -0,0 +1,160 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sis.internal.storage;
+
+import java.net.URL;
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import org.apache.sis.test.DependsOnMethod;
+import org.apache.sis.test.TestCase;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+
+/**
+ * Tests the {@link IOUtilities} class.
+ *
+ * @author Martin Desruisseaux (Geomatys)
+ * @author Johann Sorel (Geomatys)
+ * @since 0.3 (derived from geotk-3.00)
+ * @version 0.3
+ * @module
+ */
+public final strictfp class IOUtilitiesTest extends TestCase {
+ /**
+ * Tests {@link IOUtilities#filename(Object)}.
+ *
+ * @throws URISyntaxException Should never happen.
+ * @throws MalformedURLException Should never happen.
+ */
+ @Test
+ public void testFilename() throws URISyntaxException,
MalformedURLException {
+ assertEquals("Map.png", IOUtilities.filename(
"/Users/name/Map.png"));
+ assertEquals("Map.png", IOUtilities.filename(new File(
"/Users/name/Map.png")));
+ assertEquals("Map.png", IOUtilities.filename(new URI
("file:/Users/name/Map.png")));
+ assertEquals("Map.png", IOUtilities.filename(new URL
("file:/Users/name/Map.png")));
+ assertNull(IOUtilities.filename(Boolean.FALSE));
+ assertNull(IOUtilities.filename(null));
+ }
+
+ /**
+ * Tests {@link IOUtilities#extension(Object)}.
+ *
+ * @throws URISyntaxException Should never happen.
+ * @throws MalformedURLException Should never happen.
+ */
+ @Test
+ @DependsOnMethod("testFilename")
+ public void testExtension() throws URISyntaxException,
MalformedURLException {
+ assertEquals("png", IOUtilities.extension(
"/Users/name/Map.png"));
+ assertEquals("png", IOUtilities.extension(new File(
"/Users/name/Map.png")));
+ assertEquals("png", IOUtilities.extension(new URI
("file:/Users/name/Map.png")));
+ assertEquals("png", IOUtilities.extension(new URL
("file:/Users/name/Map.png")));
+ assertEquals("", IOUtilities.extension(new File(
"/Users/name/Map")));
+ assertEquals("", IOUtilities.extension(new File(
"/Users/name/.png")));
+ assertNull(IOUtilities.extension(Boolean.FALSE));
+ assertNull(IOUtilities.extension(null));
+ }
+
+ /**
+ * Tests {@link IOUtilities#encodeURI(String)}.
+ */
+ @Test
+ public void testEncodeURI() {
+ assertEquals("/Users/name/Map%20with%20spaces.png",
IOUtilities.encodeURI("/Users/name/Map with spaces.png"));
+ assertNull(IOUtilities.encodeURI(null));
+ }
+
+ /**
+ * Tests {@link IOUtilities#toURI(URL, String)}.
+ *
+ * @throws IOException Should not happen.
+ * @throws URISyntaxException Should not happen.
+ */
+ @Test
+ @DependsOnMethod("testEncodeURI")
+ public void testToURI() throws IOException, URISyntaxException {
+ assertEquals(new URI("file:/Users/name/Map.png"),
+ IOUtilities.toURI(new URL("file:/Users/name/Map.png"), null));
+ assertEquals(new URI("file:/Users/name/Map%20with%20spaces.png"),
+ IOUtilities.toURI(new URL("file:/Users/name/Map with
spaces.png"), null));
+ assertEquals(new URI("file:/Users/name/Map%20with%20spaces.png"),
+ IOUtilities.toURI(new
URL("file:/Users/name/Map%20with%20spaces.png"), "UTF-8"));
+ assertEquals(new URI("file:/Users/name/Map%20with%20spaces.png"),
+ IOUtilities.toURI(new
URL("file:/Users/name/Map%20with%20spaces.png"), "ISO-8859-1"));
+ }
+
+ /**
+ * Tests the {@link IOUtilities#toFile(URL, String)} method. Do not test a
Windows-specific path
+ * (e.g. {@code "file:///C:/some/path/Map.png"}), since the result is
different on Windows or
+ * Unix platforms.
+ *
+ * @throws IOException Should not happen.
+ */
+ @Test
+ @DependsOnMethod("testToURI")
+ public void testToFile() throws IOException {
+ testToFile(null, "+");
+ }
+
+ /**
+ * Same test than {@link #testToFile()}, but using the UTF-8 encoding.
+ *
+ * @throws IOException Should never happen.
+ */
+ @Test
+ @DependsOnMethod("testToFile")
+ public void testToFileFromUTF8() throws IOException {
+ testToFile("UTF-8", "%2B");
+ }
+
+ /**
+ * Implementation of {@link #testToFile()} using the given encoding.
+ * If the encoding is null, then the {@code URLDecoder} will not be used.
+ *
+ * @param encoding The encoding, or {@code null} if none.
+ * @param plus The representation for the {@code '+'} sign.
+ * @throws IOException Should not happen.
+ */
+ private void testToFile(final String encoding, final String plus) throws
IOException {
+ assertEquals("Unix absolute path.", new File("/Users/name/Map.png"),
+ IOUtilities.toFile(new URL("file:/Users/name/Map.png"),
encoding));
+ assertEquals("Path with space.", new File("/Users/name/Map with
spaces.png"),
+ IOUtilities.toFile(new URL("file:/Users/name/Map with
spaces.png"), encoding));
+ assertEquals("Path with + sign.", new
File("/Users/name/++t--++est.shp"),
+ IOUtilities.toFile(new
URL("file:/Users/name/++t--++est.shp".replace("+", plus)), encoding));
+ }
+
+ /**
+ * Tests {@link IOUtilities#toFileOrURL(String, String)}.
+ *
+ * @throws IOException Should not happen.
+ */
+ @Test
+ @DependsOnMethod("testToFileFromUTF8")
+ public void testToFileOrURL() throws IOException {
+ assertEquals(new File("/Users/name/Map.png"),
IOUtilities.toFileOrURL("/Users/name/Map.png", null));
+ assertEquals(new File("/Users/name/Map.png"),
IOUtilities.toFileOrURL("file:/Users/name/Map.png", null));
+ assertEquals(new URL("http://localhost"),
IOUtilities.toFileOrURL("http://localhost", null));
+ assertEquals(new File("/Users/name/Map with spaces.png"),
+
IOUtilities.toFileOrURL("file:/Users/name/Map%20with%20spaces.png", "UTF-8"));
+ }
+}
Propchange:
sis/branches/JDK7/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/IOUtilitiesTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
sis/branches/JDK7/storage/sis-storage/src/test/java/org/apache/sis/internal/storage/IOUtilitiesTest.java
------------------------------------------------------------------------------
svn:mime-type = text/plain;charset=UTF-8
Modified:
sis/branches/JDK7/storage/sis-storage/src/test/java/org/apache/sis/test/suite/StorageTestSuite.java
URL:
http://svn.apache.org/viewvc/sis/branches/JDK7/storage/sis-storage/src/test/java/org/apache/sis/test/suite/StorageTestSuite.java?rev=1487611&r1=1487610&r2=1487611&view=diff
==============================================================================
---
sis/branches/JDK7/storage/sis-storage/src/test/java/org/apache/sis/test/suite/StorageTestSuite.java
[UTF-8] (original)
+++
sis/branches/JDK7/storage/sis-storage/src/test/java/org/apache/sis/test/suite/StorageTestSuite.java
[UTF-8] Wed May 29 19:41:45 2013
@@ -30,6 +30,7 @@ import org.junit.BeforeClass;
* @module
*/
@Suite.SuiteClasses({
+ org.apache.sis.internal.storage.IOUtilitiesTest.class,
org.apache.sis.internal.storage.ChannelDataInputTest.class,
org.apache.sis.internal.storage.ChannelImageInputStreamTest.class
})