You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2008/09/24 12:08:45 UTC

svn commit: r698501 - in /jackrabbit/sandbox/jcrutil: ./ .settings/ src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/jcrutil/ src/main/resources/ src/main/resources/META-INF/ src/test/ src/test/java/ src/test/java/org/ src/test/java/o...

Author: jukka
Date: Wed Sep 24 03:08:44 2008
New Revision: 698501

URL: http://svn.apache.org/viewvc?rev=698501&view=rev
Log:
JCR-1724: Jackrabbit utilities

jcrutil component contributed by Jason Thrasher.

Added:
    jackrabbit/sandbox/jcrutil/
    jackrabbit/sandbox/jcrutil/.classpath   (with props)
    jackrabbit/sandbox/jcrutil/.project   (with props)
    jackrabbit/sandbox/jcrutil/.settings/
    jackrabbit/sandbox/jcrutil/.settings/org.eclipse.jdt.core.prefs
    jackrabbit/sandbox/jcrutil/pom.xml   (with props)
    jackrabbit/sandbox/jcrutil/repository.xml   (with props)
    jackrabbit/sandbox/jcrutil/src/
    jackrabbit/sandbox/jcrutil/src/main/
    jackrabbit/sandbox/jcrutil/src/main/java/
    jackrabbit/sandbox/jcrutil/src/main/java/org/
    jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/
    jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/JcrFileObject.java   (with props)
    jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/JcrFileProvider.java   (with props)
    jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/JcrFileSystem.java   (with props)
    jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3DataRecord.java   (with props)
    jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3DataStore.java   (with props)
    jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3DataStoreIterator.java   (with props)
    jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3DataTransfer.java   (with props)
    jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3Iterator.java   (with props)
    jackrabbit/sandbox/jcrutil/src/main/resources/
    jackrabbit/sandbox/jcrutil/src/main/resources/META-INF/
    jackrabbit/sandbox/jcrutil/src/main/resources/META-INF/vfs-providers.xml   (with props)
    jackrabbit/sandbox/jcrutil/src/main/resources/ehcache.xml   (with props)
    jackrabbit/sandbox/jcrutil/src/main/resources/jets3t.properties   (with props)
    jackrabbit/sandbox/jcrutil/src/test/
    jackrabbit/sandbox/jcrutil/src/test/java/
    jackrabbit/sandbox/jcrutil/src/test/java/org/
    jackrabbit/sandbox/jcrutil/src/test/java/org/jcrutil/
    jackrabbit/sandbox/jcrutil/src/test/java/org/jcrutil/S3DataStoreTest.java   (with props)
    jackrabbit/sandbox/jcrutil/src/test/java/org/jcrutil/VfsTest.java   (with props)
    jackrabbit/sandbox/jcrutil/src/test/resources/
    jackrabbit/sandbox/jcrutil/src/test/resources/log4j.xml   (with props)

Added: jackrabbit/sandbox/jcrutil/.classpath
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jcrutil/.classpath?rev=698501&view=auto
==============================================================================
--- jackrabbit/sandbox/jcrutil/.classpath (added)
+++ jackrabbit/sandbox/jcrutil/.classpath Wed Sep 24 03:08:44 2008
@@ -0,0 +1,43 @@
+<classpath>
+  <classpathentry kind="src" path="src/main/java"/>
+  <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
+  <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
+  <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
+  <classpathentry kind="output" path="target/classes"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+  <classpathentry kind="var" path="M2_REPO/backport-util-concurrent/backport-util-concurrent/3.0/backport-util-concurrent-3.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/commons-codec/commons-codec/1.3/commons-codec-1.3.jar"/>
+  <classpathentry kind="var" path="M2_REPO/commons-collections/commons-collections/3.1/commons-collections-3.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/commons-httpclient/commons-httpclient/3.1/commons-httpclient-3.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/commons-io/commons-io/1.4/commons-io-1.4.jar"/>
+  <classpathentry kind="var" path="M2_REPO/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar"/>
+  <classpathentry kind="var" path="M2_REPO/commons-vfs/commons-vfs/1.0/commons-vfs-1.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/concurrent/concurrent/1.3.4/concurrent-1.3.4.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/derby/derby/10.2.1.6/derby-10.2.1.6.jar"/>
+  <classpathentry kind="var" path="M2_REPO/net/sf/ehcache/ehcache/1.3.0/ehcache-1.3.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/fontbox/fontbox/0.1.0/fontbox-0.1.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/jackrabbit/jackrabbit-api/1.5-SNAPSHOT/jackrabbit-api-1.5-SNAPSHOT.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/jackrabbit/jackrabbit-core/1.5-SNAPSHOT/jackrabbit-core-1.5-SNAPSHOT.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/jackrabbit/jackrabbit-jcr-commons/1.5-SNAPSHOT/jackrabbit-jcr-commons-1.5-SNAPSHOT.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/jackrabbit/jackrabbit-jcr-server/1.5-SNAPSHOT/jackrabbit-jcr-server-1.5-SNAPSHOT.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/jackrabbit/jackrabbit-spi/1.5-SNAPSHOT/jackrabbit-spi-1.5-SNAPSHOT.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/jackrabbit/jackrabbit-spi-commons/1.5-SNAPSHOT/jackrabbit-spi-commons-1.5-SNAPSHOT.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/jackrabbit/jackrabbit-text-extractors/1.5-SNAPSHOT/jackrabbit-text-extractors-1.5-SNAPSHOT.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/jackrabbit/jackrabbit-webdav/1.5-SNAPSHOT/jackrabbit-webdav-1.5-SNAPSHOT.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/slf4j/jcl104-over-slf4j/1.4.3/jcl104-over-slf4j-1.4.3.jar"/>
+  <classpathentry kind="var" path="M2_REPO/javax/jcr/jcr/1.0/jcr-1.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/jempbox/jempbox/0.2.0/jempbox-0.2.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/net/java/dev/jets3t/jets3t/0.6.1/jets3t-0.6.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/net/sf/jsr107cache/jsr107cache/1.0/jsr107cache-1.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.13/log4j-1.2.13.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/lucene/lucene-core/2.3.2/lucene-core-2.3.2.jar"/>
+  <classpathentry kind="var" path="M2_REPO/net/sourceforge/nekohtml/nekohtml/1.9.7/nekohtml-1.9.7.jar"/>
+  <classpathentry kind="var" path="M2_REPO/pdfbox/pdfbox/0.7.3/pdfbox-0.7.3.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/poi/poi/3.0.2-FINAL/poi-3.0.2-FINAL.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/poi/poi-scratchpad/3.0.2-FINAL/poi-scratchpad-3.0.2-FINAL.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-api/1.4.3/slf4j-api-1.4.3.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-log4j12/1.4.3/slf4j-log4j12-1.4.3.jar"/>
+  <classpathentry kind="var" path="M2_REPO/xerces/xercesImpl/2.8.1/xercesImpl-2.8.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/xml-apis/xml-apis/1.3.03/xml-apis-1.3.03.jar"/>
+</classpath>
\ No newline at end of file

Propchange: jackrabbit/sandbox/jcrutil/.classpath
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/sandbox/jcrutil/.project
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jcrutil/.project?rev=698501&view=auto
==============================================================================
--- jackrabbit/sandbox/jcrutil/.project (added)
+++ jackrabbit/sandbox/jcrutil/.project Wed Sep 24 03:08:44 2008
@@ -0,0 +1,13 @@
+<projectDescription>
+  <name>jcrutil</name>
+  <comment/>
+  <projects/>
+  <buildSpec>
+    <buildCommand>
+      <name>org.eclipse.jdt.core.javabuilder</name>
+    </buildCommand>
+  </buildSpec>
+  <natures>
+    <nature>org.eclipse.jdt.core.javanature</nature>
+  </natures>
+</projectDescription>
\ No newline at end of file

Propchange: jackrabbit/sandbox/jcrutil/.project
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/sandbox/jcrutil/.settings/org.eclipse.jdt.core.prefs
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jcrutil/.settings/org.eclipse.jdt.core.prefs?rev=698501&view=auto
==============================================================================
--- jackrabbit/sandbox/jcrutil/.settings/org.eclipse.jdt.core.prefs (added)
+++ jackrabbit/sandbox/jcrutil/.settings/org.eclipse.jdt.core.prefs Wed Sep 24 03:08:44 2008
@@ -0,0 +1,5 @@
+#Sun Sep 21 18:15:40 PDT 2008
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5

