You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@abdera.apache.org by da...@apache.org on 2007/11/03 01:26:54 UTC

svn commit: r591521 - in /incubator/abdera/java/trunk: jcr/ jcr/src/main/java/org/apache/abdera/jcr/ server/src/main/java/org/apache/abdera/protocol/server/impl/ server/src/test/java/org/apache/abdera/protocol/server/

Author: dandiep
Date: Fri Nov  2 17:26:52 2007
New Revision: 591521

URL: http://svn.apache.org/viewvc?rev=591521&view=rev
Log:
More CollectionProvider cleanups. Start of JCR media entry support. More tests are coming.

Modified:
    incubator/abdera/java/trunk/jcr/   (props changed)
    incubator/abdera/java/trunk/jcr/src/main/java/org/apache/abdera/jcr/JcrCollectionProvider.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractCollectionProvider.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractWorkspaceProvider.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/ProviderSupport.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/ResponseContextException.java
    incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/protocol/server/CustomerContentProvider.java

Propchange: incubator/abdera/java/trunk/jcr/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Fri Nov  2 17:26:52 2007
@@ -0,0 +1,6 @@
+.settings
+repository
+target
+.classpath
+.project
+repository.xml

Modified: incubator/abdera/java/trunk/jcr/src/main/java/org/apache/abdera/jcr/JcrCollectionProvider.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/jcr/src/main/java/org/apache/abdera/jcr/JcrCollectionProvider.java?rev=591521&r1=591520&r2=591521&view=diff
==============================================================================
--- incubator/abdera/java/trunk/jcr/src/main/java/org/apache/abdera/jcr/JcrCollectionProvider.java (original)
+++ incubator/abdera/java/trunk/jcr/src/main/java/org/apache/abdera/jcr/JcrCollectionProvider.java Fri Nov  2 17:26:52 2007
@@ -1,12 +1,15 @@
 package org.apache.abdera.jcr;
 
+import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Calendar;
 import java.util.Collections;
 import java.util.Date;
 import java.util.List;
+import java.util.logging.Logger;
 
+import javax.activation.MimeType;
 import javax.jcr.AccessDeniedException;
 import javax.jcr.Credentials;
 import javax.jcr.InvalidItemStateException;
@@ -41,9 +44,13 @@
 import org.apache.abdera.protocol.server.impl.EmptyResponseContext;
 import org.apache.abdera.protocol.server.impl.ResponseContextException;
 import org.apache.abdera.protocol.util.EncodingUtil;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 
 public class JcrCollectionProvider extends AbstractCollectionProvider<Node> {
 
+  private final static Log log = LogFactory.getLog(JcrCollectionProvider.class);
+  
   private static final String TITLE = "title";
 
   private static final String SUMMARY = "summary";
@@ -66,6 +73,10 @@
 
   private static final String SESSION = "jcrSession";
 
+  private static final String MEDIA = "media";
+
+  private static final String CONTENT_TYPE = "contentType";
+
   private Repository repository;
 
   private String collectionNodePath;
@@ -136,18 +147,88 @@
     return repository.login(credentials);
   }
 
