You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2009/10/13 12:24:48 UTC
svn commit: r824666 - in /commons/sandbox/runtime/trunk/src/main:
java/org/apache/commons/runtime/io/ native/include/ native/os/unix/
native/shared/
Author: mturk
Date: Tue Oct 13 10:24:46 2009
New Revision: 824666
URL: http://svn.apache.org/viewvc?rev=824666&view=rev
Log:
Add Directory class
Added:
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Directory.java (with props)
Modified:
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/File.java
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/LocalStrings.properties
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Status.java
commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h
commons/sandbox/runtime/trunk/src/main/native/os/unix/fsysio.c
commons/sandbox/runtime/trunk/src/main/native/shared/error.c
Added: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Directory.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Directory.java?rev=824666&view=auto
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Directory.java (added)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Directory.java Tue Oct 13 10:24:46 2009
@@ -0,0 +1,204 @@
+/* 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.commons.runtime.io;
+
+import org.apache.commons.runtime.Descriptor;
+import org.apache.commons.runtime.exception.ClosedDescriptorException;
+import org.apache.commons.runtime.exception.AsyncClosedDescriptorException;
+import org.apache.commons.runtime.exception.InvalidDescriptorException;
+import org.apache.commons.runtime.exception.OverlappingFileLockException;
+import org.apache.commons.runtime.exception.TimeoutException;
+import org.apache.commons.runtime.util.StringManager;
+import java.io.Closeable;
+import java.io.Flushable;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.SyncFailedException;
+import java.util.Enumeration;
+import java.util.EnumSet;
+import java.util.Vector;
+
+/**
+ * Directory class.
+ */
+public class Directory implements Closeable
+{
+ /* Directory descriptor object
+ */
+ private Descriptor dd;
+
+ /**
+ * Close this file.
+ * @see java.io.Closeable#close()
+ * @throws IOException if an I/O error occurs.
+ */
+ public final void close()
+ throws IOException
+ {
+ dd.close();
+ }
+
+ private static native Descriptor open0(String path)
+ throws FileNotFoundException, IOException, SecurityException;
+ /**
+ * Open a {@code Directory} for reading.
+ */
+ public Directory(File path)
+ throws FileNotFoundException, IOException, SecurityException
+ {
+ dd = open0(path.getPath());
+ }
+
+ private static native FileInfo read1(Descriptor dd)
+ throws IOException;
+ public FileInfo read()
+ throws IOException
+ {
+ return read1(dd);
+ }
+
+ private static native void rewind0(Descriptor dd);
+ public void rewind()
+ {
+ rewind0(dd);
+ }
+
+ private static native long tell0(Descriptor dd)
+ throws IOException;
+ public long tell()
+ throws IOException
+ {
+ return tell0(dd);
+ }
+
+ private static native void seek0(Descriptor dd, long off);
+ public void seek(long off)
+ {
+ seek0(dd, off);
+ }
+
+ private static native int mkdir0(String path, int perms);
+ private static native int mkdir1(String path, int perms);
+
+ public static boolean create(File path, EnumSet<FileProtection> prot)
+ throws FileNotFoundException, IOException, SecurityException
+ {
+ int rc;
+
+ rc = mkdir0(path.getPath(), FileProtection.bitmapOf(prot));
+ if (rc == 0)
+ return true;
+ if (Status.STATUS_IS_EEXIST(rc))
+ return false;
+ if (Status.STATUS_IS_ENOENT(rc)) {
+ /* Missing interediate dir
+ */
+ throw new FileNotFoundException();
+ }
+ if (Status.STATUS_IS_EACCES(rc)) {
+ /* Missing interediate dir
+ */
+ throw new SecurityException();
+ }
+ throw new IOException(Status.describe(rc));
+ }
+
+ public static boolean createRecursive(File path,
+ EnumSet<FileProtection> prot)
+ throws IOException, SecurityException
+ {
+ int rc;
+
+ rc = mkdir1(path.getPath(), FileProtection.bitmapOf(prot));
+ if (rc == 0)
+ return true;
+ if (Status.STATUS_IS_EEXIST(rc))
+ return false;
+ if (Status.STATUS_IS_EACCES(rc)) {
+ /* Missing interediate dir
+ */
+ throw new SecurityException();
+ }
+ throw new IOException(Status.describe(rc));
+ }
+
+ private static native String tmpdir0(String path, String prefix)
+ throws IOException, SecurityException;
+
+ /**
+ * Creates a new temporary directory with {@code prefix} inside
+ * directory specified by {@code path}.
+ * <p>
+ * </p>
+ * @param path Where to create a new drectory.
+ * @param prefix The prefix for the new drectory.
+ * @return Newly created unique directory abstract path.
+ *
+ * @throws IOException in case of error.
+ * @throws SecurityException if Write access to the directory specified
+ * by {@code path} is denied.
+ */
+ public static File createTemp(File path, String prefix)
+ throws IOException, SecurityException
+ {
+ String tmp = tmpdir0(path.getPath(), prefix);
+ return new File(tmp, FileType.DIR);
+ }
+
+ /**
+ * Creates a new temporary directory with {@code prefix}.
+ * <p>
+ * </p>
+ * @param prefix The prefix for the new drectory.
+ * @return Newly created unique directory abstract path.
+ *
+ * @throws IOException in case of error.
+ * @throws SecurityException if Write access to the system temporary
+ * directory is denied.
+ */
+ public static File createTemp(String prefix)
+ throws IOException, SecurityException
+ {
+ String tmp = tmpdir0(null, prefix);
+ return new File(tmp, FileType.DIR);
+ }
+
+ private static File tmpDir;
+ private static native String tmpdir1(String paths);
+ /**
+ * Get system temporary directory path.
+ *
+ * @param searchPath {@link java.io.File#pathSeparator} delimited list of
+ * directories to use as temporary directory. Firts one that is
+ * accessible will be used.
+ * @return Temporary directory {@code File} instance.
+ * @throws SecurityException if Write access to directories listed inside
+ * {@code searchPath} is denied.
+ */
+ public synchronized static File getTemp(String searchPath)
+ throws SecurityException
+ {
+ String dir = tmpdir1(searchPath);
+ if (dir == null)
+ throw new SecurityException();
+ tmpDir = new File(dir, FileType.DIR);
+
+ return tmpDir;
+ }
+
+
+}
Propchange: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Directory.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/File.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/File.java?rev=824666&r1=824665&r2=824666&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/File.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/File.java Tue Oct 13 10:24:46 2009
@@ -23,6 +23,7 @@
import org.apache.commons.runtime.Descriptor;
import org.apache.commons.runtime.Group;
import org.apache.commons.runtime.User;
+import org.apache.commons.runtime.util.StringManager;
/**
* An abstract representation of file and directory pathnames that
@@ -154,6 +155,22 @@
}
/**
+ * Create new {@code File} instance by converting the given pathname
+ * into an abstract pathname. If the given string is the empty path,
+ * then the result is the empty abstract pathname.
+ *
+ * @param pathname A pathname string.
+ * @throws NullPointerException If the {@code pathname} is {@code null}.
+ */
+ public File(String pathname, FileType type)
+ throws NullPointerException
+ {
+ super(pathname);
+ if (type != null)
+ fileType = type.valueOf();
+ }
+
+ /**
* Creates a new {@code File} instance by converting the given
* {@code file:} URI into an abstract pathname.
* <p>
@@ -387,7 +404,7 @@
return new File(link, FileType.LNK.valueOf());
}
else {
- throw new IOException("Symlink exists and points to a different path");
+ throw new IOException(Local.sm.get("symlink.EEXIST"));
}
}
Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/LocalStrings.properties
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/LocalStrings.properties?rev=824666&r1=824665&r2=824666&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/LocalStrings.properties (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/LocalStrings.properties Tue Oct 13 10:24:46 2009
@@ -14,3 +14,4 @@
# limitations under the License.
file.EEXIST=File already exsts and CREATE and EXCL FileOpenMode was given
+symlink.EEXIST=Symbolic link exists and points to a different path
Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Status.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Status.java?rev=824666&r1=824665&r2=824666&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Status.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Status.java Tue Oct 13 10:24:46 2009
@@ -429,6 +429,12 @@
return is0(EEXIST, s);
}
+ /** File exists */
+ public static boolean STATUS_IS_ENOENT(int s)
+ {
+ return is0(ENOENT, s);
+ }
+
public static native String describe(int s);
/* TODO: Implement the remaining of STATUS_IS methods */
}
Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h?rev=824666&r1=824665&r2=824666&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h Tue Oct 13 10:24:46 2009
@@ -42,6 +42,7 @@
ACR_EX_ENOMEM, /* java/lang/OutOfMemoryError */
ACR_EX_ENULL, /* java/lang/NullPointerException */
ACR_EX_EINVAL, /* java/lang/IllegalArgumentException */
+ ACR_EX_EISTATE, /* java/lang/IllegalStateException */
ACR_EX_EINDEX, /* java/lang/IndexOutOfBoundsException */
ACR_EX_ECCAST, /* java/lang/ClassCastException */
ACR_EX_EINSTANCE, /* java/lang/InstantiationException */
@@ -50,6 +51,7 @@
ACR_EX_ULINK, /* java/lang/UnsatisfiedLinkError */
ACR_EX_ENOTIMPL, /* java/lang/UnsupportedOperationException */
ACR_EX_EIO, /* java/io/IOException */
+ ACR_EX_EINTR, /* java/io/InterruptedIOException */
ACR_EX_ENOTFOUND, /* java/io/FileNotFoundException */
ACR_EX_ESYNC, /* java/io/SyncFailedException */
ACR_EX_ESOCK, /* java/net/SocketException */
Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/fsysio.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/fsysio.c?rev=824666&r1=824665&r2=824666&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/fsysio.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/fsysio.c Tue Oct 13 10:24:46 2009
@@ -26,6 +26,10 @@
#include "acr_file.h"
#include "acr_fileio.h"
+/* Platform includes
+ */
+#include <sys/time.h>
+
static int file_cleanup(void *file, int type, unsigned int flags)
{
int rc = ACR_EBADF;
@@ -418,12 +422,33 @@
static int wait_for_io_or_timeout(acr_file_t *f, int for_read)
{
int rc;
+ acr_time_t prev, nexttime;
+ struct timeval t;
+ int timeout = f->timeout;
+
f->ppoll.fd = f->fd;
f->ppoll.events = for_read ? POLLIN : POLLOUT;
-
- do {
- rc = poll(&f->ppoll, 1, f->timeout);
- } while (rc == -1 && errno == EINTR);
+ /* Store the the current time
+ */
+ gettimeofday(&t, NULL);
+ prev = ((acr_time_t)t.tv_sec * 1000) + t.tv_usec / 1000;
+ for (;;) {
+ rc = poll(&f->ppoll, 1, timeout);
+ if (rc == -1 && errno == EINTR) {
+ if (timeout >= 0) {
+ gettimeofday(&t, NULL);
+ nexttime = ((acr_time_t)t.tv_sec * 1000) + t.tv_usec / 1000;
+ timeout -= (int)(nexttime - prev);
+ if (timeout <= 0) {
+ rc = 0;
+ break;
+ }
+ prev = nexttime;
+ }
+ }
+ else
+ break;
+ }
if (rc == 0)
return ACR_TIMEUP;
else if (rc > 0)
Modified: commons/sandbox/runtime/trunk/src/main/native/shared/error.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/error.c?rev=824666&r1=824665&r2=824666&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/error.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/error.c Tue Oct 13 10:24:46 2009
@@ -30,6 +30,7 @@
"java/lang/OutOfMemoryError",
"java/lang/NullPointerException",
"java/lang/IllegalArgumentException",
+ "java/lang/IllegalStateException",
"java/lang/IndexOutOfBoundsException",
"java/lang/ClassCastException",
"java/lang/InstantiationException",
@@ -38,6 +39,7 @@
"java/lang/UnsatisfiedLinkError",
"java/lang/UnsupportedOperationException",
"java/io/IOException",
+ "java/io/InterruptedIOException",
"java/io/FileNotFoundException",
"java/io/SyncFailedException",
"java/net/SocketException",