Return-Path: Delivered-To: apmail-sling-commits-archive@www.apache.org Received: (qmail 21245 invoked from network); 25 Nov 2010 09:00:26 -0000 Received: from unknown (HELO mail.apache.org) (140.211.11.3) by 140.211.11.9 with SMTP; 25 Nov 2010 09:00:26 -0000 Received: (qmail 88142 invoked by uid 500); 25 Nov 2010 09:00:25 -0000 Delivered-To: apmail-sling-commits-archive@sling.apache.org Received: (qmail 88105 invoked by uid 500); 25 Nov 2010 09:00:24 -0000 Mailing-List: contact commits-help@sling.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@sling.apache.org Delivered-To: mailing list commits@sling.apache.org Received: (qmail 88093 invoked by uid 99); 25 Nov 2010 09:00:23 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 25 Nov 2010 09:00:23 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 25 Nov 2010 09:00:21 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id B180223889D7; Thu, 25 Nov 2010 08:58:48 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1038961 - in /sling/whiteboard/fmeschbe/milton/src/main/java/org/apache/sling/whiteboard/fmeschbe/miltondav/impl/resources: JcrFileResource.java PlatformFileResource.java SlingCollectionResource.java SlingResource.java Date: Thu, 25 Nov 2010 08:58:48 -0000 To: commits@sling.apache.org From: fmeschbe@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20101125085848.B180223889D7@eris.apache.org> Author: fmeschbe Date: Thu Nov 25 08:58:48 2010 New Revision: 1038961 URL: http://svn.apache.org/viewvc?rev=1038961&view=rev Log: Add (simple) lock and write support Modified: sling/whiteboard/fmeschbe/milton/src/main/java/org/apache/sling/whiteboard/fmeschbe/miltondav/impl/resources/JcrFileResource.java sling/whiteboard/fmeschbe/milton/src/main/java/org/apache/sling/whiteboard/fmeschbe/miltondav/impl/resources/PlatformFileResource.java sling/whiteboard/fmeschbe/milton/src/main/java/org/apache/sling/whiteboard/fmeschbe/miltondav/impl/resources/SlingCollectionResource.java sling/whiteboard/fmeschbe/milton/src/main/java/org/apache/sling/whiteboard/fmeschbe/miltondav/impl/resources/SlingResource.java Modified: sling/whiteboard/fmeschbe/milton/src/main/java/org/apache/sling/whiteboard/fmeschbe/miltondav/impl/resources/JcrFileResource.java URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/milton/src/main/java/org/apache/sling/whiteboard/fmeschbe/miltondav/impl/resources/JcrFileResource.java?rev=1038961&r1=1038960&r2=1038961&view=diff ============================================================================== --- sling/whiteboard/fmeschbe/milton/src/main/java/org/apache/sling/whiteboard/fmeschbe/miltondav/impl/resources/JcrFileResource.java (original) +++ sling/whiteboard/fmeschbe/milton/src/main/java/org/apache/sling/whiteboard/fmeschbe/miltondav/impl/resources/JcrFileResource.java Thu Nov 25 08:58:48 2010 @@ -18,6 +18,8 @@ */ package org.apache.sling.whiteboard.fmeschbe.miltondav.impl.resources; +import java.io.InputStream; +import java.util.Calendar; import java.util.Map; import javax.jcr.Node; @@ -28,11 +30,13 @@ import org.apache.sling.api.resource.Res import com.bradmcevoy.http.CollectionResource; import com.bradmcevoy.http.FileItem; +import com.bradmcevoy.http.ReplaceableResource; import com.bradmcevoy.http.exceptions.BadRequestException; import com.bradmcevoy.http.exceptions.ConflictException; import com.bradmcevoy.http.exceptions.NotAuthorizedException; -public class JcrFileResource extends SlingFileResource { +public class JcrFileResource extends SlingFileResource implements + ReplaceableResource { JcrFileResource(final Resource slingResource) { super(slingResource); @@ -100,4 +104,22 @@ public class JcrFileResource extends Sli return null; } + // ---------- ReplaceableResource + + public void replaceContent(InputStream in, Long length) { + Node node = getNode(); + try { + Node content = node.getNode("jcr:content"); + content.setProperty("jcr:data", in); + content.setProperty("jcr:lastModified", Calendar.getInstance()); + node.getSession().save(); + } catch (RepositoryException re) { + } finally { + try { + node.getSession().refresh(false); + } catch (RepositoryException re) { + } + } + } + } Modified: sling/whiteboard/fmeschbe/milton/src/main/java/org/apache/sling/whiteboard/fmeschbe/miltondav/impl/resources/PlatformFileResource.java URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/milton/src/main/java/org/apache/sling/whiteboard/fmeschbe/miltondav/impl/resources/PlatformFileResource.java?rev=1038961&r1=1038960&r2=1038961&view=diff ============================================================================== --- sling/whiteboard/fmeschbe/milton/src/main/java/org/apache/sling/whiteboard/fmeschbe/miltondav/impl/resources/PlatformFileResource.java (original) +++ sling/whiteboard/fmeschbe/milton/src/main/java/org/apache/sling/whiteboard/fmeschbe/miltondav/impl/resources/PlatformFileResource.java Thu Nov 25 08:58:48 2010 @@ -31,11 +31,11 @@ import org.apache.sling.api.resource.Res import com.bradmcevoy.http.CollectionResource; import com.bradmcevoy.http.FileItem; -import com.bradmcevoy.http.exceptions.BadRequestException; +import com.bradmcevoy.http.ReplaceableResource; import com.bradmcevoy.http.exceptions.ConflictException; -import com.bradmcevoy.http.exceptions.NotAuthorizedException; -public class PlatformFileResource extends SlingFileResource { +public class PlatformFileResource extends SlingFileResource implements + ReplaceableResource { PlatformFileResource(final Resource slingResource) { super(slingResource); @@ -64,8 +64,7 @@ public class PlatformFileResource extend // throw new ConflictException(this); } - public void delete() throws NotAuthorizedException, ConflictException, - BadRequestException { + public void delete() throws ConflictException { if (!getFile().delete()) { throw new ConflictException(this); } @@ -88,9 +87,23 @@ public class PlatformFileResource extend } public String processForm(Map parameters, - Map files) throws BadRequestException, - NotAuthorizedException, ConflictException { + Map files) throws ConflictException { throw new ConflictException(this); } + // ---------- ReplaceableResource + + public void replaceContent(InputStream in, Long length) { + FileOutputStream fos = null; + try { + fos = new FileOutputStream(getFile()); + IOUtils.copyLarge(in, fos); + } catch (IOException ignore) { + // TODO: should actually fail here ! + } finally { + IOUtils.closeQuietly(fos); + } + return; + } + } Modified: sling/whiteboard/fmeschbe/milton/src/main/java/org/apache/sling/whiteboard/fmeschbe/miltondav/impl/resources/SlingCollectionResource.java URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/milton/src/main/java/org/apache/sling/whiteboard/fmeschbe/miltondav/impl/resources/SlingCollectionResource.java?rev=1038961&r1=1038960&r2=1038961&view=diff ============================================================================== --- sling/whiteboard/fmeschbe/milton/src/main/java/org/apache/sling/whiteboard/fmeschbe/miltondav/impl/resources/SlingCollectionResource.java (original) +++ sling/whiteboard/fmeschbe/milton/src/main/java/org/apache/sling/whiteboard/fmeschbe/miltondav/impl/resources/SlingCollectionResource.java Thu Nov 25 08:58:48 2010 @@ -18,16 +18,29 @@ */ package org.apache.sling.whiteboard.fmeschbe.miltondav.impl.resources; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; +import java.util.Calendar; import java.util.Iterator; import java.util.List; +import javax.jcr.Node; +import javax.jcr.RepositoryException; +import javax.jcr.Session; + +import org.apache.commons.io.IOUtils; + import com.bradmcevoy.http.CollectionResource; import com.bradmcevoy.http.FolderResource; +import com.bradmcevoy.http.PutableResource; import com.bradmcevoy.http.Resource; +import com.bradmcevoy.http.exceptions.ConflictException; public abstract class SlingCollectionResource extends SlingResource implements - CollectionResource, FolderResource { + CollectionResource, FolderResource, PutableResource { public SlingCollectionResource( org.apache.sling.api.resource.Resource slingResource) { @@ -47,4 +60,73 @@ public abstract class SlingCollectionRes } return childList; } + + // ---------- PutableResource + + public Resource createNew(String newName, InputStream inputStream, + Long length, String contentType) throws IOException, + ConflictException { + File file = getFile(); + if (file != null) { + FileOutputStream fos = null; + try { + fos = new FileOutputStream(new File(file, newName)); + IOUtils.copyLarge(inputStream, fos); + } finally { + IOUtils.closeQuietly(fos); + } + } + + Node node = getNode(); + if (node == null) { + try { + final Session s = getSlingResource().getResourceResolver().adaptTo( + Session.class); + final String path = getSlingResource().getPath(); + if (s.itemExists(path)) { + node = (Node) s.getItem(path); + } else { + String[] segs = path.split("/"); + node = s.getRootNode(); + for (String seg : segs) { + if (node.hasProperty(seg)) { + // yikes, bail out, fail + throw new ConflictException(this); + } else if (node.hasNode(seg)) { + node = node.getNode(seg); + } else { + node = node.addNode(seg, "sling:Folder"); + } + } + } + } catch (ClassCastException cce) { + // item is a property not a node + throw new IOException("Cannot create child for " + newName); + } catch (RepositoryException re) { + // general repository problem + throw new IOException("Cannot create child for " + newName + + " (" + re + ")"); + } + } + + try { + Node fileNode = node.addNode(newName, "nt:file"); + Node content = fileNode.addNode("jcr:content", "nt:unstructured"); + content.setProperty("jcr:data", inputStream); + content.setProperty("jcr:lastModified", Calendar.getInstance()); + content.setProperty("jcr:mimeType", contentType); + node.getSession().save(); + } catch (RepositoryException re) { + throw new IOException(re.toString()); + } finally { + try { + node.getSession().refresh(false); + } catch (RepositoryException re) { + } + } + + org.apache.sling.api.resource.Resource slingResource = getSlingResource().getChild( + newName); + return SlingResourceFactory.createResource(slingResource); + } } Modified: sling/whiteboard/fmeschbe/milton/src/main/java/org/apache/sling/whiteboard/fmeschbe/miltondav/impl/resources/SlingResource.java URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/milton/src/main/java/org/apache/sling/whiteboard/fmeschbe/miltondav/impl/resources/SlingResource.java?rev=1038961&r1=1038960&r2=1038961&view=diff ============================================================================== --- sling/whiteboard/fmeschbe/milton/src/main/java/org/apache/sling/whiteboard/fmeschbe/miltondav/impl/resources/SlingResource.java (original) +++ sling/whiteboard/fmeschbe/milton/src/main/java/org/apache/sling/whiteboard/fmeschbe/miltondav/impl/resources/SlingResource.java Thu Nov 25 08:58:48 2010 @@ -33,12 +33,23 @@ import org.apache.sling.api.resource.Res import com.bradmcevoy.http.Auth; import com.bradmcevoy.http.GetableResource; +import com.bradmcevoy.http.LockInfo; +import com.bradmcevoy.http.LockResult; +import com.bradmcevoy.http.LockTimeout; +import com.bradmcevoy.http.LockToken; +import com.bradmcevoy.http.LockableResource; import com.bradmcevoy.http.PropFindableResource; import com.bradmcevoy.http.Range; import com.bradmcevoy.http.Request; import com.bradmcevoy.http.Request.Method; +import com.bradmcevoy.http.exceptions.NotAuthorizedException; +import com.ettrema.http.fs.LockManager; +import com.ettrema.http.fs.SimpleLockManager; -public class SlingResource implements PropFindableResource, GetableResource { +public class SlingResource implements PropFindableResource, GetableResource, + LockableResource { + + private static final LockManager lockManager = new SimpleLockManager(); private final Resource slingResource; @@ -130,4 +141,24 @@ public class SlingResource implements Pr } } } + + // ---------- LockableResource + + public LockResult lock(LockTimeout timeout, LockInfo lockInfo) + throws NotAuthorizedException { + return lockManager.lock(timeout, lockInfo, this); + } + + public LockResult refreshLock(String token) throws NotAuthorizedException { + return lockManager.refresh(token, this); + } + + public void unlock(String tokenId) throws NotAuthorizedException { + lockManager.unlock(tokenId, this); + } + + public LockToken getCurrentLock() { + return lockManager.getCurrentToken(this); + } + }