+
+  @Override
+  public String getContentType(Node entry) {
+    return getStringOrNull(entry, CONTENT_TYPE);
+  }
+
+  @Override
+  public boolean isMediaEntry(Node entry) throws ResponseContextException {
+    try {
+      return entry.hasProperty(MEDIA);
+    } catch (RepositoryException e) {
+      throw new ResponseContextException(500, e);
+    }
+  }
+
+  @Override
+  public Node createMediaEntry(MimeType mimeType, String slug, 
+                               InputStream inputStream, RequestContext request)
+    throws ResponseContextException {
+    if (slug == null) {
+      throw new ResponseContextException("A slug header must be supplied.", 500);
+    }
+    Node n = createEntry(slug, null, null, new Date(), null, null, request);
+    
+    try {
+      n.setProperty(MEDIA, inputStream);
+      n.setProperty(CONTENT_TYPE, mimeType.toString());
+
+      String summary = createSummaryForEntry(n);
+      if (summary != null) {
+        n.setProperty(SUMMARY, summary);
+      }
+
+      getSession(request).save();
+      
+      return n;
+    } catch (RepositoryException e) {
+      try {
+        n.remove();
+      } catch (Throwable t) {
+        log.warn(t);
+      }
+      throw new ResponseContextException(500, e);
+    }
+  }
+  
+  /**
+   * Create a summary for an entry. Used when a media entry is created
+   * so you have the chance to create a meaningful summary for consumers
+   * of the feed.
+   * 
+   * @param n
+   * @return
+   */
+  protected String createSummaryForEntry(Node n) {
+    return null;
+  }
+
   @Override
   public Node createEntry(String title, IRI id, String summary, Date updated, List<Person> authors,
                           Content content, RequestContext request) throws ResponseContextException {
+    
+    Node entry = null;
     try {
       Session session = getSession(request);
 
       Node collectionNode = session.getNodeByUUID(collectionNodeId);
-      Node entry = collectionNode.addNode(ENTRY);
+      entry = collectionNode.addNode(ENTRY);
       entry.addMixin("mix:referenceable");
 
-      return mapEntryToNode(entry, title, summary, updated, authors, content, session);
+      mapEntryToNode(entry, title, summary, updated, authors, content, session);
+      
+      session.save();
+      
+      return entry;
     } catch (RepositoryException e) {
+      try {
+        if (entry != null) entry.remove();
+      } catch (Throwable t) {
+        log.warn(t);
+      }
+      
       throw new ResponseContextException(500, e);
     }
   }
@@ -170,17 +251,21 @@
     String resourceName = EncodingUtil.sanitize(title);
     entry.setProperty(RESOURCE_NAME, resourceName);
 
-    entry.setProperty(SUMMARY, summary);
-
+    if (summary != null) {
+      entry.setProperty(SUMMARY, summary);
+    }
+    
     Calendar upCal = Calendar.getInstance();
     upCal.setTime(updated);
     entry.setProperty(UPDATED, upCal);
 
-    for (Person p : authors) {
-      Node addNode = entry.addNode(AUTHOR);
-      addNode.setProperty(AUTHOR_EMAIL, p.getEmail());
-      addNode.setProperty(AUTHOR_LANGUAGE, p.getLanguage());
-      addNode.setProperty(AUTHOR_NAME, p.getName());
+    if (authors != null) {
+      for (Person p : authors) {
+        Node addNode = entry.addNode(AUTHOR);
+        addNode.setProperty(AUTHOR_EMAIL, p.getEmail());
+        addNode.setProperty(AUTHOR_LANGUAGE, p.getLanguage());
+        addNode.setProperty(AUTHOR_NAME, p.getName());
+      }
     }
 
     if (content != null) {
@@ -191,8 +276,6 @@
       entry.setProperty(SUMMARY, summary);
     }
     
-    session.save();
-    
     return entry;
   }
 
@@ -295,7 +378,7 @@
   }
 
   @Override
-  public Object getContent(Node entry) throws ResponseContextException {
+  public Object getContent(Node entry, RequestContext request) throws ResponseContextException {
     return getStringOrNull(entry, CONTENT);
   }
 
@@ -355,15 +438,36 @@
       throw new ResponseContextException(500, e);
     }
   }
+  
+  public String getMediaName(Node entry) throws ResponseContextException {
+    return getName(entry);
+  }
 
+  public InputStream getMediaStream(Node entry) throws ResponseContextException {
+    try {
+      Value value = getValueOrNull(entry, MEDIA);
+      
+      if (value == null) return null;
+      
+      return value.getStream();
+    } catch (PathNotFoundException e) {
+      return null;
+    } catch (RepositoryException e) {
+      throw new ResponseContextException(500, e);
+    }
+    
+  }
+  
   @Override
   public String getName(Node entry) throws ResponseContextException {
     return getStringOrNull(entry, RESOURCE_NAME);
   }
 
   @Override