Added: jackrabbit/sandbox/jcrutil/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jcrutil/pom.xml?rev=698501&view=auto
==============================================================================
--- jackrabbit/sandbox/jcrutil/pom.xml (added)
+++ jackrabbit/sandbox/jcrutil/pom.xml Wed Sep 24 03:08:44 2008
@@ -0,0 +1,116 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.jcrutil</groupId>
+  <artifactId>jcrutil</artifactId>
+  <packaging>jar</packaging>
+  <version>1.0-SNAPSHOT</version>
+  <name>jcrutil</name>
+  
+  <repositories>
+    <repository>
+	  <id>jets3t</id>
+	  <name>jets3t</name>
+	  <url>http://jets3t.s3.amazonaws.com/maven2/</url>
+	</repository>
+	<repository>
+	  <id>apache-snapshots</id>
+	  <name>apache-snapshots</name>
+	  <url>http://people.apache.org/repo/m2-snapshot-repository/</url>
+	</repository>
+  </repositories>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>1.5</source>
+          <target>1.5</target>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+  
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>3.8.1</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <version>1.4.3</version>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <version>1.4.3</version>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>jcl104-over-slf4j</artifactId>
+      <version>1.4.3</version>
+    </dependency>
+    <dependency>
+      <groupId>javax.jcr</groupId>
+      <artifactId>jcr</artifactId>
+      <version>1.0</version>
+    </dependency>
+    <dependency>
+      <groupId>commons-vfs</groupId>
+      <artifactId>commons-vfs</artifactId>
+      <version>1.0</version>
+    </dependency>
+    <dependency>
+      <groupId>net.java.dev.jets3t</groupId>
+      <artifactId>jets3t</artifactId>
+      <version>0.6.1</version>
+    </dependency>
+    <dependency>
+      <groupId>net.sf.ehcache</groupId>
+      <artifactId>ehcache</artifactId>
+      <version>1.3.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.jackrabbit</groupId>
+      <artifactId>jackrabbit-api</artifactId>
+      <version>1.5-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.jackrabbit</groupId>
+      <artifactId>jackrabbit-core</artifactId>
+      <version>1.5-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.jackrabbit</groupId>
+      <artifactId>jackrabbit-jcr-commons</artifactId>
+      <version>1.5-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.jackrabbit</groupId>
+      <artifactId>jackrabbit-spi</artifactId>
+      <version>1.5-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.jackrabbit</groupId>
+      <artifactId>jackrabbit-spi-commons</artifactId>
+      <version>1.5-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.jackrabbit</groupId>
+      <artifactId>jackrabbit-text-extractors</artifactId>
+      <version>1.5-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.jackrabbit</groupId>
+      <artifactId>jackrabbit-jcr-server</artifactId>
+      <version>1.5-SNAPSHOT</version>
+    </dependency>
+  </dependencies>
+</project>

Propchange: jackrabbit/sandbox/jcrutil/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/sandbox/jcrutil/repository.xml
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jcrutil/repository.xml?rev=698501&view=auto
==============================================================================
--- jackrabbit/sandbox/jcrutil/repository.xml (added)
+++ jackrabbit/sandbox/jcrutil/repository.xml Wed Sep 24 03:08:44 2008
@@ -0,0 +1,151 @@
+<?xml version="1.0"?>
+<!--
+   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.
+-->
+<!DOCTYPE Repository PUBLIC "-//The Apache Software Foundation//DTD Jackrabbit 1.5//EN"
+                            "http://jackrabbit.apache.org/dtd/repository-1.5.dtd">
+<!-- Example Repository Configuration File
+     Used by
+     - org.apache.jackrabbit.core.config.RepositoryConfigTest.java
+     -
+-->
+<Repository>
+    <!--
+        virtual file system where the repository stores global state
+        (e.g. registered namespaces, custom node types, etc.)
+    -->
+    <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
+        <param name="path" value="${rep.home}/repository"/>
+    </FileSystem>
+
+    <!--
+        security configuration
+    -->
+    <Security appName="Jackrabbit">
+        <!--
+            security manager:
+            class: FQN of class implementing the JackrabbitSecurityManager interface
+        -->
+        <SecurityManager class="org.apache.jackrabbit.core.security.simple.SimpleSecurityManager" workspaceName="security">
+            <!--
+            workspace access:
+            class: FQN of class implementing the WorkspaceAccessManager interface
+            -->
+            <!-- <WorkspaceAccessManager class="..."/> -->
+            <!-- <param name="config" value="${rep.home}/security.xml"/> -->
+        </SecurityManager>
+
+        <!--
+            access manager:
+            class: FQN of class implementing the AccessManager interface
+        -->
+        <AccessManager class="org.apache.jackrabbit.core.security.simple.SimpleAccessManager">
+            <!-- <param name="config" value="${rep.home}/access.xml"/> -->
+        </AccessManager>
+
+        <LoginModule class="org.apache.jackrabbit.core.security.simple.SimpleLoginModule">
+           <!-- anonymous user id -->
+           <param name="anonymousId" value="anonymous"/>
+           <!-- administrator user id (default value if param is missing is 'admin') -->
+           <param name="adminId" value="admin"/>
+           <!--
+              default user name to be used instead of the anonymous user
+              when no login credentials are provided (unset by default)
+           -->
+           <!-- <param name="defaultUserId" value="superuser"/> -->
+        </LoginModule>
+    </Security>
+
+    <!--
+        location of workspaces root directory and name of default workspace
+    -->
+    <Workspaces rootPath="${rep.home}/workspaces" defaultWorkspace="default"/>
+    <!--
+        workspace configuration template:
+        used to create the initial workspace if there's no workspace yet
+    -->
+    <Workspace name="${wsp.name}">
+        <!--
+            virtual file system of the workspace:
+            class: FQN of class implementing the FileSystem interface
+        -->
+        <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
+            <param name="path" value="${wsp.home}"/>
+        </FileSystem>
+        <!--
+            persistence manager of the workspace:
+            class: FQN of class implementing the PersistenceManager interface
+        -->
+        <PersistenceManager class="org.apache.jackrabbit.core.persistence.bundle.DerbyPersistenceManager">
+          <param name="url" value="jdbc:derby:${wsp.home}/db;create=true"/>
+          <param name="schemaObjectPrefix" value="${wsp.name}_"/>
+        </PersistenceManager>
+        <!--
+            Search index and the file system it uses.
+            class: FQN of class implementing the QueryHandler interface
+        -->
+        <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
+            <param name="path" value="${wsp.home}/index"/>
+            <param name="textFilterClasses" value="org.apache.jackrabbit.extractor.MsWordTextExtractor,org.apache.jackrabbit.extractor.MsExcelTextExtractor,org.apache.jackrabbit.extractor.MsPowerPointTextExtractor,org.apache.jackrabbit.extractor.PdfTextExtractor,org.apache.jackrabbit.extractor.OpenOfficeTextExtractor,org.apache.jackrabbit.extractor.RTFTextExtractor,org.apache.jackrabbit.extractor.HTMLTextExtractor,org.apache.jackrabbit.extractor.XMLTextExtractor"/>
+            <param name="extractorPoolSize" value="2"/>
+            <param name="supportHighlighting" value="true"/>
+        </SearchIndex>
+    </Workspace>
+
+    <!--
+        Configures the versioning
+    -->
+    <Versioning rootPath="${rep.home}/version">
+        <!--
+            Configures the filesystem to use for versioning for the respective
+            persistence manager
+        -->
+        <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
+            <param name="path" value="${rep.home}/version" />
+        </FileSystem>
+
+        <!--
+            Configures the persistence manager to be used for persisting version state.
+            Please note that the current versioning implementation is based on
+            a 'normal' persistence manager, but this could change in future
+            implementations.
+        -->
+        <PersistenceManager class="org.apache.jackrabbit.core.persistence.bundle.DerbyPersistenceManager">
+          <param name="url" value="jdbc:derby:${rep.home}/version/db;create=true"/>
+          <param name="schemaObjectPrefix" value="version_"/>
+        </PersistenceManager>
+    </Versioning>
+
+    <!--
+        Search index for content that is shared repository wide
+        (/jcr:system tree, contains mainly versions)
+    -->
+    <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
+        <param name="path" value="${rep.home}/repository/index"/>
+        <param name="textFilterClasses" value="org.apache.jackrabbit.extractor.MsWordTextExtractor,org.apache.jackrabbit.extractor.MsExcelTextExtractor,org.apache.jackrabbit.extractor.MsPowerPointTextExtractor,org.apache.jackrabbit.extractor.PdfTextExtractor,org.apache.jackrabbit.extractor.OpenOfficeTextExtractor,org.apache.jackrabbit.extractor.RTFTextExtractor,org.apache.jackrabbit.extractor.HTMLTextExtractor,org.apache.jackrabbit.extractor.XMLTextExtractor"/>
+        <param name="extractorPoolSize" value="2"/>
+        <param name="supportHighlighting" value="true"/>
+    </SearchIndex>
+    <!--
+    <DataStore class="org.jcrutil.S3DataStore">
+        <param name="awsAccessKey" value="" />
+        <param name="awsSecretKey" value="" />
+        <param name="bucketName" value="" />
+        <param name="minModifiedDate" value="0" />
+        <param name="minRecordLength" value="0" />
+    </DataStore>
+    -->
+</Repository>

