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 })