-  public String getSummary(Node entry) {
-    return getStringOrNull(entry, SUMMARY);
+  public Text getSummary(Node entry, RequestContext request) {
+    Text summary = request.getAbdera().getFactory().newSummary();
+    summary.setText(getStringOrNull(entry, SUMMARY));
+    return summary;
   }
 
   @Override

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractCollectionProvider.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractCollectionProvider.java?rev=591521&r1=591520&r2=591521&view=diff
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractCollectionProvider.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractCollectionProvider.java Fri Nov  2 17:26:52 2007
@@ -74,7 +74,7 @@
   
   public abstract T createEntry(String title, IRI id, String summary, Date updated, List<Person> authors, Content content, RequestContext request) throws ResponseContextException;
   
-  public T createMediaEntry(MimeType mimeType, String slug, InputStream inputStream) throws ResponseContextException {
+  public T createMediaEntry(MimeType mimeType, String slug, InputStream inputStream, RequestContext request) throws ResponseContextException {
     throw new UnsupportedOperationException();
   }
   
@@ -99,13 +99,15 @@
 
   public abstract String getAuthor() throws ResponseContextException;
 
-  public abstract List<Person> getAuthors(T entry, RequestContext request) throws ResponseContextException;
+  public List<Person> getAuthors(T entry, RequestContext request) throws ResponseContextException {
+    return null;
+  }
   
   public String getBaseMediaIri() {
     return baseMediaIri;
   }
   
-  public abstract Object getContent(T entry) throws ResponseContextException;
+  public abstract Object getContent(T entry, RequestContext request) throws ResponseContextException;
   
   // GET, POST, PUT, DELETE
   
@@ -167,7 +169,7 @@
           if (isMediaEntry(entryObj)) {
             addMediaContent(entryIri, e, entryObj);
           } else {
-            addContent(e, entryObj);
+            addContent(e, entryObj, request);
           }
         }
       }