Propchange: jackrabbit/sandbox/jcrutil/repository.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/JcrFileObject.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/JcrFileObject.java?rev=698501&view=auto
==============================================================================
--- jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/JcrFileObject.java (added)
+++ jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/JcrFileObject.java Wed Sep 24 03:08:44 2008
@@ -0,0 +1,404 @@
+/*
+ * JcrFileObject.java
+ */
+package org.jcrutil;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.PathNotFoundException;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.commons.vfs.FileObject;
+import org.apache.commons.vfs.FileSystemException;
+import org.apache.commons.vfs.FileType;
+import org.apache.commons.vfs.provider.AbstractFileObject;
+import org.apache.commons.vfs.provider.GenericFileName;
+import org.apache.commons.vfs.provider.URLFileName;
+import org.apache.commons.vfs.util.MonitorOutputStream;
+import org.apache.jackrabbit.api.jsr283.security.AccessControlManager;
+import org.apache.jackrabbit.api.jsr283.security.Privilege;
+import org.apache.jackrabbit.core.SessionImpl;
+import org.apache.jackrabbit.core.security.authorization.PrivilegeRegistry;
+import org.apache.jackrabbit.server.io.MimeResolver;
+
+/**
+ * A JCR base FileObject for VFS
+ * 
+ * @author scott
+ */
+public class JcrFileObject extends AbstractFileObject implements FileObject {
+    /** The Log */
+    private static Log log = LogFactory.getLog(JcrFileObject.class);
+
+    /** The MimeResolver */
+    private static MimeResolver MIME_RESOLVER = new MimeResolver();
+    
+    /** The FileSystem */
+    private JcrFileSystem jcrFs;
+
+    /** The FileName */
+    private GenericFileName gfName;
+
+    /** The Node represented by this FileObject */
+    private Node node;
+
+    /**
+     * Create a new FileObject
+     * 
+     * @param node
+     * @param name
+     * @param fs
+     */
+    protected JcrFileObject(Node node, GenericFileName name, JcrFileSystem fs) {
+        super(name, fs);
+        log.debug("Creating JcrFileObject: " + name.getPath());
+        this.gfName = name;
+        this.jcrFs = fs;
+        this.node = node;
+    }
+
+    /**
+     * Create a new FileObject
+     * 
+     * @param name
+     * @param fs
+     */
+    protected JcrFileObject(GenericFileName name, JcrFileSystem fs) {
+        this(null, name, fs);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected long doGetContentSize() throws Exception {
+        log.debug("JcrFileObject: doGetContentSize: " + gfName.getPath());
+        return node.getNode("jcr:content").getProperty("jcr:data").getLength();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected InputStream doGetInputStream() throws Exception {
+        log.debug("JcrFileObject: doGetInputStream: " + gfName.getPath());
+        return node.getNode("jcr:content").getProperty("jcr:data").getStream();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected OutputStream doGetOutputStream(boolean bAppend) throws Exception {
+        log.debug("JcrFileObject: doGetOutputStream: " + gfName.getPath());
+        return new JcrOutputStream(getFileSystem().getFileSystemManager().resolveFile("tmp://jcr-tmp-" + UUID.randomUUID()));
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected FileType doGetType() throws Exception {
+        return JcrFileObject.getFileType(node);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected String[] doListChildren() throws Exception {
+        log.debug("JcrFileObject: doListChildren: " + gfName.getPath());
+        // Use doListChildrenResolved instead
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected FileObject[] doListChildrenResolved() throws Exception {
+        log.debug("JcrFileObject: doListChildrenResolved: " + gfName.getPath());
+
+        List<FileObject> children = new ArrayList<FileObject>();
+        NodeIterator iter = node.getNodes();
+        while (iter.hasNext()) {
+            Node child = iter.nextNode();
+
+            FileType type = JcrFileObject.getFileType(child);
+            log.debug("JcrFileObject: doListChildrenResolved: ChildNode: " + node.getPath());
+            
+            if (type == null) {
+                continue;
+            }
+
+            URLFileName ufn = new URLFileName(gfName.getScheme(), gfName.getHostName(), gfName.getPort(), gfName
+                    .getDefaultPort(), gfName.getUserName(), gfName.getPassword(), child.getPath(), type, null);
+
+            children.add(new JcrFileObject(child, ufn, jcrFs));
+        }
+
+        int numItems = children.size();
+        FileObject[] childArray = new FileObject[numItems];
+        childArray = children.toArray(childArray);
+
+        return childArray;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void doAttach() throws Exception {
+        log.debug("JcrFileObject: doAttach: " + gfName.getPath());
+
+        // check if already attached
+        if (node != null) {
+            return;
+        }
+
+        Session session = jcrFs.getSession();
+        Node root = session.getRootNode();
+
+        try {
+            String pathName = gfName.getPath();
+            if (pathName.startsWith("/")) {
+                pathName = pathName.substring(1);
+            }
+
+            if (pathName.length() > 0) {
+                node = root.getNode(pathName);
+            } else {
+                node = root;
+            }
+
+        } catch (PathNotFoundException e) {
+            node = null;
+        }
+        
+        log.debug("JcrFileObject: doAttach: Type: " + JcrFileObject.getFileType(node));
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void doDetach() throws Exception {
+        log.debug("JcrFileObject: doDetach: " + gfName.getPath());
+        node = null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void doCreateFolder() throws Exception {
+        log.debug("JcrFileObject: doCreateFolder: " + gfName.getPath());
+        JcrFileObject parent = (JcrFileObject) getParent();
+        FileType parentType = parent.getType();
+        if (!FileType.FOLDER.equals(parentType)) {
+            throw new IOException("Invalid parent node type: " + parentType);
+        }
+
+        FileType type = getType();
+        if (FileType.IMAGINARY.equals(type)) {
+            Node folderNode = parent.getNode().addNode(getName().getBaseName(), "nt:folder");
+            JcrFileObject.this.node = folderNode;
+        } else {
+            throw new IOException("Invalid node type: " + type);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void doDelete() throws Exception {
+        log.debug("JcrFileObject: doDelete: " + gfName.getPath());
+        node.remove();
+        jcrFs.getSession().save();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void doRename(FileObject newFile) throws Exception {
+        log.debug("JcrFileObject: doRename: " + gfName.getPath());
+        jcrFs.getSession().move(node.getPath(), newFile.getName().getPath());
+        jcrFs.getSession().save();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected long doGetLastModifiedTime() throws Exception {
+        String type = node.getProperty("jcr:primaryType").getString();
+        if ("nt:file".equals(type)) {
+            return node.getNode("jcr:content").getProperty("jcr:lastModified").getDate().getTimeInMillis();
+        } else if ("nt:folder".equals(type)) {
+            return node.getProperty("jcr:created").getDate().getTimeInMillis();
+        } else {
+            log.info("Unable to get time for: " + node.getPath());
+        }
+        
+        return 0;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void doSetLastModifiedTime(final long modtime) throws Exception {
+        String type = node.getProperty("jcr:primaryType").getString();
+        if ("nt:file".equals(type)) {
+            Calendar lastModified = Calendar.getInstance();
+            lastModified.setTimeInMillis(modtime);
+            node.getNode("jcr:content").setProperty("jcr:lastModified", lastModified);
+            jcrFs.getSession().save();
+        } else {
+            log.info("Unable to set time for: " + node.getPath());
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected Map doGetAttributes() throws Exception {
+        log.debug("JcrFileObject: doGetAttributes: " + gfName.getPath());
+        // TODO
+        return Collections.EMPTY_MAP;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected boolean doIsReadable() throws Exception {
+        log.debug("JcrFileObject: doIsReadable: " + gfName.getPath());
+        SessionImpl sess = (SessionImpl) jcrFs.getSession();
+        AccessControlManager acm = sess.getAccessControlManager();
+        PrivilegeRegistry pr = new PrivilegeRegistry(sess);
+        return acm.hasPrivileges(getName().getPath(), pr.getPrivileges(PrivilegeRegistry.READ));
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected boolean doIsWriteable() throws Exception {
+        log.debug("JcrFileObject: doIsWriteable: " + gfName.getPath());
+        SessionImpl sess = (SessionImpl) jcrFs.getSession();
+        AccessControlManager acm = sess.getAccessControlManager();
+        PrivilegeRegistry pr = new PrivilegeRegistry(sess);
+        return acm.hasPrivileges(getName().getPath(), pr.getPrivileges(PrivilegeRegistry.WRITE));
+    }
+
+    // get/set
+
+    /**
+     * @return the node
+     */
+    public Node getNode() {
+        return node;
+    }
+
+    // utility
+
+    /**
+     * Get FileType of <code>node</code>
+     * 
+     * @param node The Node
+     */
+    public static FileType getFileType(Node node) throws RepositoryException {
+        if (node == null) {
+            return FileType.IMAGINARY;
+        }
+
+        String type = node.getPrimaryNodeType().getName();
+        if ("nt:folder".equals(type) || "rep:root".equals(type)) {
+            return FileType.FOLDER;
+        } else if ("nt:file".equals(type) || "nt:linkedFile".equals(type)) {
+            return FileType.FILE;
+        } else {
+            log.info("Unknown node type: " + type);
+        }
+
+        return null;
+    }
+
+    /**
+     * OutputStream that uses a temp file
+     * 
+     * @author scott
+     */
+    private class JcrOutputStream extends MonitorOutputStream {
+        /** The temp file */
+        private final FileObject tmpFile;
+
+        /**
+         * Create JcrOutputStream
+         * 
+         * @param tmpFile
+         * @throws FileSystemException
+         */
+        public JcrOutputStream(FileObject tmpFile) throws FileSystemException {
+            super(tmpFile.getContent().getOutputStream());
+            log.debug("JcrOutputStream.constructor: " + gfName.getPath());
+            this.tmpFile = tmpFile;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        protected void onClose() throws IOException {
+            try {
+                log.debug("JcrOutputStream.onClose: " + gfName.getPath());
+                
+                JcrFileObject parent = (JcrFileObject) getParent();
+                FileType parentType = parent.getType();
+                if (!FileType.FOLDER.equals(parentType)) {
+                    throw new IOException("Invalid parent node type: " + parentType);
+                }
+                
+                Node resNode = null;
+                if (FileType.IMAGINARY.equals(doGetType())) {
+                    Node fileNode = parent.getNode().addNode(getName().getBaseName(), "nt:file");
+                    JcrFileObject.this.node = fileNode;
+                    resNode = fileNode.addNode("jcr:content", "nt:unstructured");
+                } else {
+                    resNode = JcrFileObject.this.node.getNode("jcr:content");
+                }
+
+                Calendar lastModified = Calendar.getInstance();
+                resNode.setProperty("jcr:mimeType", MIME_RESOLVER.getMimeType(getName().getBaseName()));
+                resNode.setProperty("jcr:data", new BufferedInputStream(tmpFile.getContent().getInputStream()));
+                resNode.setProperty("jcr:lastModified", lastModified);
+                jcrFs.getSession().save();
+
+            } catch (Exception e) {
+                throw new IOException(e.getMessage());
+            } finally {
+                tmpFile.close();
+                tmpFile.delete();
+            }
+        }
+    }
+
+}

Propchange: jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/JcrFileObject.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/JcrFileProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/JcrFileProvider.java?rev=698501&view=auto
==============================================================================
--- jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/JcrFileProvider.java (added)
+++ jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/JcrFileProvider.java Wed Sep 24 03:08:44 2008
@@ -0,0 +1,140 @@
+/*
+ * JcrFileProvider.java
+ */
+package org.jcrutil;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+
+import javax.jcr.Credentials;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.commons.vfs.Capability;
+import org.apache.commons.vfs.FileName;
+import org.apache.commons.vfs.FileSystem;
+import org.apache.commons.vfs.FileSystemException;
+import org.apache.commons.vfs.FileSystemOptions;
+import org.apache.commons.vfs.UserAuthenticationData;
+import org.apache.commons.vfs.provider.AbstractOriginatingFileProvider;
+import org.apache.commons.vfs.provider.FileProvider;
+import org.apache.commons.vfs.provider.GenericFileName;
+import org.apache.commons.vfs.provider.http.HttpFileNameParser;
+import org.apache.commons.vfs.util.UserAuthenticatorUtils;
+import org.apache.jackrabbit.core.TransientRepository;
+
+/**
+ * A JCR based provider for VFS
+ * 
+ * @author scott
+ */
+public class JcrFileProvider extends AbstractOriginatingFileProvider implements FileProvider {
+    private static Log LOG = LogFactory.getLog(JcrFileProvider.class);
+    
+    /** Filesystem capabilities */
+    protected final static Collection capabilities = Collections.unmodifiableCollection(Arrays.asList(new Capability[]{
+            Capability.ATTRIBUTES, Capability.CREATE, Capability.DELETE, Capability.GET_LAST_MODIFIED, Capability.GET_TYPE,
+            Capability.LIST_CHILDREN, Capability.RANDOM_ACCESS_READ, Capability.READ_CONTENT, Capability.RENAME,
+            Capability.URI, Capability.WRITE_CONTENT}));
+
+    /** UserAuthenticationData */
+    public final static UserAuthenticationData.Type[] AUTHENTICATOR_TYPES = new UserAuthenticationData.Type[]{
+            UserAuthenticationData.USERNAME, UserAuthenticationData.PASSWORD};
+
+    /**
+     * Create new JcrFileProvider
+     */
+    public JcrFileProvider() {
+        super();
+        LOG.debug("Creating new JcrFileProvider");
+        setFileNameParser(HttpFileNameParser.getInstance());
+    }
+
+    /**
+     * Create the FileSystem
+     * 
+     * @param fileName The FileName
+     * @param options The FileSystemOptions
+     * @return The FileSystem
+     */
+    protected FileSystem doCreateFileSystem(FileName fileName, FileSystemOptions options) throws FileSystemException {
+        UserAuthenticationData authData = null;
+        GenericFileName genericName = (GenericFileName) fileName;
+        Repository repository = null;
+        Session session = null;
+
+        try {
+            repository = getRepository();
+
+            authData = UserAuthenticatorUtils.authenticate(options, AUTHENTICATOR_TYPES);
+            char[] userName = UserAuthenticatorUtils.getData(authData, UserAuthenticationData.USERNAME, UserAuthenticatorUtils
+                    .toChar(genericName.getUserName()));
+            char[] pass = UserAuthenticatorUtils.getData(authData, UserAuthenticationData.PASSWORD, UserAuthenticatorUtils
+                    .toChar(genericName.getPassword()));
+
+            if (userName == null) {
+                userName = new char[]{};
+            }
+
+            if (pass == null) {
+                pass = new char[]{};
+            }
+
+            Credentials cred = new SimpleCredentials(new String(userName), pass);
+            session = repository.login(cred, genericName.getHostName());
+        } catch (Exception e) {
+            throw new FileSystemException("Unable to connect to repository.", e);
+        }
+
+        return new JcrFileSystem(session, fileName, null, options);
+    }
+
+    /**
+     * Get Collection of Capabilities
+     * 
+     * @return Collection of Capabilities
+     */
+    public Collection getCapabilities() {
+        return capabilities;
+    }
+
+    // Repository
+    private static Repository repository;
+
+    public static Repository getRepository() throws IOException, NamingException, RepositoryException {
+        LOG.debug("getRepository");
+        
+        repository = getJNDIRepository();
+        
+        if (repository == null) {
+            repository = new TransientRepository();
+        }
+        
+        return repository;
+    }
+    
+    public static Repository getJNDIRepository() throws RepositoryException {
+        Repository r = null;
+        
+        try {
+            InitialContext context = new InitialContext();
+            Context environment = (Context) context.lookup("java:comp/env");
+            r = (Repository) environment.lookup("jcr/repository");
+            
+            LOG.debug("Found repository: " + r);
+        } catch (NamingException ne) {
+            LOG.warn("Unable to locate repository via JNDI: " + ne);
+        }
+        
+        return r;
+    }
+}

Propchange: jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/JcrFileProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/JcrFileSystem.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/JcrFileSystem.java?rev=698501&view=auto
==============================================================================
--- jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/JcrFileSystem.java (added)
+++ jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/JcrFileSystem.java Wed Sep 24 03:08:44 2008
@@ -0,0 +1,74 @@
+/*
+ * JcrFileSystem.java
+ */
+package org.jcrutil;
+
+import java.util.Collection;
+
+import javax.jcr.Session;
+
+import org.apache.commons.vfs.FileName;
+import org.apache.commons.vfs.FileObject;
+import org.apache.commons.vfs.FileSystem;
+import org.apache.commons.vfs.FileSystemOptions;
+import org.apache.commons.vfs.provider.AbstractFileSystem;
+import org.apache.commons.vfs.provider.GenericFileName;
+
+/**
+ * A JCR based FileSystem for VFS
+ * @author scott
+ *
+ */
+public class JcrFileSystem extends AbstractFileSystem implements FileSystem {
+
+    /** The session */
+    private Session session;
+
+    /**
+     * Create a JcrFileSystem
+     * @param repository The repository
+     * @param session The session
+     * @param rootName The root name
+     * @param parentLayer The parent layer
+     * @param fileSystemOptions The options
+     */
+    protected JcrFileSystem(Session session, FileName rootName, FileObject parentLayer,
+            FileSystemOptions fileSystemOptions) {
+        super(rootName, parentLayer, fileSystemOptions);
+        this.session = session;
+    }
+
+    /**
+     * Add capabilities of this <code>FileSystem</code> to
+     * <code>capabilities</code>.
+     * @param capabilities A Collection of capabilities
+     */
+    @Override
+    protected void addCapabilities(Collection capabilities) {
+        capabilities.addAll(JcrFileProvider.capabilities);
+    }
+
+    /**
+     * Create a new FileObject
+     * @param fileName The FileName
+     */
+    @Override
+    protected FileObject createFile(FileName fileName) throws Exception {
+        return new JcrFileObject((GenericFileName) fileName, this);
+    }
+
+    /**
+     * @return the session
+     */
+    public Session getSession() {
+        return session;
+    }
+    
+    public void close() {
+    	super.close();
+    	if (session != null) {
+    		session.logout();
+    	}
+    }
+
+}

Propchange: jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/JcrFileSystem.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3DataRecord.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3DataRecord.java?rev=698501&view=auto
==============================================================================
--- jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3DataRecord.java (added)
+++ jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3DataRecord.java Wed Sep 24 03:08:44 2008
@@ -0,0 +1,106 @@
+/*
+ * S3DataRecord.java
+ */
+package org.jcrutil;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.Date;
+
+import net.sf.ehcache.Cache;
+import net.sf.ehcache.CacheManager;
+import net.sf.ehcache.Element;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.jackrabbit.core.data.AbstractDataRecord;
+import org.apache.jackrabbit.core.data.DataIdentifier;
+import org.apache.jackrabbit.core.data.DataRecord;
+import org.apache.jackrabbit.core.data.DataStoreException;
+import org.jets3t.service.S3Service;
+import org.jets3t.service.impl.rest.httpclient.RestS3Service;
+import org.jets3t.service.model.S3Bucket;
+import org.jets3t.service.model.S3Object;
+
+public class S3DataRecord extends AbstractDataRecord implements DataRecord {
+    /** The Log */
+    private static Log LOG = LogFactory.getLog(S3DataRecord.class);
+    
+    /** The S3Object */
+    private S3Object s3Object;
+    
+    /** The DataStore */
+    private S3DataStore dataStore;
+    
+    /** The DataIdentifier */
+    private DataIdentifier identifier;
+    
+    /**
+     * Create new DataRecord
+     * @param identifier The DataIdentifier
+     * @param s3Object The S3Object
+     */
+    public S3DataRecord(S3DataStore dataStore, DataIdentifier identifier, S3Object s3Object) {
+        super(identifier);
+        this.dataStore = dataStore;
+        this.identifier = identifier;
+        this.s3Object = s3Object;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public long getLastModified() {
+        Date lastMod = s3Object.getLastModifiedDate();
+        if (lastMod != null)
+            return lastMod.getTime();
+        
+        return 0;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public long getLength() throws DataStoreException {
+        return s3Object.getContentLength();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public InputStream getStream() throws DataStoreException {
+        LOG.debug("getStream: " + identifier.toString());
+        InputStream is = null;
+        
+        try {
+            Cache s3oContentCache = CacheManager.getInstance().getCache("s3oContentCache");
+            Element elem = s3oContentCache.get(s3Object.getKey());
+            if (elem != null) {
+                String path = (String) elem.getValue();
+                File tmp = new File(path);
+                if (tmp.exists()) {
+                    is = new BufferedInputStream(new FileInputStream(tmp));
+                }
+            }
+            
+            if (is == null) {
+                S3Service s3Service = new RestS3Service(dataStore.getAwsCredentials());
+                s3Object = s3Service.getObject(new S3Bucket(dataStore.getBucketName()), identifier.toString());
+                is = s3Object.getDataInputStream();
+            }
+        } catch (Exception se) {
+            throw new DataStoreException(se);
+        }
+        
+        return is;
+    }
+
+    /**
+     * @return the s3Object
+     */
+    public S3Object getS3Object() {
+        return s3Object;
+    }
+}

Propchange: jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3DataRecord.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3DataStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3DataStore.java?rev=698501&view=auto
==============================================================================
--- jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3DataStore.java (added)
+++ jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3DataStore.java Wed Sep 24 03:08:44 2008
@@ -0,0 +1,342 @@
+/*
+ * S3DataStore.java
+ */
+package org.jcrutil;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.lang.ref.WeakReference;
+import java.util.Collections;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.UUID;
+import java.util.WeakHashMap;
+
+import javax.jcr.RepositoryException;
+
+import net.sf.ehcache.Cache;
+import net.sf.ehcache.CacheManager;
+import net.sf.ehcache.Element;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.jackrabbit.core.data.DataIdentifier;
+import org.apache.jackrabbit.core.data.DataRecord;
+import org.apache.jackrabbit.core.data.DataStore;
+import org.apache.jackrabbit.core.data.DataStoreException;
+import org.jets3t.service.S3Service;
+import org.jets3t.service.S3ServiceException;
+import org.jets3t.service.impl.rest.httpclient.RestS3Service;
+import org.jets3t.service.model.S3Bucket;
+import org.jets3t.service.model.S3Object;
+import org.jets3t.service.security.AWSCredentials;
+import org.jets3t.service.utils.Mimetypes;
+
+public class S3DataStore implements DataStore {
+    /** The Log */
+    private static Log LOG = LogFactory.getLog(S3DataStore.class);
+
+    /** Cached credentials */
+    protected AWSCredentials awsCredentials;
+
+    /** Config parameter awsAccessKey */
+    protected String awsAccessKey;
+
+    /** Config parameter awsSecretKey */
+    protected String awsSecretKey;
+
+    /** Config parameter bucketName */
+    protected String bucketName;
+
+    /** Config parameter minModifiedDate */
+    protected long minModifiedDate;
+
+    /** Config parameter minRecordLength */
+    protected int minRecordLength;
+
+    /** The S3Service */
+    private S3Service s3Service;
+
+    /** S3Object cache */
+    // private Cache s3oCache;
+    /**
+     * All data identifiers that are currently in use are in this set until they
+     * are garbage collected.
+     */
+    protected Map inUse = Collections.synchronizedMap(new WeakHashMap());
+
+    /**
+     * Create a new DataStore
+     */
+    public S3DataStore() {
+        LOG.debug("Creating S3DataStore");
+    }
+
+    // start DataStore methods
+
+    /**
+     * {@inheritDoc}
+     */
+    public DataRecord addRecord(InputStream stream) throws DataStoreException {
+        DataIdentifier identifier = null;
+        S3Object s3o = null;
+
+        try {
+            String uuid = UUID.randomUUID().toString();
+            LOG.debug("Adding DataRecord: " + uuid);
+
+            File tmp = File.createTempFile("s3-", ".tmp");
+            tmp.deleteOnExit();
+            
+            InputStream in = new BufferedInputStream(stream, 4096);
+            OutputStream out = new BufferedOutputStream(new FileOutputStream(tmp), 4096);
+            int i = 0;
+            byte[] buf = new byte[4096];
+            while ((i = in.read(buf)) != -1) {
+                out.write(buf, 0, i);
+            }
+            
+            out.close();
+            
+            Cache s3oContentCache = CacheManager.getInstance().getCache("s3oContentCache");
+            s3oContentCache.put(new Element(uuid, tmp.getAbsolutePath()));
+            
+            S3DataTransfer dt = new S3DataTransfer(s3Service, bucketName, uuid, tmp);
+            new Thread(dt).start();
+            
+            S3Bucket s3b = new S3Bucket(bucketName);
+            s3o = new S3Object(s3b, uuid);
+            s3o.setContentLength(tmp.length());
+            s3o.setLastModifiedDate(new Date(tmp.lastModified()));
+            s3o.setContentType(Mimetypes.getInstance().getMimetype(tmp));
+            
+            Cache s3oCache = CacheManager.getInstance().getCache("s3oCache");
+            s3oCache.put(new Element(uuid, s3o));
+
+            identifier = new DataIdentifier(uuid);
+            usesIdentifier(identifier);
+        } catch (Exception e) {
+            throw new DataStoreException(e);
+        }
+
+        return new S3DataRecord(this, identifier, s3o);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void clearInUse() {
+        LOG.debug("clearInUse");
+        inUse.clear();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void close() throws DataStoreException {
+        LOG.debug("close");
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public int deleteAllOlderThan(long min) throws DataStoreException {
+        LOG.debug("deleteAllOlderThan");
+        int deleted = 0;
+
+        for (Iterator i = getAllIdentifiers(); i.hasNext();) {
+            S3DataRecord rec = (S3DataRecord) i.next();
+            if (rec.getLastModified() < min) {
+                deleteRecord(new DataIdentifier(rec.getS3Object().getKey()));
+                deleted++;
+            }
+        }
+
+        return deleted;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Iterator getAllIdentifiers() throws DataStoreException {
+        LOG.debug("getAllIdentifiers");
+        return new S3DataStoreIterator(this, awsCredentials, bucketName);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public int getMinRecordLength() {
+        LOG.debug("getMinRecordLength");
+        return minRecordLength;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public DataRecord getRecord(DataIdentifier identifier) throws DataStoreException {
+        LOG.debug("getRecord: " + identifier);
+
+        try {
+            String ident = identifier.toString();
+            Cache s3oCache = CacheManager.getInstance().getCache("s3oCache");
+            Element elem = s3oCache.get(ident);
+
+            S3Object s3o = null;
+            if (elem != null) {
+                LOG.debug("getRecord cache hit: " + ident);
+                s3o = (S3Object) elem.getValue();
+            } else {
+                LOG.debug("getRecord adding to cache: " + ident);
+                s3o = s3Service.getObjectDetails(new S3Bucket(bucketName), ident);
+                s3oCache.put(new Element(ident, s3o));
+            }
+
+            usesIdentifier(identifier);
+
+            if (minModifiedDate > 0) {
+                Date lmd = s3o.getLastModifiedDate();
+                if (lmd.getTime() < minModifiedDate) {
+                    s3o.setLastModifiedDate(new Date());
+                    s3Service.updateObjectMetadata(bucketName, s3o);
+                    s3oCache.put(new Element(ident, s3o));
+                }
+            }
+
+            return new S3DataRecord(this, identifier, s3o);
+        } catch (S3ServiceException se) {
+            throw new DataStoreException(se);
+        }
+    }
+
+    /**
+     * Delete data record
+     * 
+     * @param identifier The DataIdentifier
+     */
+    public void deleteRecord(DataIdentifier identifier) throws DataStoreException {
+        LOG.debug("deleteRecord: " + identifier);
+
+        try {
+            s3Service.deleteObject(new S3Bucket(bucketName), identifier.toString());
+        } catch (S3ServiceException se) {
+            throw new DataStoreException(se);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void init(String homeDir) throws RepositoryException {
+        LOG.debug("Init...");
+
+        try {
+            awsCredentials = new AWSCredentials(awsAccessKey, awsSecretKey);
+            s3Service = new RestS3Service(awsCredentials);
+            LOG.debug("Max http connections: "
+                    + s3Service.getJetS3tProperties().getStringProperty("httpclient.max-connections", "Unknown"));
+
+            if (!s3Service.isBucketAccessible(bucketName)) {
+                LOG.debug("Creating bucket: " + bucketName);
+                s3Service.createBucket(bucketName);
+            }
+        } catch (S3ServiceException se) {
+            throw new RepositoryException(se);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void updateModifiedDateOnAccess(long before) {
+        LOG.debug("updateModifiedDateOnAccess");
+        minModifiedDate = before;
+    }
+
+    // end DataStore methods
+
+    /**
+     * Add WeakReference to inUse Map
+     * 
+     * @param identifier The DataIdentifier
+     */
+    private void usesIdentifier(DataIdentifier identifier) {
+        inUse.put(identifier, new WeakReference(identifier));
+    }
+
+    /**
+     * @return the awsAccessKey
+     */
+    public String getAwsAccessKey() {
+        return awsAccessKey;
+    }
+
+    /**
+     * @param awsAccessKey the awsAccessKey to set
+     */
+    public void setAwsAccessKey(String awsAccessKey) {
+        this.awsAccessKey = awsAccessKey;
+    }
+
+    /**
+     * @return the awsSecretKey
+     */
+    public String getAwsSecretKey() {
+        return awsSecretKey;
+    }
+
+    /**
+     * @param awsSecretKey the awsSecretKey to set
+     */
+    public void setAwsSecretKey(String awsSecretKey) {
+        this.awsSecretKey = awsSecretKey;
+    }
+
+    /**
+     * @return the minModifiedDate
+     */
+    public long getMinModifiedDate() {
+        return minModifiedDate;
+    }
+
+    /**
+     * @param minModifiedDate the minModifiedDate to set
+     */
+    public void setMinModifiedDate(long minModifiedDate) {
+        this.minModifiedDate = minModifiedDate;
+    }
+
+    /**
+     * @param minRecordLength the minRecordLength to set
+     */
+    public void setMinRecordLength(int minRecordLength) {
+        this.minRecordLength = minRecordLength;
+    }
+
+    /**
+     * @return the bucketName
+     */
+    public String getBucketName() {
+        return bucketName;
+    }
+
+    /**
+     * @param bucketName the bucketName to set
+     */
+    public void setBucketName(String bucketName) {
+        this.bucketName = bucketName;
+    }
+
+    /**
+     * @return the awsCredentials
+     */
+    public AWSCredentials getAwsCredentials() {
+        return awsCredentials;
+    }
+
+}

Propchange: jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3DataStore.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3DataStoreIterator.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3DataStoreIterator.java?rev=698501&view=auto
==============================================================================
--- jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3DataStoreIterator.java (added)
+++ jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3DataStoreIterator.java Wed Sep 24 03:08:44 2008
@@ -0,0 +1,38 @@
+/*
+ * S3DataStoreIterator.java
+ */
+package org.jcrutil;
+
+import java.util.Iterator;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.jackrabbit.core.data.DataIdentifier;
+import org.jets3t.service.model.S3Object;
+import org.jets3t.service.security.AWSCredentials;
+
+public class S3DataStoreIterator implements Iterator {
+    private static Log LOG = LogFactory.getLog(S3DataStoreIterator.class);
+    
+    private S3DataStore dataStore;
+    private S3Iterator iterator;
+    
+    public S3DataStoreIterator(S3DataStore dataStore, AWSCredentials awsCredentials, String bucketName) {
+        this.dataStore = dataStore;
+        iterator = new S3Iterator(awsCredentials, bucketName);
+    }
+
+    public boolean hasNext() {
+        return iterator.hasNext();
+    }
+
+    public Object next() {
+        S3Object s3o = (S3Object) iterator.next();
+        LOG.debug("Next object is: " + s3o.getKey());
+        return new S3DataRecord(dataStore, new DataIdentifier(s3o.getKey()), s3o);
+    }
+
+    public void remove() {
+        iterator.remove();
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3DataStoreIterator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3DataTransfer.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3DataTransfer.java?rev=698501&view=auto
==============================================================================
--- jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3DataTransfer.java (added)
+++ jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3DataTransfer.java Wed Sep 24 03:08:44 2008
@@ -0,0 +1,47 @@
+/*
+ * S3DataTransfer.java
+ */
+package org.jcrutil;
+
+import java.io.File;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jets3t.service.S3Service;
+import org.jets3t.service.model.S3Bucket;
+import org.jets3t.service.model.S3Object;
+
+public class S3DataTransfer implements Runnable {
+    private static Log LOG = LogFactory.getLog(S3DataTransfer.class);
+    private S3Service s3Service;
+    private String bucketName;
+    private String uuid;
+    private File tmp;
+    
+    public S3DataTransfer(S3Service s3Service, String bucketName, String uuid, File tmp) {
+        this.s3Service = s3Service;
+        this.bucketName = bucketName;
+        this.uuid = uuid;
+        this.tmp = tmp;
+    }
+
+    public void run() {
+        try {
+            LOG.debug("Starting data transfer: " + uuid);
+            S3Bucket s3b = new S3Bucket(bucketName);
+            S3Object s3o = new S3Object(s3b, tmp);
+            s3o.setKey(uuid);
+            s3Service.putObject(s3b, s3o);
+            
+            s3o.setDataInputFile(null);
+            if (!tmp.delete()) {
+                LOG.warn("Unable to delete tmp file: " + tmp.getAbsolutePath());
+            }
+            
+            LOG.debug("Finished data transfer: " + uuid);
+        } catch (Exception e) {
+            LOG.error(e);
+        }
+    }
+
+}
\ No newline at end of file

Propchange: jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3DataTransfer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3Iterator.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3Iterator.java?rev=698501&view=auto
==============================================================================
--- jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3Iterator.java (added)
+++ jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3Iterator.java Wed Sep 24 03:08:44 2008
@@ -0,0 +1,131 @@
+/*
+ * S3Iterator.java
+ */
+package org.jcrutil;
+
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jets3t.service.S3ObjectsChunk;
+import org.jets3t.service.S3Service;
+import org.jets3t.service.S3ServiceException;
+import org.jets3t.service.impl.rest.httpclient.RestS3Service;
+import org.jets3t.service.security.AWSCredentials;
+
+public class S3Iterator implements Iterator {
+    /** The Log */
+    private static Log LOG = LogFactory.getLog(S3Iterator.class);
+    
+    /** The credentials */
+    private AWSCredentials awsCredentials;
+    
+    /** The bucket name */
+    private String bucketName;
+    
+    /** The chunk size */
+    private int chunkSize;
+    
+    /** The current chunk */
+    private S3ObjectsChunk currentChunk;
+    
+    /** Iterator for current chunk */
+    private Iterator currentIterator;
+    
+    /** The last key */
+    private String lastKey;
+    
+    /** Indicates if iterator has been initialized */
+    private boolean initDone;
+    
+    /**
+     * Create a new S3Iterator
+     * @param awsCredentials The credentials
+     * @param bucketName The bucket name
+     */
+    public S3Iterator(AWSCredentials awsCredentials, String bucketName) {
+        this(awsCredentials, bucketName, 100);
+    }
+    
+    /**
+     * Create a new S3Iterator
+     * @param awsCredentials The credentials
+     * @param bucketName The bucket name
+     * @param size The chunk size
+     */
+    public S3Iterator(AWSCredentials awsCredentials, String bucketName, int size) {
+        this.awsCredentials = awsCredentials;
+        this.bucketName = bucketName;
+        this.chunkSize = size;
+        this.initDone = false;
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public boolean hasNext() {
+        if (!initDone) {
+            init();
+        }
+        
+        boolean hasNext = currentIterator.hasNext();
+        if (!hasNext) {
+            if (lastKey == null) {
+                return false;
+            }
+            
+            getNext();
+            hasNext = currentIterator.hasNext();
+            if (!hasNext) {
+                return false;
+            }
+        }
+        
+        return true;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Object next() {
+        if (!hasNext()) {
+            throw new NoSuchElementException();
+        }
+        
+        return currentIterator.next();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void remove() {
+        throw new UnsupportedOperationException("Remove not supported.");
+    }
+    
+    /**
+     * Initialize the iterator
+     */
+    private void init() {
+        getNext();
+        initDone = true;
+    }
+
+    /**
+     * Get next results
+     * @param s3Service
+     * @throws S3ServiceException
+     */
+    private void getNext() {
+        try {
+            LOG.debug("Getting next iterator, last key: " + lastKey);
+            S3Service s3Service = new RestS3Service(awsCredentials);
+            currentChunk = s3Service.listObjectsChunked(bucketName, null, null, chunkSize, lastKey);
+            currentIterator = Arrays.asList(currentChunk.getObjects()).iterator();
+            lastKey = currentChunk.getPriorLastKey();
+        } catch (S3ServiceException se) {
+            LOG.error(se);
+        }
+    }
+}
\ No newline at end of file

Propchange: jackrabbit/sandbox/jcrutil/src/main/java/org/jcrutil/S3Iterator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/sandbox/jcrutil/src/main/resources/META-INF/vfs-providers.xml
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jcrutil/src/main/resources/META-INF/vfs-providers.xml?rev=698501&view=auto
==============================================================================
--- jackrabbit/sandbox/jcrutil/src/main/resources/META-INF/vfs-providers.xml (added)
+++ jackrabbit/sandbox/jcrutil/src/main/resources/META-INF/vfs-providers.xml Wed Sep 24 03:08:44 2008
@@ -0,0 +1,5 @@
+<providers>
+  <provider class-name="org.jcrutil.JcrFileProvider">
+    <scheme name="jcr"/>
+  </provider>
+</providers>

Propchange: jackrabbit/sandbox/jcrutil/src/main/resources/META-INF/vfs-providers.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/sandbox/jcrutil/src/main/resources/ehcache.xml
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jcrutil/src/main/resources/ehcache.xml?rev=698501&view=auto
==============================================================================
--- jackrabbit/sandbox/jcrutil/src/main/resources/ehcache.xml (added)
+++ jackrabbit/sandbox/jcrutil/src/main/resources/ehcache.xml Wed Sep 24 03:08:44 2008
@@ -0,0 +1,26 @@
+<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:noNamespaceSchemaLocation="ehcache.xsd">
+    <diskStore path="java.io.tmpdir" />
+
+    <defaultCache maxElementsInMemory="10000" eternal="false"
+        timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
+        diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000"
+        diskPersistent="false" diskExpiryThreadIntervalSeconds="120"
+        memoryStoreEvictionPolicy="LRU" />
+
+    <cache name="s3oCache" maxElementsInMemory="10000"
+        maxElementsOnDisk="1000" eternal="false" overflowToDisk="true"
+        diskSpoolBufferSizeMB="20" timeToIdleSeconds="120"
+        timeToLiveSeconds="120" memoryStoreEvictionPolicy="LRU" />
+        
+    <cache name="s3oContentCache" maxElementsInMemory="10000"
+        maxElementsOnDisk="1000" eternal="false" overflowToDisk="true"
+        diskSpoolBufferSizeMB="20" timeToIdleSeconds="900"
+        timeToLiveSeconds="900" memoryStoreEvictionPolicy="LRU">
+    </cache>
+
+    <cache name="workspaceAccessCache" maxElementsInMemory="10000"
+        maxElementsOnDisk="1000" eternal="false" overflowToDisk="true"
+        diskSpoolBufferSizeMB="20" timeToIdleSeconds="120"
+        timeToLiveSeconds="120" memoryStoreEvictionPolicy="LRU" />
+</ehcache>
\ No newline at end of file

Propchange: jackrabbit/sandbox/jcrutil/src/main/resources/ehcache.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/sandbox/jcrutil/src/main/resources/jets3t.properties
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jcrutil/src/main/resources/jets3t.properties?rev=698501&view=auto
==============================================================================
--- jackrabbit/sandbox/jcrutil/src/main/resources/jets3t.properties (added)
+++ jackrabbit/sandbox/jcrutil/src/main/resources/jets3t.properties Wed Sep 24 03:08:44 2008
@@ -0,0 +1,73 @@
+#########################
+# Low-level configuration of jets3t toolkit behaviour.
+#
+# For detailed documentation, please see:
+# http://jets3t.s3.amazonaws.com/toolkit/configuration.html
+#
+# Any properties set in this file will affect all applications using the 
+# JetS3t library.
+#########################
+
+###
+# GUI application properties
+###
+gui.verboseErrorDialog=true
+
+###
+# Upload properties for applications.
+###
+uploads.storeEmptyDirectories=true
+
+###
+# Download properties for applications.
+###
+downloads.restoreLastModifiedDate=false
+
+###
+# S3Service properties
+###
+s3service.https-only=true
+s3service.max-thread-count=4
+s3service.admin-max-thread-count=10
+s3service.stream-retry-buffer-size=131072
+s3service.internal-error-retry-max=5
+s3service.default-bucket-location=US
+s3service.s3-endpoint=s3.amazonaws.com
+s3service.disable-dns-buckets=false
+
+#s3service.ignore-exceptions-in-multi=false
+
+###
+# REST/HTTP HttpClient Implementation properties
+###
+httpclient.connection-timeout-ms=60000
+httpclient.socket-timeout-ms=60000
+httpclient.max-connections=100
+httpclient.stale-checking-enabled=true
+httpclient.retry-max=5
+#httpclient.useragent=My User Agent String
+#httpclient.read-throttle=50
+httpclient.proxy-autodetect=true
+#httpclient.proxy-host=
+#httpclient.proxy-port=
+
+# TCP window size hints for kernel 
+#httpclient.socket-receive-buffer=65536
+#httpclient.socket-send-buffer=65536
+
+###
+# File/Object comparison properties
+###
+#filecomparer.use-md5-files=true
+#filecomparer.generate-md5-files=true
+#filecomparer.skip-upload-of-md5-files=true
+#filecomparer.ignore-panic-dir-placeholders=true
+
+###
+# Encryption Algorithm
+#
+# Note that some cryptography options will only be available
+# if the Java Cryptography Extension (JCE) Unlimited Strength 
+# Jurisdiction Policy Files are installed.
+###
+crypto.algorithm=PBEWithMD5AndDES

Propchange: jackrabbit/sandbox/jcrutil/src/main/resources/jets3t.properties
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/sandbox/jcrutil/src/test/java/org/jcrutil/S3DataStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jcrutil/src/test/java/org/jcrutil/S3DataStoreTest.java?rev=698501&view=auto
==============================================================================
--- jackrabbit/sandbox/jcrutil/src/test/java/org/jcrutil/S3DataStoreTest.java (added)
+++ jackrabbit/sandbox/jcrutil/src/test/java/org/jcrutil/S3DataStoreTest.java Wed Sep 24 03:08:44 2008
@@ -0,0 +1,59 @@
+/*
+ * S3DataStoreTest.java
+ */
+package org.jcrutil;
+
+import javax.jcr.Repository;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+import javax.jcr.Node;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.jackrabbit.core.TransientRepository;
+
+import junit.framework.TestCase;
+
+public class S3DataStoreTest extends TestCase {
+    private static Log log = LogFactory.getLog(S3DataStoreTest.class);
+    private Repository repo;
+    private Session session;
+    
+    public void testFileOperations() throws Exception {
+        log.debug("Starting S3DataStoreTest.testFileOperations");
+        
+        try {
+            Node root = session.getRootNode();
+
+            // Store content
+            Node node1 = root.addNode("node1");
+            Node node2 = root.addNode("node2");
+            Node node3 = node1.addNode("node3");
+            node3.setProperty("message", "Hello, World!");
+            session.save();
+
+            // Retrieve content
+            Node node = root.getNode("node1/node3");
+            System.out.println(node.getPath());
+            System.out.println(node.getProperty("message").getString());
+
+            // Remove content
+            root.getNode("node1").remove();
+            session.save();
+        } finally {
+            session.logout();
+        }
+    }
+    
+    protected void setUp() throws Exception {
+        super.setUp();
+        repo = new TransientRepository("repository.xml", "repository");
+        session = repo.login(new SimpleCredentials("username", "password".toCharArray()));
+    }
+
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+    
+}

Propchange: jackrabbit/sandbox/jcrutil/src/test/java/org/jcrutil/S3DataStoreTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/sandbox/jcrutil/src/test/java/org/jcrutil/VfsTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jcrutil/src/test/java/org/jcrutil/VfsTest.java?rev=698501&view=auto
==============================================================================
--- jackrabbit/sandbox/jcrutil/src/test/java/org/jcrutil/VfsTest.java (added)
+++ jackrabbit/sandbox/jcrutil/src/test/java/org/jcrutil/VfsTest.java Wed Sep 24 03:08:44 2008
@@ -0,0 +1,109 @@
+/*
+ * VfsTest.java
+ */
+package org.jcrutil;
+
+import java.io.OutputStream;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.commons.vfs.FileObject;
+import org.apache.commons.vfs.FileSystem;
+import org.apache.commons.vfs.FileSystemManager;
+import org.apache.commons.vfs.FileType;
+import org.apache.commons.vfs.Selectors;
+import org.apache.commons.vfs.VFS;
+import org.apache.commons.vfs.provider.FileProvider;
+
+public class VfsTest extends TestCase {
+    private static Log log = LogFactory.getLog(VfsTest.class);
+    private FileObject root;
+    
+    public void testFileOperations() throws Exception {
+        log.debug("Starting VfsTest.testFileOperations");
+        
+        // look up name
+        FileObject file = root.resolveFile("file1.txt");
+        assertTrue(FileType.IMAGINARY.equals(file.getType()));
+        assertTrue(!file.exists());
+        
+        // create
+        file.createFile();
+        assertTrue(file.exists());
+        
+        // write
+        String content = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
+        
+        OutputStream os = file.getContent().getOutputStream();
+        os.write(content.getBytes());
+        file.getContent().close();
+        
+        long size = file.getContent().getSize();
+        assertTrue(size == content.length());
+        
+        // copy
+        FileObject file2 = root.resolveFile("file2.txt");
+        assertTrue(!file2.exists());
+        file2.copyFrom(file, Selectors.SELECT_SELF);
+        assertTrue(file2.exists());
+        
+        long size2 = file2.getContent().getSize();
+        assertTrue(size2 == size);
+        
+        // delete
+        assertTrue(file.delete());
+        assertTrue(file2.delete());
+    }
+    
+    public void testFolderOperations() throws Exception {
+        log.debug("Starting VfsTest.testFolderOperations");
+        
+        // look up name
+        FileObject folder = root.resolveFile("/asdf");
+        assertTrue(FileType.IMAGINARY.equals(folder.getType()));
+        assertTrue(!folder.exists());
+        
+        // create
+        folder.createFolder();
+        assertTrue(folder.exists());
+        
+        // add file
+        FileObject file = root.resolveFile("/asdf/tmp.txt");
+        OutputStream os = file.getContent().getOutputStream();
+        os.write(new byte[] {'a','a','a','a','a','a','a','a','a','a'});
+        file.getContent().close();
+        
+        // add subdirectory
+        FileObject folder2 = root.resolveFile("/asdf/asdf");
+        folder2.createFolder();
+        assertTrue(folder2.exists());
+        
+        // delete
+        assertTrue(folder2.delete());
+        assertTrue(file.delete());
+        assertTrue(folder.delete());
+    }
+    
+    public void testProviderClass() throws Exception {
+        Class clazz = this.getClass().getClassLoader().loadClass("org.jcrutil.JcrFileProvider");
+        Object instance = clazz.newInstance();
+        FileProvider fp = (FileProvider)instance;
+    }
+    
+    protected void setUp() throws Exception {
+        super.setUp();
+        root = VFS.getManager().resolveFile( "jcr://user:pass@default/" );
+    }
+
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        
+        // the filesystem must be closed for others to use the JCR url
+        FileSystem fs = root.getFileSystem();
+        FileSystemManager fsm = fs.getFileSystemManager();
+        fsm.closeFileSystem(fs);        
+    }
+    
+}

Propchange: jackrabbit/sandbox/jcrutil/src/test/java/org/jcrutil/VfsTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/sandbox/jcrutil/src/test/resources/log4j.xml
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jcrutil/src/test/resources/log4j.xml?rev=698501&view=auto
==============================================================================
--- jackrabbit/sandbox/jcrutil/src/test/resources/log4j.xml (added)
+++ jackrabbit/sandbox/jcrutil/src/test/resources/log4j.xml Wed Sep 24 03:08:44 2008
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+    <appender name="console" class="org.apache.log4j.ConsoleAppender">
+        <layout class="org.apache.log4j.PatternLayout">
+            <param name="ConversionPattern" value="%d{dd.MM.yyyy HH:mm:ss} *%-5p* %c{1}: %m (%F, line %L)%n"/>
+        </layout>
+    </appender>
+
+    <appender name="jcrutil" class="org.apache.log4j.FileAppender">
+        <param name="File" value="jcrutil.log"/>
+        <layout class="org.apache.log4j.PatternLayout">
+            <param name="ConversionPattern" value="%d{dd.MM.yyyy HH:mm:ss} *%-5p* %c{1}: %m (%F, line %L)%n"/>
+        </layout>
+    </appender>
+
+    <root>
+        <level value="info" />
+        <appender-ref ref="jcrutil"/>
+    </root>
+    
+    <logger name="org.jcrutil" additivity="false">
+        <level value="debug"/>
+        <appender-ref ref="jcrutil"/>
+    </logger>
+    
+</log4j:configuration>
\ No newline at end of file

Propchange: jackrabbit/sandbox/jcrutil/src/test/resources/log4j.xml
------------------------------------------------------------------------------
    svn:eol-style = native