chemistry-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From fguilla...@apache.org
Subject svn commit: r896101 - in /incubator/chemistry/trunk/chemistry: chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/ chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/ chemistry-atompub/src/main/java/org/a...
Date Tue, 05 Jan 2010 15:43:30 GMT
Author: fguillaume
Date: Tue Jan  5 15:43:29 2010
New Revision: 896101

URL: http://svn.apache.org/viewvc?rev=896101&view=rev
Log:
Implemented foldertree collection and deleteTree

Added:
    incubator/chemistry/trunk/chemistry/chemistry-tests/src/main/resources/jaxrs/
    incubator/chemistry/trunk/chemistry/chemistry-tests/src/main/resources/jaxrs/web.xml 
 (with props)
Modified:
    incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPConnection.java
    incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISChildrenCollection.java
    incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISCollection.java
    incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISObjectsCollection.java
    incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISProvider.java
    incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISWorkspaceManager.java
    incubator/chemistry/trunk/chemistry/chemistry-atompub/src/main/java/org/apache/chemistry/atompub/AtomPubCMIS.java
    incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleConnection.java
    incubator/chemistry/trunk/chemistry/chemistry-tests/src/main/java/org/apache/chemistry/test/BasicTestCase.java

Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPConnection.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPConnection.java?rev=896101&r1=896100&r2=896101&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPConnection.java
(original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPConnection.java
Tue Jan  5 15:43:29 2010
@@ -36,6 +36,7 @@
 import org.apache.chemistry.ACLPropagation;
 import org.apache.chemistry.BaseType;
 import org.apache.chemistry.CMISObject;
+import org.apache.chemistry.CMISRuntimeException;
 import org.apache.chemistry.Connection;
 import org.apache.chemistry.ConstraintViolationException;
 import org.apache.chemistry.ContentStream;
@@ -650,8 +651,37 @@
 
     public Collection<ObjectId> deleteTree(ObjectId folder, Unfiling unfiling,
             boolean continueOnFailure) {
-        // TODO Auto-generated method stub
-        throw new UnsupportedOperationException();
+        APPObjectEntry current = getObjectEntry(folder);
+        String href = current.getLink(AtomPub.LINK_DOWN,
+                AtomPubCMIS.MEDIA_TYPE_CMIS_TREE);
+        if (href == null) {
+            throw new CMISRuntimeException("Document is missing link "
+                    + AtomPub.LINK_DOWN + " "
+                    + AtomPubCMIS.MEDIA_TYPE_CMIS_TREE);
+        }
+        Request req = new Request(href);
+        if (unfiling != null) {
+            req.setParameter(AtomPubCMIS.PARAM_UNFILE_OBJECTS,
+                    unfiling.toString());
+        }
+        req.setParameter(AtomPubCMIS.PARAM_CONTINUE_ON_FAILURE,
+                Boolean.toString(continueOnFailure));
+        Response resp = connector.delete(req);
+        int status = resp.getStatusCode();
+        if (status == HttpStatus.SC_NOT_FOUND) {
+            throw new ObjectNotFoundException(folder.getId());
+        }
+        if (status == HttpStatus.SC_CONFLICT) {
+            throw new ConstraintViolationException(resp.getStatusReasonPhrase());
+        }
+        if (!resp.isOk()) {
+            // TODO exceptions
+            throw new ContentManagerException(
+                    "Remote server returned error code: "
+                            + resp.getStatusCode());
+        }
+        // AtomPub bindings cannot return the objects that could not be deleted
+        return Collections.emptyList();
     }
 
     public void addObjectToFolder(ObjectId object, ObjectId folder) {

Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISChildrenCollection.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISChildrenCollection.java?rev=896101&r1=896100&r2=896101&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISChildrenCollection.java
(original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISChildrenCollection.java
Tue Jan  5 15:43:29 2010
@@ -100,6 +100,12 @@
             feed.addLink(getChildrenLink(pid, request), AtomPub.LINK_UP,
                     AtomPub.MEDIA_TYPE_ATOM_FEED, null, null, -1);
         }
+        // TODO don't add descendants links if no children
+        feed.addLink(getDescendantsLink(pid, request), AtomPub.LINK_DOWN,
+                AtomPubCMIS.MEDIA_TYPE_CMIS_TREE, null, null, -1);
+        feed.addLink(getFolderTreeLink(pid, request),
+                AtomPubCMIS.LINK_FOLDER_TREE, AtomPub.MEDIA_TYPE_ATOM_FEED,
+                null, null, -1);
 
         // AtomPub paging
         // next
@@ -178,7 +184,7 @@
                 AtomPubCMIS.PARAM_INCLUDE_ALLOWABLE_ACTIONS, false);
         Inclusion inclusion = new Inclusion(properties, renditions,
                 relationships, allowableActions, false, false);
-        if ("descendants".equals(getType())) {
+        if (COLTYPE_DESCENDANTS.equals(getType())) {
             int depth = getParameter(request, AtomPubCMIS.PARAM_DEPTH, 1);
             List<ObjectEntry> descendants = spi.getDescendants(objectId, depth,
                     orderBy, inclusion);
@@ -187,6 +193,15 @@
             page.setHasMoreItems(false);
             page.setNumItems(page.size());
             return page;
+        } else if (COLTYPE_FOLDER_TREE.equals(getType())) {
+            int depth = getParameter(request, AtomPubCMIS.PARAM_DEPTH, 1);
+            List<ObjectEntry> folderTree = spi.getFolderTree(objectId, depth,
+                    inclusion);
+            SimpleListPage<ObjectEntry> page = new SimpleListPage<ObjectEntry>(
+                    folderTree);
+            page.setHasMoreItems(false);
+            page.setNumItems(page.size());
+            return page;
         } else {
             int maxItems = getParameter(request, AtomPubCMIS.PARAM_MAX_ITEMS, 0);
             int skipCount = getParameter(request, AtomPubCMIS.PARAM_SKIP_COUNT,

Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISCollection.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISCollection.java?rev=896101&r1=896100&r2=896101&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISCollection.java
(original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISCollection.java
Tue Jan  5 15:43:29 2010
@@ -147,6 +147,13 @@
         return request.absoluteUrlFor(TargetType.TYPE_COLLECTION, params);
     }
 
+    public String getFolderTreeLink(String fid, RequestContext request) {
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("collection", "foldertree");
+        params.put("id", fid);
+        return request.absoluteUrlFor(TargetType.TYPE_COLLECTION, params);
+    }
+
     public String getParentsLink(String fid, RequestContext request) {
         Map<String, String> params = new HashMap<String, String>();
         params.put("collection", "parents");

Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISObjectsCollection.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISObjectsCollection.java?rev=896101&r1=896100&r2=896101&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISObjectsCollection.java
(original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISObjectsCollection.java
Tue Jan  5 15:43:29 2010
@@ -53,6 +53,7 @@
 import org.apache.abdera.protocol.server.RequestContext;
 import org.apache.abdera.protocol.server.ResponseContext;
 import org.apache.abdera.protocol.server.Target;
+import org.apache.abdera.protocol.server.TargetType;
 import org.apache.abdera.protocol.server.context.AbstractResponseContext;
 import org.apache.abdera.protocol.server.context.BaseResponseContext;
 import org.apache.abdera.protocol.server.context.EmptyResponseContext;
@@ -73,6 +74,7 @@
 import org.apache.chemistry.Repository;
 import org.apache.chemistry.SPI;
 import org.apache.chemistry.Type;
+import org.apache.chemistry.Unfiling;
 import org.apache.chemistry.VersioningState;
 import org.apache.chemistry.atompub.AtomPub;
 import org.apache.chemistry.atompub.AtomPubCMIS;
@@ -94,6 +96,18 @@
 
     private static final Log log = LogFactory.getLog(CMISObjectsCollection.class);
 
+    public static final String COLTYPE_PATH = "path";
+
+    public static final String COLTYPE_DESCENDANTS = "descendants";
+
+    public static final String COLTYPE_FOLDER_TREE = "foldertree";
+
+    public static final TargetType TARGET_TYPE_CMIS_DESCENDANTS = TargetType.get(
+            "CMISDESCENDANTS", true);
+
+    public static final TargetType TARGET_TYPE_CMIS_FOLDER_TREE = TargetType.get(
+            "CMISFOLDERTREE", true);
+
     public CMISObjectsCollection(String type, String name, String id,
             Repository repository) {
         super(type, name, id, repository);
@@ -103,6 +117,25 @@
      * ----- AbstractCollectionAdapter -----
      */
 
+    // called by AbstractProvider.process if unknown TargetType
+    @Override
+    public ResponseContext extensionRequest(RequestContext request) {
+        TargetType type = request.getTarget().getType();
+        if (type != TARGET_TYPE_CMIS_DESCENDANTS
+                && type != TARGET_TYPE_CMIS_FOLDER_TREE) {
+            return ProviderHelper.notsupported(request);
+        }
+        if (request.getMethod().equalsIgnoreCase("GET")) {
+            return getFeed(request);
+        } else if (request.getMethod().equalsIgnoreCase("DELETE")) {
+            return deleteEntry(request);
+        } else {
+            // stupid signature prevents use of varargs...
+            return ProviderHelper.notallowed(request, new String[] { "GET",
+                    "DELETE" });
+        }
+    }
+
     @Override
     protected Feed createFeedBase(RequestContext request)
             throws ResponseContextException {
@@ -247,6 +280,9 @@
             // TODO don't add descendants links if no children
             entry.addLink(getDescendantsLink(oid, request), AtomPub.LINK_DOWN,
                     AtomPubCMIS.MEDIA_TYPE_CMIS_TREE, null, null, -1);
+            entry.addLink(getFolderTreeLink(oid, request),
+                    AtomPubCMIS.LINK_FOLDER_TREE, AtomPub.MEDIA_TYPE_ATOM_FEED,
+                    null, null, -1);
         } else if (baseType == BaseType.DOCUMENT) {
             // edit-media link always needed for setContentStream
             entry.addLink(getMediaLink(oid, request), AtomPub.LINK_EDIT_MEDIA);
@@ -572,9 +608,21 @@
         try {
             String oid = resourceName;
             object = spi.newObjectId(oid);
-            // TODO XXX allVersions not in spec
-            boolean allVersions = getParameter(request, "allVersions", false);
-            spi.deleteObject(object, allVersions);
+            if (COLTYPE_DESCENDANTS.equals(getType())
+                    || COLTYPE_FOLDER_TREE.equals(getType())) {
+                String unfile = request.getTarget().getParameter(
+                        AtomPubCMIS.PARAM_UNFILE_OBJECTS);
+                Unfiling unfileObjects = unfile == null ? null
+                        : Unfiling.get(unfile);
+                boolean continueOnFailure = getParameter(request,
+                        AtomPubCMIS.PARAM_CONTINUE_ON_FAILURE, false);
+                spi.deleteTree(object, unfileObjects, continueOnFailure);
+            } else {
+                // TODO XXX allVersions not in spec
+                boolean allVersions = getParameter(request, "allVersions",
+                        false);
+                spi.deleteObject(object, allVersions);
+            }
         } catch (ObjectNotFoundException e) {
             throw new ResponseContextException(404, e);
         } catch (ConstraintViolationException e) {
@@ -742,7 +790,7 @@
         RelationshipDirection relationships = RelationshipDirection.fromInclusion(incl);
         Inclusion inclusion = new Inclusion(properties, null, relationships,
                 allowableActions, false, false);
-        if ("path".equals(getType())) {
+        if (COLTYPE_PATH.equals(getType())) {
             String path = resourceName;
             if (!path.startsWith("/")) {
                 path = "/" + path;
@@ -757,7 +805,7 @@
     @Override
     public String getResourceName(RequestContext request) {
         String name;
-        if ("path".equals(getType())) {
+        if (COLTYPE_PATH.equals(getType())) {
             name = "path";
         } else {
             name = "objectid";

Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISProvider.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISProvider.java?rev=896101&r1=896100&r2=896101&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISProvider.java
(original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISProvider.java
Tue Jan  5 15:43:29 2010
@@ -98,7 +98,9 @@
         targetResolver.setPattern("/children/([^/?]+)(\\?.*)?",
                 TargetType.TYPE_COLLECTION, "objectid");
         targetResolver.setPattern("/descendants/([^/?]+)(\\?.*)?",
-                TargetType.TYPE_COLLECTION, "objectid");
+                CMISObjectsCollection.TARGET_TYPE_CMIS_DESCENDANTS, "objectid");
+        targetResolver.setPattern("/foldertree/([^/?]+)(\\?.*)?",
+                CMISObjectsCollection.TARGET_TYPE_CMIS_FOLDER_TREE, "objectid");
         targetResolver.setPattern("/allversions/([^/?]+)",
                 TargetType.TYPE_COLLECTION, "objectid");
         targetResolver.setPattern("/relationships/([^/?]+)",

Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISWorkspaceManager.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISWorkspaceManager.java?rev=896101&r1=896100&r2=896101&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISWorkspaceManager.java
(original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISWorkspaceManager.java
Tue Jan  5 15:43:29 2010
@@ -58,7 +58,13 @@
         }
         if (paths.startsWith("/descendants/")) {
             String id = request.getTarget().getParameter("objectid");
-            return new CMISChildrenCollection("descendants", id, repository);
+            return new CMISChildrenCollection(
+                    CMISObjectsCollection.COLTYPE_DESCENDANTS, id, repository);
+        }
+        if (paths.startsWith("/foldertree/")) {
+            String id = request.getTarget().getParameter("objectid");
+            return new CMISChildrenCollection(
+                    CMISObjectsCollection.COLTYPE_FOLDER_TREE, id, repository);
         }
         if (paths.startsWith("/parents/")) {
             String id = request.getTarget().getParameter("objectid");
@@ -69,7 +75,8 @@
             return new CMISChildrenCollection(null, null, repository);
         }
         if (paths.startsWith("/path/")) {
-            return new CMISChildrenCollection("path", null, repository);
+            return new CMISChildrenCollection(
+                    CMISObjectsCollection.COLTYPE_PATH, null, repository);
         }
         if (paths.startsWith("/file/")) {
             return new CMISChildrenCollection(null, null, repository);

Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub/src/main/java/org/apache/chemistry/atompub/AtomPubCMIS.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub/src/main/java/org/apache/chemistry/atompub/AtomPubCMIS.java?rev=896101&r1=896100&r2=896101&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub/src/main/java/org/apache/chemistry/atompub/AtomPubCMIS.java
(original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub/src/main/java/org/apache/chemistry/atompub/AtomPubCMIS.java
Tue Jan  5 15:43:29 2010
@@ -138,6 +138,10 @@
 
     public static final String PARAM_INCLUDE_PATH_SEGMENT = "includePathSegment";
 
+    public static final String PARAM_CONTINUE_ON_FAILURE = "continueOnFailure";
+
+    public static final String PARAM_UNFILE_OBJECTS = "unfileObjects";
+
     /*
      * ----- URI Template Types -----
      */

Modified: incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleConnection.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleConnection.java?rev=896101&r1=896100&r2=896101&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleConnection.java
(original)
+++ incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleConnection.java
Tue Jan  5 15:43:29 2010
@@ -705,7 +705,7 @@
         if (repository.getType(typeId).getBaseType() != BaseType.FOLDER) {
             throw new RuntimeException("Not a folder: " + folder); // TODO
         }
-        for (String childId : repository.children.get(id)) {
+        for (String childId : new ArrayList<String>(repository.children.get(id))) {
             SimpleData childData = repository.datas.get(childId);
             String childTypeId = (String) childData.get(Property.TYPE_ID);
             ObjectId objectId = new SimpleObjectId(childId);
@@ -822,9 +822,9 @@
         throw new UnsupportedOperationException();
     }
 
-    public ObjectId checkIn(ObjectId document, Map<String, Serializable> properties,
-            ContentStream contentStream, boolean major,
-            String comment) {
+    public ObjectId checkIn(ObjectId document,
+            Map<String, Serializable> properties, ContentStream contentStream,
+            boolean major, String comment) {
         // TODO Auto-generated method stub
         throw new UnsupportedOperationException();
     }

Modified: incubator/chemistry/trunk/chemistry/chemistry-tests/src/main/java/org/apache/chemistry/test/BasicTestCase.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-tests/src/main/java/org/apache/chemistry/test/BasicTestCase.java?rev=896101&r1=896100&r2=896101&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-tests/src/main/java/org/apache/chemistry/test/BasicTestCase.java
(original)
+++ incubator/chemistry/trunk/chemistry/chemistry-tests/src/main/java/org/apache/chemistry/test/BasicTestCase.java
Tue Jan  5 15:43:29 2010
@@ -435,6 +435,15 @@
         }
     }
 
+    public void testDeleteTreeSPI() throws Exception {
+        ObjectEntry fold2 = spi.getObjectByPath("/folder 1/folder 2", null);
+        spi.deleteTree(fold2, null, true);
+        ObjectEntry oe = spi.getObjectByPath("/folder 1/doc 1", null);
+        assertNotNull(oe);
+        oe = spi.getObjectByPath("/folder 1/folder 2", null);
+        assertNull(oe);
+    }
+
     public void testNewDocument() throws Exception {
         Folder root = conn.getRootFolder();
         assertNull(getDocumentChild(root));

Added: incubator/chemistry/trunk/chemistry/chemistry-tests/src/main/resources/jaxrs/web.xml
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-tests/src/main/resources/jaxrs/web.xml?rev=896101&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-tests/src/main/resources/jaxrs/web.xml (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-tests/src/main/resources/jaxrs/web.xml Tue
Jan  5 15:43:29 2010
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
+  "http://java.sun.com/dtd/web-app_2_3.dtd">
+<web-app>
+  <servlet>
+    <servlet-name>cxfjaxrs</servlet-name>
+    <servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class>
+    <init-param>
+      <param-name>javax.ws.rs.Application</param-name>
+      <param-value>org.apache.chemistry.atompub.server.jaxrs.CMISApplication</param-value>
+    </init-param>
+    <load-on-startup>1</load-on-startup>
+  </servlet>
+
+  <servlet-mapping>
+    <servlet-name>cxfjaxrs</servlet-name>
+    <url-pattern>/*</url-pattern>
+  </servlet-mapping>
+</web-app>

Propchange: incubator/chemistry/trunk/chemistry/chemistry-tests/src/main/resources/jaxrs/web.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/chemistry/trunk/chemistry/chemistry-tests/src/main/resources/jaxrs/web.xml
------------------------------------------------------------------------------
    svn:keywords = Id



Mime
View raw message