@@ -193,8 +195,8 @@
    * @return
    */
   protected ResponseContext createErrorResponse(ResponseContextException e) {
-    if (log.isDebugEnabled()) {
-      log.debug("A ResponseException was thrown.", e);
+    if (log.isInfoEnabled()) {
+      log.info("A ResponseException was thrown.", e);
     } else if (e.getResponseContext() instanceof EmptyResponseContext 
       && ((EmptyResponseContext) e.getResponseContext()).getStatus() >= 500) {
       log.warn("A ResponseException was thrown.", e);
@@ -240,11 +242,11 @@
 
     return ctx;
   }
-  public String getMediaName(T entry) {
+  public String getMediaName(T entry) throws ResponseContextException {
     throw new UnsupportedOperationException();
   }
 
-  public InputStream getMediaStream(T gdoc) {
+  public InputStream getMediaStream(T entry) throws ResponseContextException {
     throw new UnsupportedOperationException();
   }
   
@@ -256,7 +258,7 @@
 
   public abstract Date getUpdated(T entry) throws ResponseContextException;
 
-  public boolean isMediaEntry(T entry) {
+  public boolean isMediaEntry(T entry) throws ResponseContextException {
     return false;
   }
 
@@ -314,8 +316,8 @@
                                    List<Person> authors, String summary, 
                                    Content content, RequestContext request) throws ResponseContextException;
 
-  protected void addContent(Entry e, T doc) throws ResponseContextException {
-    Object content = getContent(doc);
+  protected void addContent(Entry e, T doc, RequestContext request) throws ResponseContextException {
+    Object content = getContent(doc, request);
 
     if (content instanceof Content) {
       e.setContentElement((Content)content);
@@ -333,26 +335,23 @@
     e.setUpdated(getUpdated(entryObj));
     
     List<Person> authors = getAuthors(entryObj, request);
-    if (authors == null || authors.size() == 0) {
-      log.warn("You must specify at least one author for the entry!");
-      throw new ResponseContextException(500);
-    }
-    
-    for (Person a : authors) {
-      e.addAuthor(a);
+    if (authors != null) {
+      for (Person a : authors) {
+        e.addAuthor(a);
+      }
     }
     
-    String s = getSummary(entryObj);
-    if (s != null) {
-      e.setSummary(s);
+    Text t = getSummary(entryObj, request);
+    if (t != null) {
+      e.setSummaryElement(t);
     }
   }
 
-  public String getSummary(T entry) {
+  public Text getSummary(T entry, RequestContext request) throws ResponseContextException {
     return null;
   }
 
-  protected void addMediaContent(IRI entryBaseIri, Entry entry, T doc) {
+  protected void addMediaContent(IRI entryBaseIri, Entry entry, T doc) throws ResponseContextException {
     String name = getMediaName(doc);
     IRI mediaIri = getMediaIRI(entryBaseIri, name);
     mediaIri = entryBaseIri.resolve(mediaIri);
@@ -389,7 +388,8 @@
 
   protected ResponseContext createMediaEntry(RequestContext request) {
     try {
-      T doc = createMediaEntry(request.getContentType(), request.getSlug(), request.getInputStream());
+      T doc = createMediaEntry(request.getContentType(), request.getSlug(), 
+                               request.getInputStream(), request);
 
       IRI baseIri = resolveBase(request);
       IRI entryIri = getEntryBaseFromFeedIRI(baseIri);
@@ -485,7 +485,7 @@
     if (isMediaEntry(entryObj)) {
       addMediaContent(feedIri, entry, entryObj);
     } else {
-      addContent(entry, entryObj);
+      addContent(entry, entryObj, request);
     }
 
     return entry;

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractWorkspaceProvider.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractWorkspaceProvider.java?rev=591521&r1=591520&r2=591521&view=diff
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractWorkspaceProvider.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractWorkspaceProvider.java Fri Nov  2 17:26:52 2007
@@ -143,8 +143,8 @@
      * @return
      */
     protected ResponseContext createErrorResponse(ResponseContextException e) {
-      if (log.isDebugEnabled()) {
-        log.debug("A ResponseException was thrown.", e);
+      if (log.isInfoEnabled()) {
+        log.info("A ResponseException was thrown.", e);
       } else if (e.getResponseContext() instanceof EmptyResponseContext 
         && ((EmptyResponseContext) e.getResponseContext()).getStatus() >= 500) {
         log.warn("A ResponseException was thrown.", e);
@@ -187,7 +187,8 @@
       try {
         IRI entryBaseIri = resolveBase(request).resolve("../");
         provider = getCollectionProvider(entryBaseIri, request);
-  
+        provider.begin(request);
+        
         return provider.getMedia(request);
       } catch (ResponseContextException e) {
         response = createErrorResponse(e);

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/ProviderSupport.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/ProviderSupport.java?rev=591521&r1=591520&r2=591521&view=diff
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/ProviderSupport.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/ProviderSupport.java Fri Nov  2 17:26:52 2007
@@ -312,7 +312,6 @@
           id.toString().trim().length() == 0 ||
           !id.isAbsolute()) return false;
       if (entry.getTitle() == null) return false;
-      if (entry.getAuthor() == null) return false;
       if (entry.getUpdated() == null) return false;
       Content content = entry.getContentElement();
       if (content == null) {

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/ResponseContextException.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/ResponseContextException.java?rev=591521&r1=591520&r2=591521&view=diff
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/ResponseContextException.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/impl/ResponseContextException.java Fri Nov  2 17:26:52 2007
@@ -39,7 +39,18 @@
     this(new EmptyResponseContext(responseCode), t);
   }
 
+  public ResponseContextException(String msg, int responseCode) {
+    this.responseContext = new EmptyResponseContext(responseCode);
+    this.responseContext.setStatusText(msg);
+  }
+
   public AbstractResponseContext getResponseContext() {
     return responseContext;
   }
+
+  @Override
+  public String getMessage() {
+    return responseContext.getStatusText();
+  }
+  
 }

Modified: incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/protocol/server/CustomerContentProvider.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/protocol/server/CustomerContentProvider.java?rev=591521&r1=591520&r2=591521&view=diff
==============================================================================
--- incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/protocol/server/CustomerContentProvider.java (original)
+++ incubator/abdera/java/trunk/server/src/test/java/org/apache/abdera/protocol/server/CustomerContentProvider.java Fri Nov  2 17:26:52 2007
@@ -17,7 +17,6 @@
 import org.apache.abdera.model.Person;
 import org.apache.abdera.protocol.server.impl.AbstractCollectionProvider;
 import org.apache.abdera.protocol.server.impl.ResponseContextException;
-import sun.security.pkcs.ContentInfo;
 
 public class CustomerContentProvider extends AbstractCollectionProvider<Customer> {
   private static final String ID_PREFIX = "urn:acme:customer:";
@@ -78,7 +77,7 @@
     
   }
 
-  public Object getContent(Customer entry) {
+  public Object getContent(Customer entry, RequestContext request) {
     Content content = factory.newContent();
     Element customerEl = factory.newElement(new QName("customer"));
     customerEl.setAttributeValue(new QName("name"), entry.getName());