aboutsummaryrefslogtreecommitdiffstats
path: root/src/java/com/jogamp/common
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2011-06-08 05:45:17 +0200
committerSven Gothel <[email protected]>2011-06-08 05:50:17 +0200
commita87c56c95099de5b6cbc9bd8bf6f1924a3dd6387 (patch)
tree0e5c81a4b3a2b136d50d827729dc727cd99d615c /src/java/com/jogamp/common
parent5de9de569622bc7baeee3a85b1ee5aa172830513 (diff)
Merged Locator -> IOUtil; int Platform.getPageSize(); Added unit test for IOUtil and Platform's page size
Diffstat (limited to 'src/java/com/jogamp/common')
-rw-r--r--src/java/com/jogamp/common/os/Platform.java18
-rw-r--r--src/java/com/jogamp/common/util/IOUtil.java264
-rw-r--r--src/java/com/jogamp/common/util/Locator.java178
3 files changed, 236 insertions, 224 deletions
diff --git a/src/java/com/jogamp/common/os/Platform.java b/src/java/com/jogamp/common/os/Platform.java
index e31e123..0775f37 100644
--- a/src/java/com/jogamp/common/os/Platform.java
+++ b/src/java/com/jogamp/common/os/Platform.java
@@ -57,7 +57,7 @@ public class Platform {
private static final boolean is32Bit;
private static final int pointerSizeInBits;
- private static final long pageSize;
+ private static final int pageSize;
static {
@@ -84,7 +84,11 @@ public class Platform {
if(libsLoaded) {
pointerSizeInBits = getPointerSizeInBitsImpl();
- pageSize = getPageSizeImpl();
+ final long pageSizeL = getPageSizeImpl();
+ if(Integer.MAX_VALUE < pageSizeL) {
+ throw new InternalError("PageSize exceeds integer value: " + pageSizeL);
+ }
+ pageSize = (int) pageSizeL ;
}else{
pointerSizeInBits = -1;
pageSize = -1;
@@ -253,8 +257,16 @@ public class Platform {
return pointerSizeInBits/8;
}
- public static long getPageSize() {
+ public static int getPageSize() {
return pageSize;
}
+
+ public static int getPageNumber(int size) {
+ return ( size + ( pageSize - 1) ) / pageSize ; // integer arithmetic
+ }
+
+ public static int getPageAlignedSize(int size) {
+ return getPageNumber(size) * pageSize;
+ }
}
diff --git a/src/java/com/jogamp/common/util/IOUtil.java b/src/java/com/jogamp/common/util/IOUtil.java
index 42ac0e5..b2d9ed4 100644
--- a/src/java/com/jogamp/common/util/IOUtil.java
+++ b/src/java/com/jogamp/common/util/IOUtil.java
@@ -35,55 +35,23 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.net.JarURLConnection;
+import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.nio.ByteBuffer;
import com.jogamp.common.nio.Buffers;
+import com.jogamp.common.os.Platform;
public class IOUtil {
private IOUtil() {}
- /**
- * Returns the lowercase suffix of the given file name (the text
- * after the last '.' in the file name). Returns null if the file
- * name has no suffix. Only operates on the given file name;
- * performs no I/O operations.
- *
- * @param file name of the file
- * @return lowercase suffix of the file name
- * @throws NullPointerException if file is null
- */
-
- public static String getFileSuffix(File file) {
- return getFileSuffix(file.getName());
- }
-
- /**
- * Returns the lowercase suffix of the given file name (the text
- * after the last '.' in the file name). Returns null if the file
- * name has no suffix. Only operates on the given file name;
- * performs no I/O operations.
- *
- * @param filename name of the file
- * @return lowercase suffix of the file name
- * @throws NullPointerException if filename is null
+ /***
+ *
+ * STREAM COPY STUFF
+ *
*/
- public static String getFileSuffix(String filename) {
- int lastDot = filename.lastIndexOf('.');
- if (lastDot < 0) {
- return null;
- }
- return toLowerCase(filename.substring(lastDot + 1));
- }
-
- private static String toLowerCase(String arg) {
- if (arg == null) {
- return null;
- }
-
- return arg.toLowerCase();
- }
/**
* Copy the specified input stream to the specified output file. The total
@@ -113,9 +81,8 @@ public class IOUtil {
* number of bytes written is returned.
*/
public static int copyStream2Stream(InputStream in, OutputStream out, int totalNumBytes) throws IOException {
+ final byte[] buf = new byte[Platform.getPageSize()];
int numBytes = 0;
- final int BUFFER_SIZE = 1000;
- byte[] buf = new byte[BUFFER_SIZE];
while (true) {
int count;
if ((count = in.read(buf)) == -1) {
@@ -166,8 +133,219 @@ public class IOUtil {
* <p>The implementation creates the ByteBuffer w/ {@link #copyStream2ByteArray(InputStream)}'s returned byte array.</p>
*/
public static ByteBuffer copyStream2ByteBuffer(InputStream stream) throws IOException {
- final byte[] data = copyStream2ByteArray(stream);
- return Buffers.newDirectByteBuffer(data, 0, data.length);
+ // FIXME: Shall enforce a BufferedInputStream ?
+ if( !(stream instanceof BufferedInputStream) ) {
+ stream = new BufferedInputStream(stream);
+ }
+ int totalRead = 0;
+ int avail = stream.available();
+ ByteBuffer data = Buffers.newDirectByteBuffer( Platform.getPageAlignedSize(avail) );
+ byte[] chunk = new byte[Platform.getPageSize()];
+ int chunk2Read = Math.min(Platform.getPageSize(), avail);
+ int numRead = 0;
+ do {
+ if (avail > data.remaining()) {
+ final ByteBuffer newData = Buffers.newDirectByteBuffer(
+ Platform.getPageAlignedSize(data.position() + avail) );
+ newData.put(data);
+ data = newData;
+ }
+
+ numRead = stream.read(chunk, 0, chunk2Read);
+ if (numRead >= 0) {
+ data.put(chunk, 0, numRead);
+ totalRead += numRead;
+ }
+ avail = stream.available();
+ chunk2Read = Math.min(Platform.getPageSize(), avail);
+ } while (avail > 0 && numRead >= 0);
+
+ data.flip();
+ return data;
}
+ /***
+ *
+ * RESOURCE / FILE NAME STUFF
+ *
+ */
+
+ /**
+ * Returns the lowercase suffix of the given file name (the text
+ * after the last '.' in the file name). Returns null if the file
+ * name has no suffix. Only operates on the given file name;
+ * performs no I/O operations.
+ *
+ * @param file name of the file
+ * @return lowercase suffix of the file name
+ * @throws NullPointerException if file is null
+ */
+
+ public static String getFileSuffix(File file) {
+ return getFileSuffix(file.getName());
+ }
+
+ /**
+ * Returns the lowercase suffix of the given file name (the text
+ * after the last '.' in the file name). Returns null if the file
+ * name has no suffix. Only operates on the given file name;
+ * performs no I/O operations.
+ *
+ * @param filename name of the file
+ * @return lowercase suffix of the file name
+ * @throws NullPointerException if filename is null
+ */
+ public static String getFileSuffix(String filename) {
+ int lastDot = filename.lastIndexOf('.');
+ if (lastDot < 0) {
+ return null;
+ }
+ return toLowerCase(filename.substring(lastDot + 1));
+ }
+
+ private static String toLowerCase(String arg) {
+ if (arg == null) {
+ return null;
+ }
+
+ return arg.toLowerCase();
+ }
+
+ /***
+ *
+ * RESOURCE LOCATION STUFF
+ *
+ */
+
+ /**
+ * Locating a resource using 'getResource(String path, ClassLoader cl)',
+ * with the given context's ClassLoader and the resourcePath as is,
+ * as well with the context's package name-path plus the resourcePath.
+ *
+ * @see #getResource(String, ClassLoader)
+ */
+ public static URL getResource(Class context, String resourcePath) {
+ if(null == resourcePath) {
+ return null;
+ }
+ ClassLoader contextCL = (null!=context)?context.getClassLoader():null;
+ URL url = getResource(resourcePath, contextCL);
+ if (url == null && null!=context) {
+ // Try again by scoping the path within the class's package
+ String className = context.getName().replace('.', '/');
+ int lastSlash = className.lastIndexOf('/');
+ if (lastSlash >= 0) {
+ String tmpPath = className.substring(0, lastSlash + 1) + resourcePath;
+ url = getResource(tmpPath, contextCL);
+ }
+ }
+ return url;
+ }
+
+ /**
+ * Locating a resource using the ClassLoader's facility if not null,
+ * the absolute URL and absolute file.
+ *
+ * @see ClassLoader#getResource(String)
+ * @see ClassLoader#getSystemResource(String)
+ * @see URL#URL(String)
+ * @see File#File(String)
+ */
+ public static URL getResource(String resourcePath, ClassLoader cl) {
+ if(null == resourcePath) {
+ return null;
+ }
+ URL url = null;
+ if (cl != null) {
+ url = cl.getResource(resourcePath);
+ if(!urlExists(url)) {
+ url = null;
+ }
+ }
+ if(null == url) {
+ url = ClassLoader.getSystemResource(resourcePath);
+ if(!urlExists(url)) {
+ url = null;
+ }
+ }
+ if(null == url) {
+ try {
+ url = new URL(resourcePath);
+ if(!urlExists(url)) {
+ url = null;
+ }
+ } catch (MalformedURLException e) { }
+ }
+ if(null == url) {
+ try {
+ File file = new File(resourcePath);
+ if(file.exists()) {
+ url = file.toURL();
+ } else {
+ }
+ } catch (MalformedURLException e) {}
+ }
+ return url;
+ }
+
+ /**
+ * Generates a path for the 'relativeFile' relative to the 'baseLocation'.
+ *
+ * @param baseLocation denotes a directory
+ * @param relativeFile denotes a relative file to the baseLocation
+ */
+ public static String getRelativeOf(File baseLocation, String relativeFile) {
+ if(null == relativeFile) {
+ return null;
+ }
+
+ while (baseLocation != null && relativeFile.startsWith("../")) {
+ baseLocation = baseLocation.getParentFile();
+ relativeFile = relativeFile.substring(3);
+ }
+ if (baseLocation != null) {
+ final File file = new File(baseLocation, relativeFile);
+ // Handle things on Windows
+ return file.getPath().replace('\\', '/');
+ }
+ return null;
+ }
+
+ /**
+ * Generates a path for the 'relativeFile' relative to the 'baseLocation'.
+ *
+ * @param baseLocation denotes a URL to a file
+ * @param relativeFile denotes a relative file to the baseLocation's parent directory
+ */
+ public static String getRelativeOf(URL baseLocation, String relativeFile) {
+ String urlPath = baseLocation.getPath();
+
+ if ( baseLocation.toString().startsWith("jar") ) {
+ JarURLConnection jarConnection;
+ try {
+ jarConnection = (JarURLConnection) baseLocation.openConnection();
+ urlPath = jarConnection.getEntryName();
+ } catch (IOException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ // Try relative path first
+ return getRelativeOf(new File(urlPath).getParentFile(), relativeFile);
+ }
+
+ /**
+ * Returns true, if the URL exists and a connection could be opened.
+ */
+ public static boolean urlExists(URL url) {
+ boolean v = false;
+ if(null!=url) {
+ try {
+ URLConnection uc = url.openConnection();
+ v = true;
+ } catch (IOException ioe) { }
+ }
+ return v;
+ }
}
diff --git a/src/java/com/jogamp/common/util/Locator.java b/src/java/com/jogamp/common/util/Locator.java
deleted file mode 100644
index 8ecdc0e..0000000
--- a/src/java/com/jogamp/common/util/Locator.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * Copyright (c) 2009 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistribution in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * Neither the name of Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- *
- */
-
-package com.jogamp.common.util;
-
-import java.io.*;
-import java.net.*;
-
-/** Utilities for dealing with resources. */
-
-public class Locator {
- private Locator() {}
-
- /**
- * Locating a resource using 'getResource(String path, ClassLoader cl)',
- * with the given context's ClassLoader and the resourcePath as is,
- * as well with the context's package name-path plus the resourcePath.
- *
- * @see #getResource(String, ClassLoader)
- */
- public static URL getResource(Class context, String resourcePath) {
- if(null == resourcePath) {
- return null;
- }
- ClassLoader contextCL = (null!=context)?context.getClassLoader():null;
- URL url = getResource(resourcePath, contextCL);
- if (url == null && null!=context) {
- // Try again by scoping the path within the class's package
- String className = context.getName().replace('.', '/');
- int lastSlash = className.lastIndexOf('/');
- if (lastSlash >= 0) {
- String tmpPath = className.substring(0, lastSlash + 1) + resourcePath;
- url = getResource(tmpPath, contextCL);
- }
- }
- return url;
- }
-
- /**
- * Locating a resource using the ClassLoader's facility if not null,
- * the absolute URL and absolute file.
- *
- * @see ClassLoader#getResource(String)
- * @see ClassLoader#getSystemResource(String)
- * @see URL#URL(String)
- * @see File#File(String)
- */
- public static URL getResource(String resourcePath, ClassLoader cl) {
- if(null == resourcePath) {
- return null;
- }
- URL url = null;
- if (cl != null) {
- url = cl.getResource(resourcePath);
- if(!urlExists(url)) {
- url = null;
- }
- }
- if(null == url) {
- url = ClassLoader.getSystemResource(resourcePath);
- if(!urlExists(url)) {
- url = null;
- }
- }
- if(null == url) {
- try {
- url = new URL(resourcePath);
- if(!urlExists(url)) {
- url = null;
- }
- } catch (MalformedURLException e) { }
- }
- if(null == url) {
- try {
- File file = new File(resourcePath);
- if(file.exists()) {
- url = file.toURL();
- } else {
- }
- } catch (MalformedURLException e) {}
- }
- return url;
- }
-
- /**
- * Generates a path for the 'relativeFile' relative to the 'baseLocation'.
- *
- * @param baseLocation denotes a directory
- * @param relativeFile denotes a relative file to the baseLocation
- */
- public static String getRelativeOf(File baseLocation, String relativeFile) {
- if(null == relativeFile) {
- return null;
- }
-
- while (baseLocation != null && relativeFile.startsWith("../")) {
- baseLocation = baseLocation.getParentFile();
- relativeFile = relativeFile.substring(3);
- }
- if (baseLocation != null) {
- final File file = new File(baseLocation, relativeFile);
- // Handle things on Windows
- return file.getPath().replace('\\', '/');
- }
- return null;
- }
-
- /**
- * Generates a path for the 'relativeFile' relative to the 'baseLocation'.
- *
- * @param baseLocation denotes a URL to a file
- * @param relativeFile denotes a relative file to the baseLocation's parent directory
- */
- public static String getRelativeOf(URL baseLocation, String relativeFile) {
- String urlPath = baseLocation.getPath();
-
- if ( baseLocation.toString().startsWith("jar") ) {
- JarURLConnection jarConnection;
- try {
- jarConnection = (JarURLConnection) baseLocation.openConnection();
- urlPath = jarConnection.getEntryName();
- } catch (IOException e) {
- e.printStackTrace();
- return null;
- }
- }
-
- // Try relative path first
- return getRelativeOf(new File(urlPath).getParentFile(), relativeFile);
- }
-
- /**
- * Returns true, if the url exists,
- * trying to open a connection.
- */
- public static boolean urlExists(URL url) {
- boolean v = false;
- if(null!=url) {
- try {
- URLConnection uc = url.openConnection();
- v = true;
- } catch (IOException ioe) { }
- }
- return v;
- }
-
-}
-