You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by fg...@apache.org on 2010/01/20 17:30:23 UTC

svn commit: r901263 - in /incubator/chemistry/trunk/chemistry: chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/ chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/ chemistry-atompub-client/sr...

Author: fguillaume
Date: Wed Jan 20 16:30:22 2010
New Revision: 901263

URL: http://svn.apache.org/viewvc?rev=901263&view=rev
Log:
Refactored to get rid of useless abstraction layers (YAGNI)

Added:
    incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPContentManager.java
      - copied, changed from r901135, incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/APPContentManager.java
    incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/Connector.java
      - copied, changed from r901135, incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/HttpClientConnector.java
    incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/NameValuePairs.java   (with props)
Removed:
    incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/APPContentManager.java
    incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/Connector.java
    incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/DefaultIOProvider.java
    incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/HttpClientConnector.java
    incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/HttpClientResponse.java
    incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/IOProvider.java
    incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/Request.java
    incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/Response.java
Modified:
    incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPConnection.java
    incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPFolder.java
    incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPObject.java
    incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPObjectEntryReader.java
    incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPObjectFeedReader.java
    incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPRepository.java
    incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPServiceDocumentReader.java
    incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPType.java
    incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/stax/QueryWriter.java
    incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/test/java/org/apache/chemistry/atompub/client/ServiceDocumentReaderTest.java
    incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryApp.java
    incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryContext.java
    incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryRootContext.java
    incubator/chemistry/trunk/chemistry/chemistry-tests/src/test/java/org/apache/chemistry/test/TestAtomPubClientServer.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=901263&r1=901262&r2=901263&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 Wed Jan 20 16:30:22 2010
@@ -19,13 +19,11 @@
 package org.apache.chemistry.atompub.client;
 
 import java.io.IOException;
-import java.io.InputStream;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -38,7 +36,6 @@
 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;
 import org.apache.chemistry.Document;
 import org.apache.chemistry.Folder;
@@ -61,35 +58,28 @@
 import org.apache.chemistry.atompub.AtomPub;
 import org.apache.chemistry.atompub.AtomPubCMIS;
 import org.apache.chemistry.atompub.URITemplate;
-import org.apache.chemistry.atompub.client.connector.Connector;
-import org.apache.chemistry.atompub.client.connector.Request;
-import org.apache.chemistry.atompub.client.connector.Response;
 import org.apache.chemistry.atompub.client.stax.ReadContext;
 import org.apache.chemistry.atompub.client.stax.XmlProperty;
-import org.apache.chemistry.impl.simple.SimpleContentStream;
 import org.apache.chemistry.impl.simple.SimpleListPage;
 import org.apache.chemistry.impl.simple.SimpleObjectId;
-import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.Header;
 
 /**
- *
+ * A {@link Connection} and {@link SPI} using the AtomPub protocol to talk to a
+ * CMIS server.
  */
 public class APPConnection implements Connection, SPI {
 
-    public static final int DEFAULT_MAX_CHILDREN = 20;
+    protected final APPRepository repository;
 
     protected final Connector connector;
 
-    protected final APPRepository repository;
-
     protected APPFolder root;
 
-    protected Map<Class<?>, Object> singletons = new Hashtable<Class<?>, Object>();
-
-    public APPConnection(APPRepository repo) {
-        this.repository = repo;
-        this.connector = repo.cm.getConnector(); // TODO clone connector to be
-        // able to use different logins
+    public APPConnection(APPRepository repository) {
+        this.repository = repository;
+        connector = new Connector(repository.getContentManager().getClient(),
+                new ReadContext(this));
     }
 
     public Connection getConnection() {
@@ -109,6 +99,10 @@
         return repository;
     }
 
+    public Connector getConnector() {
+        return connector;
+    }
+
     public Folder getRootFolder() {
         if (root == null) {
             root = (APPFolder) getObject(repository.info.getRootFolderId());
@@ -116,12 +110,6 @@
         return root;
     }
 
-    // not in API
-
-    public Connector getConnector() {
-        return connector;
-    }
-
     public String getBaseUrl() {
         return repository.cm.getBaseUrl();
     }
@@ -196,31 +184,25 @@
         if (href == null) {
             throw new CMISRuntimeException("Missing foldertree link");
         }
-        Request req = new Request(href);
-        req.setParameter(AtomPubCMIS.PARAM_DEPTH, Integer.toString(depth));
+        NameValuePairs params = new NameValuePairs();
+        params.add(AtomPubCMIS.PARAM_DEPTH, Integer.toString(depth));
         if (inclusion != null) {
             if (inclusion.properties != null) {
-                req.setParameter(AtomPubCMIS.PARAM_FILTER, inclusion.properties);
+                params.add(AtomPubCMIS.PARAM_FILTER, inclusion.properties);
             }
             if (inclusion.renditions != null) {
-                req.setParameter(AtomPubCMIS.PARAM_RENDITION_FILTER,
+                params.add(AtomPubCMIS.PARAM_RENDITION_FILTER,
                         inclusion.renditions);
             }
             if (inclusion.relationships != null) {
-                req.setParameter(
+                params.add(
                         AtomPubCMIS.PARAM_INCLUDE_RELATIONSHIPS,
                         RelationshipDirection.toInclusion(inclusion.relationships));
             }
-            req.setParameter(AtomPubCMIS.PARAM_INCLUDE_ALLOWABLE_ACTIONS,
+            params.add(AtomPubCMIS.PARAM_INCLUDE_ALLOWABLE_ACTIONS,
                     Boolean.toString(inclusion.allowableActions));
         }
-        Response resp = connector.get(req);
-        if (!resp.isOk()) {
-            throw new ContentManagerException(
-                    "Remote server returned error code: "
-                            + resp.getStatusCode());
-        }
-        return resp.getObjectFeed(new ReadContext(this));
+        return connector.getEntryFeed(href, params);
     }
 
     public List<ObjectEntry> getDescendants(ObjectId folder, int depth,
@@ -230,38 +212,32 @@
         if (href == null) {
             throw new CMISRuntimeException("Missing down tree link");
         }
-        Request req = new Request(href);
-        req.setParameter(AtomPubCMIS.PARAM_DEPTH, Integer.toString(depth));
+        NameValuePairs params = new NameValuePairs();
+        params.add(AtomPubCMIS.PARAM_DEPTH, Integer.toString(depth));
         if (orderBy != null) {
-            req.setParameter(AtomPubCMIS.PARAM_ORDER_BY, orderBy);
+            params.add(AtomPubCMIS.PARAM_ORDER_BY, orderBy);
         }
         if (inclusion != null) {
             if (inclusion.properties != null) {
-                req.setParameter(AtomPubCMIS.PARAM_FILTER, inclusion.properties);
+                params.add(AtomPubCMIS.PARAM_FILTER, inclusion.properties);
             }
             if (inclusion.renditions != null) {
-                req.setParameter(AtomPubCMIS.PARAM_RENDITION_FILTER,
+                params.add(AtomPubCMIS.PARAM_RENDITION_FILTER,
                         inclusion.renditions);
             }
             if (inclusion.relationships != null) {
-                req.setParameter(
+                params.add(
                         AtomPubCMIS.PARAM_INCLUDE_RELATIONSHIPS,
                         RelationshipDirection.toInclusion(inclusion.relationships));
             }
-            req.setParameter(AtomPubCMIS.PARAM_INCLUDE_ALLOWABLE_ACTIONS,
+            params.add(AtomPubCMIS.PARAM_INCLUDE_ALLOWABLE_ACTIONS,
                     Boolean.toString(inclusion.allowableActions));
-            req.setParameter(AtomPubCMIS.PARAM_INCLUDE_POLICY_IDS,
+            params.add(AtomPubCMIS.PARAM_INCLUDE_POLICY_IDS,
                     Boolean.toString(inclusion.policies));
-            req.setParameter(AtomPubCMIS.PARAM_INCLUDE_ACL,
+            params.add(AtomPubCMIS.PARAM_INCLUDE_ACL,
                     Boolean.toString(inclusion.acls));
         }
-        Response resp = connector.get(req);
-        if (!resp.isOk()) {
-            throw new ContentManagerException(
-                    "Remote server returned error code: "
-                            + resp.getStatusCode());
-        }
-        return resp.getObjectFeed(new ReadContext(this));
+        return connector.getEntryFeed(href, params);
     }
 
     public ListPage<ObjectEntry> getChildren(ObjectId folder,
@@ -269,20 +245,17 @@
         // TODO filter, includeRelationship, includeAllowableActions, orderBy
         String href = getFolderEntry(folder).getLink(AtomPub.LINK_DOWN,
                 AtomPub.MEDIA_TYPE_ATOM_FEED);
-        Request req = new Request(href);
+        if (href == null) {
+            throw new CMISRuntimeException("Missing down link");
+        }
+        NameValuePairs params = new NameValuePairs();
         if (paging != null) {
-            req.setParameter(AtomPubCMIS.PARAM_MAX_ITEMS,
+            params.add(AtomPubCMIS.PARAM_MAX_ITEMS,
                     Integer.toString(paging.maxItems));
-            req.setParameter(AtomPubCMIS.PARAM_SKIP_COUNT,
+            params.add(AtomPubCMIS.PARAM_SKIP_COUNT,
                     Integer.toString(paging.skipCount));
         }
-        Response resp = connector.get(req);
-        if (!resp.isOk()) {
-            throw new ContentManagerException(
-                    "Remote server returned error code: "
-                            + resp.getStatusCode());
-        }
-        return resp.getObjectFeed(new ReadContext(this));
+        return connector.getEntryFeed(href, params);
     }
 
     public ObjectEntry getFolderParent(ObjectId folder, String filter) {
@@ -297,13 +270,7 @@
         if (href == null) {
             return null;
         }
-        Response resp = connector.get(new Request(href));
-        if (!resp.isOk()) {
-            throw new ContentManagerException(
-                    "Remote server returned error code: "
-                            + resp.getStatusCode());
-        }
-        return (APPObjectEntry) resp.getObject(new ReadContext(this));
+        return connector.getEntry(href, folder.getId());
     }
 
     public Collection<ObjectEntry> getObjectParents(ObjectId object,
@@ -311,13 +278,10 @@
         // TODO filter
         APPObjectEntry current = getObjectEntry(object);
         String href = current.getLink(AtomPub.LINK_UP);
-        Response resp = connector.get(new Request(href));
-        if (!resp.isOk()) {
-            throw new ContentManagerException(
-                    "Remote server returned error code: "
-                            + resp.getStatusCode());
+        if (href == null) {
+            throw new CMISRuntimeException("Missing up link");
         }
-        return resp.getObjectFeed(new ReadContext(this));
+        return connector.getEntryFeed(href, null);
     }
 
     public ListPage<ObjectEntry> getCheckedOutDocuments(ObjectId folder,
@@ -345,16 +309,7 @@
         href = replace(href, AtomPubCMIS.PARAM_INCLUDE_ALLOWABLE_ACTIONS, "");
         href = replace(href, AtomPubCMIS.PARAM_INCLUDE_POLICY_IDS, "");
         href = replace(href, AtomPubCMIS.PARAM_INCLUDE_ACL, "");
-        Response resp = connector.get(new Request(href));
-        if (resp.getStatusCode() == HttpStatus.SC_NOT_FOUND) {
-            throw new ObjectNotFoundException(objectId.getId());
-        }
-        if (!resp.isOk()) {
-            throw new ContentManagerException(
-                    "Remote server returned error code: "
-                            + resp.getStatusCode());
-        }
-        return (APPObjectEntry) resp.getObject(new ReadContext(this));
+        return connector.getEntry(href, objectId.getId());
     }
 
     protected APPObjectEntry getFolderEntry(ObjectId objectId) {
@@ -401,7 +356,7 @@
         return href;
     }
 
-    protected APPObjectEntry createObject(String postHref,
+    protected APPObjectEntry createObject(String href,
             Map<String, Serializable> properties, ContentStream contentStream,
             BaseType baseType) {
         String typeId = (String) properties.get(Property.TYPE_ID);
@@ -412,6 +367,7 @@
         if (type == null || type.getBaseType() != baseType) {
             throw new IllegalArgumentException(typeId);
         }
+
         APPObjectEntry entry = newObjectEntry(typeId);
         for (Entry<String, Serializable> en : properties.entrySet()) {
             entry._setValue(en.getKey(), en.getValue());
@@ -419,35 +375,7 @@
         if (contentStream != null) {
             entry.setContentStream(contentStream);
         }
-
-        Request req = new Request(postHref);
-        req.setHeader("Content-Type", AtomPub.MEDIA_TYPE_ATOM_ENTRY);
-        Response resp = connector.postObject(req, entry);
-        if (resp.getStatusCode() != 201) { // Created
-            throw new ContentManagerException(
-                    "Remote server returned error code: "
-                            + resp.getStatusCode());
-        }
-        ReadContext ctx = new ReadContext(this);
-        APPObjectEntry newEntry = (APPObjectEntry) resp.getObject(ctx);
-        // newEntry SHOULD be returned (AtomPub 9.2)...
-        String loc = resp.getHeader("Location");
-        if (loc == null) {
-            throw new ContentManagerException(
-                    "Remote server failed to return a Location header");
-        }
-        if (newEntry == null || !loc.equals(resp.getHeader("Content-Location"))) {
-            // (Content-Location defined by AtomPub 9.2)
-            // fetch actual new entry from Location header
-            // TODO could fetch only a subset of the properties, if deemed ok
-            newEntry = (APPObjectEntry) connector.getObject(ctx, loc);
-            if (newEntry == null) {
-                throw new ContentManagerException(
-                        "Remote server failed to return an entry for Location: "
-                                + loc);
-            }
-        }
-        return newEntry;
+        return connector.postEntry(href, null, entry);
     }
 
     public ObjectId createDocument(Map<String, Serializable> properties,
@@ -484,18 +412,13 @@
         // TODO inclusion
         APPObjectEntry current = getObjectEntry(object);
         String href = current.getLink(AtomPub.LINK_SELF);
-        Response resp = connector.get(new Request(href));
-        if (!resp.isOk()) {
-            if (resp.getStatusCode() == 404) {
-                // object not found, signature says return null
-                return null;
-            }
-            throw new ContentManagerException(
-                    "Remote server returned error code: "
-                            + resp.getStatusCode());
+        try {
+            return connector.getEntry(href, object.getId());
+            // TODO fill current
+        } catch (ObjectNotFoundException e) {
+            // object not found, signature says return null
+            return null;
         }
-        // TODO fill current
-        return (APPObjectEntry) resp.getObject(new ReadContext(this));
     }
 
     public ObjectEntry getObjectByPath(String path, Inclusion inclusion) {
@@ -522,17 +445,13 @@
         href = replace(href, AtomPubCMIS.PARAM_INCLUDE_ALLOWABLE_ACTIONS, "");
         href = replace(href, AtomPubCMIS.PARAM_INCLUDE_POLICY_IDS, "");
         href = replace(href, AtomPubCMIS.PARAM_INCLUDE_ACL, "");
-        Response resp = connector.get(new Request(href));
-        if (!resp.isOk()) {
-            if (resp.getStatusCode() == 404) {
-                // object not found, signature says return null
-                return null;
-            }
-            throw new ContentManagerException(
-                    "Remote server returned error code: "
-                            + resp.getStatusCode());
+        try {
+            return connector.getEntry(href, path);
+            // TODO fill current
+        } catch (ObjectNotFoundException e) {
+            // object not found, signature says return null
+            return null;
         }
-        return (APPObjectEntry) resp.getObject(new ReadContext(this));
     }
 
     public Folder getFolder(String path) {
@@ -577,29 +496,13 @@
             return cs;
         }
 
-        // must fetch the content stream
         String href = current.getContentHref();
         if (href == null) {
-            throw new RuntimeException("Object is missing content src");
+            throw new RuntimeException("Missing content src");
         }
-        Request req = new Request(href);
-        Response resp = connector.get(req);
-        int status = resp.getStatusCode();
-        if (status == 404 || status == 409) {
-            throw new ConstraintViolationException("No content stream");
-        }
-        if (!resp.isOk()) {
-            // TODO exceptions
-            throw new ContentManagerException(
-                    "Remote server returned error code: "
-                            + resp.getStatusCode());
-        }
-        // get MIME type and filename from entry
-        InputStream stream = resp.getStream();
-        // String mimeType = resp.getHeader("Content-Type");
         String mimeType = (String) current.getValue(Property.CONTENT_STREAM_MIME_TYPE);
         String filename = (String) current.getValue(Property.CONTENT_STREAM_FILE_NAME);
-        cs = new SimpleContentStream(stream, mimeType, filename);
+        cs = connector.getContentStream(href, mimeType, filename);
         // current.localContentStream = cs; // problem reusing the stream
         return cs;
     }
@@ -609,23 +512,10 @@
         APPObjectEntry current = getObjectEntry(document);
         String href = current.getLink(AtomPub.LINK_EDIT_MEDIA);
         if (href == null) {
-            throw new RuntimeException("Document is missing link "
+            throw new RuntimeException("Missing link "
                     + AtomPub.LINK_EDIT_MEDIA);
         }
-        Request req = new Request(href);
-        String filename = cs.getFileName();
-        if (filename != null) {
-            // Use Slug: header for filename
-            req.setHeader(AtomPub.HEADER_SLUG, filename);
-        }
-        Response resp = connector.put(req, cs.getStream(), cs.getLength(),
-                cs.getMimeType());
-        if (!resp.isOk()) {
-            // TODO exceptions
-            throw new ContentManagerException(
-                    "Remote server returned error code: "
-                            + resp.getStatusCode());
-        }
+        connector.putStream(href, cs);
         // TODO AtomPub cannot return a new id... (autoversioning)
         return new SimpleObjectId(document.getId());
     }
@@ -634,17 +524,10 @@
         APPObjectEntry current = getObjectEntry(document);
         String href = current.getLink(AtomPub.LINK_EDIT_MEDIA);
         if (href == null) {
-            throw new RuntimeException("Document is missing link "
+            throw new RuntimeException("Missing link "
                     + AtomPub.LINK_EDIT_MEDIA);
         }
-        Response resp = connector.delete(new Request(href));
-        if (!resp.isOk()) {
-            // TODO exceptions
-            throw new ContentManagerException(
-                    "Remote server returned error code: "
-                            + resp.getStatusCode());
-        }
-
+        connector.delete(href, null, document.getId());
         // TODO AtomPub cannot return a new id... (autoversioning)
         return new SimpleObjectId(document.getId());
     }
@@ -653,6 +536,11 @@
             Map<String, Serializable> properties) {
         // make properties into an entry for putObject
         APPObjectEntry current = getObjectEntry(object);
+        String href = current.getLink(AtomPub.LINK_EDIT);
+        if (href == null) {
+            throw new RuntimeException("Missing link " + AtomPub.LINK_EDIT);
+        }
+
         APPObjectEntry update = newObjectEntry(current.getTypeId());
         for (String key : properties.keySet()) {
             update._setValue(key, properties.get(key));
@@ -661,77 +549,28 @@
         // TODO proper title
         update._setValue(Property.NAME, current.getValue(Property.NAME));
 
-        String href = current.getLink(AtomPub.LINK_EDIT);
-        if (href == null) {
-            throw new RuntimeException("Object is missing link "
-                    + AtomPub.LINK_EDIT);
-        }
-        Request req = new Request(href);
-        req.setHeader("Content-Type", AtomPub.MEDIA_TYPE_ATOM_ENTRY);
-        Response resp = connector.putObject(req, update);
-        if (!resp.isOk()) {
-            throw new ContentManagerException(
-                    "Remote server returned error code: "
-                            + resp.getStatusCode());
-        }
-        return (APPObjectEntry) resp.getObject(new ReadContext(this));
+        Header header = new Header("Content-Type",
+                AtomPub.MEDIA_TYPE_ATOM_ENTRY);
+        return connector.putEntry(href, header, update);
     }
 
     public ObjectId moveObject(ObjectId object, ObjectId targetFolder,
             ObjectId sourceFolder) {
         APPObjectEntry entry = getObjectEntry(object);
-        Request req = new Request(getPostHref(targetFolder));
-        req.setHeader("Content-Type", AtomPub.MEDIA_TYPE_ATOM_ENTRY);
-        req.setParameter(AtomPubCMIS.PARAM_SOURCE_FOLDER_ID,
+        NameValuePairs params = new NameValuePairs();
+        params.add(AtomPubCMIS.PARAM_SOURCE_FOLDER_ID,
                 sourceFolder == null ? "" : sourceFolder.getId());
-        Response resp = connector.postObject(req, entry);
-        if (resp.getStatusCode() != 201) { // Created
-            throw new ContentManagerException(
-                    "Remote server returned error code: "
-                            + resp.getStatusCode());
-        }
-        ReadContext ctx = new ReadContext(this);
-        APPObjectEntry newEntry = (APPObjectEntry) resp.getObject(ctx);
-        // newEntry SHOULD be returned (AtomPub 9.2)...
-        String loc = resp.getHeader("Location");
-        if (loc == null) {
-            throw new ContentManagerException(
-                    "Remote server failed to return a Location header");
-        }
-        if (newEntry == null || !loc.equals(resp.getHeader("Content-Location"))) {
-            // (Content-Location defined by AtomPub 9.2)
-            // fetch actual new entry from Location header
-            // TODO could fetch only a subset of the properties, if deemed ok
-            newEntry = (APPObjectEntry) connector.getObject(ctx, loc);
-            if (newEntry == null) {
-                throw new ContentManagerException(
-                        "Remote server failed to return an entry for Location: "
-                                + loc);
-            }
-        }
-        return newEntry;
+        return connector.postEntry(getPostHref(targetFolder), params,
+                entry);
     }
 
     public void deleteObject(ObjectId object, boolean allVersions) {
         APPObjectEntry current = getObjectEntry(object);
         String href = current.getLink(AtomPub.LINK_SELF);
-        Request req = new Request(href);
+        NameValuePairs params = new NameValuePairs();
         // TODO XXX allVersions not in spec
-        req.setParameter("allVersions", String.valueOf(allVersions));
-        Response resp = connector.delete(req);
-        int status = resp.getStatusCode();
-        if (status == HttpStatus.SC_NOT_FOUND) {
-            throw new ObjectNotFoundException(object.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());
-        }
+        params.add("allVersions", String.valueOf(allVersions));
+        connector.delete(href, params, object.getId());
     }
 
     public Collection<ObjectId> deleteTree(ObjectId folder, Unfiling unfiling,
@@ -740,31 +579,16 @@
         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);
+            throw new CMISRuntimeException("Missing link " + AtomPub.LINK_DOWN
+                    + " " + AtomPubCMIS.MEDIA_TYPE_CMIS_TREE);
         }
-        Request req = new Request(href);
+        NameValuePairs params = new NameValuePairs();
         if (unfiling != null) {
-            req.setParameter(AtomPubCMIS.PARAM_UNFILE_OBJECTS,
-                    unfiling.toString());
+            params.add(AtomPubCMIS.PARAM_UNFILE_OBJECTS, unfiling.toString());
         }
-        req.setParameter(AtomPubCMIS.PARAM_CONTINUE_ON_FAILURE,
+        params.add(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());
-        }
+        connector.delete(href, params, folder.getId());
         // AtomPub bindings cannot return the objects that could not be deleted
         return Collections.emptyList();
     }
@@ -786,15 +610,12 @@
     public ListPage<ObjectEntry> query(String statement,
             boolean searchAllVersions, Inclusion inclusion, Paging paging) {
         String href = repository.getCollectionHref(AtomPubCMIS.COL_QUERY);
-        Response resp = connector.postQuery(new Request(href), statement,
-                searchAllVersions, inclusion, paging);
-        if (!resp.isOk()) {
-            throw new ContentManagerException(
-                    "Remote server returned error code: "
-                            + resp.getStatusCode());
+        if (href == null) {
+            throw new CMISRuntimeException("Missing collection "
+                    + AtomPubCMIS.COL_QUERY);
         }
-        ListPage<ObjectEntry> objects = resp.getObjectFeed(new ReadContext(this));
-        return objects;
+        return connector.postQuery(href, statement, searchAllVersions,
+                inclusion, paging);
     }
 
     public Collection<CMISObject> query(String statement,

Copied: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPContentManager.java (from r901135, incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/APPContentManager.java)
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPContentManager.java?p2=incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPContentManager.java&p1=incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/APPContentManager.java&r1=901135&r2=901263&rev=901263&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/APPContentManager.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPContentManager.java Wed Jan 20 16:30:22 2010
@@ -15,13 +15,12 @@
  *     Bogdan Stefanescu, Nuxeo
  *     Florent Guillaume, Nuxeo
  */
-package org.apache.chemistry.atompub.client.connector;
+package org.apache.chemistry.atompub.client;
 
 import org.apache.chemistry.Repository;
-import org.apache.chemistry.atompub.client.ContentManager;
-import org.apache.chemistry.atompub.client.ContentManagerException;
 import org.apache.chemistry.atompub.client.stax.ReadContext;
 import org.apache.commons.httpclient.Credentials;
+import org.apache.commons.httpclient.HttpClient;
 import org.apache.commons.httpclient.UsernamePasswordCredentials;
 import org.apache.commons.httpclient.auth.AuthScheme;
 import org.apache.commons.httpclient.auth.CredentialsProvider;
@@ -33,40 +32,31 @@
 
     protected final String baseUrl;
 
-    protected final Connector connector;
+    protected final HttpClient client;
 
     protected Repository[] repos;
 
     protected String username;
 
-    protected APPContentManager(String url, Connector connector) {
-        this.baseUrl = url;
-        this.connector = connector;
-    }
-
     public APPContentManager(String url) {
-        this(url, new HttpClientConnector(new DefaultIOProvider()));
+        this.baseUrl = url;
+        client = new HttpClient();
+        // client.setHttpConnectionManager(new
+        // MultiThreadedHttpConnectionManager());
     }
 
     public String getBaseUrl() {
         return baseUrl;
     }
 
-    public Connector getConnector() {
-        return connector;
+    public HttpClient getClient() {
+        return client;
     }
 
     public Repository[] getRepositories() throws ContentManagerException {
         if (repos == null) {
-            Request req = new Request(getBaseUrl());
-            Response resp = connector.get(req);
-            if (!resp.isOk()) {
-                throw new ContentManagerException(
-                        "Remote server returned error code: "
-                                + resp.getStatusCode());
-            }
-            ReadContext ctx = new ReadContext(this);
-            repos = resp.getServiceDocument(ctx);
+            Connector connector = new Connector(client, new ReadContext(this));
+            repos = connector.getServiceDocument(getBaseUrl());
         }
         return repos;
     }
@@ -99,12 +89,14 @@
         this.username = username;
         CredentialsProvider cp = new UsernamePasswordCredentialsProvider(
                 username, password);
-        connector.setCredentialsProvider(cp);
+        client.getParams().setAuthenticationPreemptive(true);
+        client.getParams().setParameter(CredentialsProvider.PROVIDER, cp);
     }
 
     public void logout() {
         username = null;
-        connector.setCredentialsProvider(null);
+        client.getParams().setAuthenticationPreemptive(true);
+        client.getParams().setParameter(CredentialsProvider.PROVIDER, null);
     }
 
     public String getCurrentLogin() {

Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPFolder.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPFolder.java?rev=901263&r1=901262&r2=901263&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPFolder.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPFolder.java Wed Jan 20 16:30:22 2010
@@ -27,10 +27,6 @@
 import org.apache.chemistry.ObjectId;
 import org.apache.chemistry.Type;
 import org.apache.chemistry.Unfiling;
-import org.apache.chemistry.atompub.AtomPub;
-import org.apache.chemistry.atompub.client.connector.Request;
-import org.apache.chemistry.atompub.client.connector.Response;
-import org.apache.chemistry.atompub.client.stax.ReadContext;
 
 /**
  *
@@ -57,15 +53,7 @@
     }
 
     public List<CMISObject> getChildren() {
-        String href = entry.getLink(AtomPub.LINK_DOWN);
-        Response resp = entry.connection.getConnector().get(new Request(href));
-        if (!resp.isOk()) {
-            throw new ContentManagerException(
-                    "Remote server returned error code: "
-                            + resp.getStatusCode());
-        }
-        List<ObjectEntry> feed = resp.getObjectFeed(new ReadContext(
-                entry.connection));
+        List<ObjectEntry> feed = entry.connection.getChildren(this, null, null, null);
         List<CMISObject> children = new ArrayList<CMISObject>(feed.size());
         for (ObjectEntry child : feed) {
             children.add(APPObject.construct((APPObjectEntry) child));

Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPObject.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPObject.java?rev=901263&r1=901262&r2=901263&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPObject.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPObject.java Wed Jan 20 16:30:22 2010
@@ -27,8 +27,10 @@
 import java.util.List;
 
 import org.apache.chemistry.BaseType;
+import org.apache.chemistry.CMISRuntimeException;
 import org.apache.chemistry.ContentStream;
 import org.apache.chemistry.Folder;
+import org.apache.chemistry.ObjectEntry;
 import org.apache.chemistry.Policy;
 import org.apache.chemistry.Property;
 import org.apache.chemistry.PropertyDefinition;
@@ -36,11 +38,8 @@
 import org.apache.chemistry.RelationshipDirection;
 import org.apache.chemistry.Type;
 import org.apache.chemistry.atompub.AtomPub;
-import org.apache.chemistry.atompub.client.connector.Connector;
-import org.apache.chemistry.atompub.client.connector.Request;
-import org.apache.chemistry.atompub.client.connector.Response;
-import org.apache.chemistry.atompub.client.stax.ReadContext;
 import org.apache.chemistry.impl.base.BaseObject;
+import org.apache.commons.httpclient.Header;
 
 /**
  *
@@ -114,19 +113,26 @@
      */
 
     public Folder getParent() {
-        String href = entry.getLink(AtomPub.LINK_UP); // usually a feed entry
-        if (href == null) {
-            return null;
+        APPObjectEntry parentEntry;
+        if (getBaseType() == BaseType.FOLDER) {
+            parentEntry = (APPObjectEntry) entry.connection.getFolderParent(
+                    this, null);
+            if (parentEntry == null) {
+                return null;
+            }
+        } else {
+            String href = entry.getLink(AtomPub.LINK_UP); // feed or entry
+            if (href == null) {
+                return null;
+            }
+            Collection<ObjectEntry> parents = entry.connection.getObjectParents(
+                    this, null);
+            if (parents.isEmpty()) {
+                return null;
+            }
+            parentEntry = (APPObjectEntry) parents.iterator().next();
         }
-        // can read an entry directly, or the first one from a feed
-        APPObjectEntry e = (APPObjectEntry) entry.connection.getConnector().getObject(
-                new ReadContext(entry.connection), href);
-        if (e == null) {
-            return null; // no parent
-        }
-        Type t = entry.connection.getRepository().getType(e.getTypeId());
-        APPFolder f = new APPFolder(e, t);
-        return f;
+        return (Folder) construct(parentEntry);
     }
 
     public Collection<Folder> getParents() {
@@ -219,60 +225,25 @@
     }
 
     protected void create() throws ContentManagerException {
-        Connector connector = entry.connection.getConnector();
-        ReadContext ctx = new ReadContext(entry.connection);
-
         // this link value is local, set by APPConnection#newDocument
         String href = entry.getLink(AtomPub.LINK_UP);
         if (href == null) {
-            throw new IllegalArgumentException(
-                    "Cannot create entry: no 'cmis-parents' link is present");
+            throw new CMISRuntimeException("Missing up link");
         }
         // TODO hardcoded Chemistry URL pattern here...
         href = href.replaceAll("/object/([0-9a-f-]{36}$)", "/children/$1");
-        Request req = new Request(href);
-        req.setHeader("Content-Type", AtomPub.MEDIA_TYPE_ATOM_ENTRY);
-        Response resp = connector.postObject(req, entry);
-        if (resp.getStatusCode() != 201) { // Created
-            throw new ContentManagerException(
-                    "Remote server returned error code: "
-                            + resp.getStatusCode());
-        }
-        APPObjectEntry newEntry = (APPObjectEntry) resp.getObject(ctx);
-        // newEntry SHOULD be returned (AtomPub 9.2)...
-        String loc = resp.getHeader("Location");
-        if (loc == null) {
-            throw new ContentManagerException(
-                    "Remote server failed to return a Location header");
-        }
-        if (newEntry == null || !loc.equals(resp.getHeader("Content-Location"))) {
-            // (Content-Location defined by AtomPub 9.2)
-            // fetch actual new entry from Location header
-            // TODO could fetch only a subset of the properties, if deemed ok
-            newEntry = (APPObjectEntry) connector.getObject(ctx, loc);
-            if (newEntry == null) {
-                throw new ContentManagerException(
-                        "Remote server failed to return an entry for Location: "
-                                + loc);
-            }
-        }
-        entry = newEntry;
+
+        entry = entry.connection.connector.postEntry(href, null, entry);
     }
 
     protected void update() throws ContentManagerException {
         String href = entry.getEditLink();
         if (href == null) {
-            throw new IllegalArgumentException(
-                    "Cannot edit entry: no 'edit' link is present");
-        }
-        Request req = new Request(href);
-        req.setHeader("Content-Type", AtomPub.MEDIA_TYPE_ATOM_ENTRY);
-        Response resp = entry.connection.getConnector().putObject(req, entry);
-        if (!resp.isOk()) {
-            throw new ContentManagerException(
-                    "Remote server returned error code: "
-                            + resp.getStatusCode());
+            throw new CMISRuntimeException("Missing edit link");
         }
+        Header header = new Header("Content-Type",
+                AtomPub.MEDIA_TYPE_ATOM_ENTRY);
+        entry = entry.connection.connector.putEntry(href, header, entry);
     }
 
     /**
@@ -319,21 +290,13 @@
         // TODO this could save the stream in a side object and put it back in
         // the entry's local content stream when done, to allow reuse
         public InputStream getStream() throws IOException {
-            try {
-                Response resp = entry.connection.connector.get(new Request(url));
-                if (!resp.isOk()) {
-                    throw new IOException("Error: " + resp.getStatusCode()
-                            + " fetching: " + url);
-                }
-                if (length == -1) {
-                    // get the "official" length if available
-                    length = resp.getStreamLength();
-                }
-                return resp.getStream();
-            } catch (ContentManagerException e) {
-                throw (IOException) (new IOException(
-                        "Could not fetch stream from: " + url).initCause(e));
+            ContentStream cs = entry.connection.connector.getContentStream(url,
+                    null, null);
+            if (length == -1) {
+                // ((HttpMethodBase) method).getResponseContentLength();
+                length = cs.getLength();
             }
+            return cs.getStream();
         }
     }
 

Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPObjectEntryReader.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPObjectEntryReader.java?rev=901263&r1=901262&r2=901263&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPObjectEntryReader.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPObjectEntryReader.java Wed Jan 20 16:30:22 2010
@@ -35,12 +35,6 @@
  */
 public class APPObjectEntryReader extends AbstractObjectReader<APPObjectEntry> {
 
-    private static final APPObjectEntryReader builder = new APPObjectEntryReader();
-
-    public static APPObjectEntryReader getBuilder() {
-        return builder;
-    }
-
     @Override
     protected APPObjectEntry createObject(ReadContext ctx) {
         APPConnection connection = (APPConnection) ctx.getConnection();

Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPObjectFeedReader.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPObjectFeedReader.java?rev=901263&r1=901262&r2=901263&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPObjectFeedReader.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPObjectFeedReader.java Wed Jan 20 16:30:22 2010
@@ -19,7 +19,6 @@
 import org.apache.chemistry.ListPage;
 import org.apache.chemistry.ObjectEntry;
 import org.apache.chemistry.atompub.client.stax.AbstractFeedReader;
-import org.apache.chemistry.atompub.client.stax.EntryReader;
 import org.apache.chemistry.impl.simple.SimpleListPage;
 import org.apache.chemistry.xml.stax.StaxReader;
 
@@ -29,18 +28,8 @@
 public class APPObjectFeedReader extends
         AbstractFeedReader<ListPage<ObjectEntry>, APPObjectEntry> {
 
-    private static final APPObjectFeedReader builder = new APPObjectFeedReader();
-
-    public static APPObjectFeedReader getBuilder() {
-        return builder;
-    }
-
-    public APPObjectFeedReader(EntryReader<APPObjectEntry> entryBuilder) {
-        super(entryBuilder);
-    }
-
     public APPObjectFeedReader() {
-        this(APPObjectEntryReader.getBuilder());
+        super(new APPObjectEntryReader());
     }
 
     @Override

Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPRepository.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPRepository.java?rev=901263&r1=901262&r2=901263&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPRepository.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPRepository.java Wed Jan 20 16:30:22 2010
@@ -36,9 +36,9 @@
 import org.apache.chemistry.atompub.AtomPub;
 import org.apache.chemistry.atompub.AtomPubCMIS;
 import org.apache.chemistry.atompub.URITemplate;
-import org.apache.chemistry.atompub.client.connector.APPContentManager;
 import org.apache.chemistry.atompub.client.stax.ReadContext;
 import org.apache.chemistry.impl.simple.SimpleTypeManager;
+import org.apache.commons.httpclient.HttpClient;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -51,6 +51,8 @@
 
     protected final APPContentManager cm;
 
+    protected final Connector connector;
+
     protected RepositoryInfo info;
 
     protected String id;
@@ -67,6 +69,7 @@
 
     public APPRepository(APPContentManager cm, RepositoryInfo info) {
         this.cm = cm;
+        connector = new Connector(cm.getClient(), new ReadContext(this));
         this.info = info;
     }
 
@@ -78,6 +81,10 @@
         return cm;
     }
 
+    public HttpClient client() {
+        return cm.getClient();
+    }
+
     public String getId() {
         if (id == null) {
             id = info.getId();
@@ -209,7 +216,7 @@
 
     protected TypeManager readTypes(String href) throws Exception {
         href = includePropertyDefinitionsInURI(href);
-        return cm.getConnector().getTypeFeed(new ReadContext(this), href, true);
+        return connector.getTypeFeed(href, true);
     }
 
     protected static String includePropertyDefinitionsInURI(String href) {

Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPServiceDocumentReader.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPServiceDocumentReader.java?rev=901263&r1=901262&r2=901263&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPServiceDocumentReader.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPServiceDocumentReader.java Wed Jan 20 16:30:22 2010
@@ -18,7 +18,6 @@
 
 import org.apache.chemistry.RepositoryInfo;
 import org.apache.chemistry.atompub.URITemplate;
-import org.apache.chemistry.atompub.client.connector.APPContentManager;
 import org.apache.chemistry.atompub.client.stax.ReadContext;
 import org.apache.chemistry.atompub.client.stax.ServiceDocumentReader;
 

Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPType.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPType.java?rev=901263&r1=901262&r2=901263&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPType.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPType.java Wed Jan 20 16:30:22 2010
@@ -29,8 +29,6 @@
 import org.apache.chemistry.ContentStreamPresence;
 import org.apache.chemistry.PropertyDefinition;
 import org.apache.chemistry.Type;
-import org.apache.chemistry.atompub.client.connector.Connector;
-import org.apache.chemistry.atompub.client.stax.ReadContext;
 
 /**
  *
@@ -176,10 +174,8 @@
 
     protected void loadPropertyDef() {
         if (propertyDefs == null) {
-            Connector connector = repository.getContentManager().getConnector();
             String href = APPRepository.includePropertyDefinitionsInURI(getEditLink());
-            APPType typeDef = (APPType) connector.getType(new ReadContext(
-                    repository), href, true);
+            APPType typeDef = repository.connector.getType(href, true, getId());
             propertyDefs = typeDef.propertyDefs == null ? new HashMap<String, PropertyDefinition>()
                     : typeDef.propertyDefs;
         }

Copied: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/Connector.java (from r901135, incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/HttpClientConnector.java)
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/Connector.java?p2=incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/Connector.java&p1=incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/HttpClientConnector.java&r1=901135&r2=901263&rev=901263&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/HttpClientConnector.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/Connector.java Wed Jan 20 16:30:22 2010
@@ -14,245 +14,323 @@
  * Authors:
  *     Bogdan Stefanescu, Nuxeo
  *     Ugo Cei, Sourcesense
+ *     Florent Guillaume, Nuxeo
  */
-package org.apache.chemistry.atompub.client.connector;
+package org.apache.chemistry.atompub.client;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.util.List;
 
+import javax.xml.stream.XMLStreamException;
+
+import org.apache.chemistry.ConstraintViolationException;
+import org.apache.chemistry.ContentStream;
 import org.apache.chemistry.Inclusion;
+import org.apache.chemistry.ListPage;
 import org.apache.chemistry.ObjectEntry;
+import org.apache.chemistry.ObjectNotFoundException;
 import org.apache.chemistry.Paging;
-import org.apache.chemistry.Repository;
-import org.apache.chemistry.Type;
 import org.apache.chemistry.TypeManager;
+import org.apache.chemistry.atompub.AtomPub;
+import org.apache.chemistry.atompub.client.APPObjectEntry;
+import org.apache.chemistry.atompub.client.APPObjectEntryReader;
+import org.apache.chemistry.atompub.client.APPObjectEntryWriter;
+import org.apache.chemistry.atompub.client.APPObjectFeedReader;
+import org.apache.chemistry.atompub.client.APPRepository;
+import org.apache.chemistry.atompub.client.APPServiceDocumentReader;
+import org.apache.chemistry.atompub.client.APPType;
 import org.apache.chemistry.atompub.client.ContentManagerException;
+import org.apache.chemistry.atompub.client.TypeEntryReader;
+import org.apache.chemistry.atompub.client.TypeFeedReader;
+import org.apache.chemistry.atompub.client.stax.EntryReader;
+import org.apache.chemistry.atompub.client.stax.FeedReader;
+import org.apache.chemistry.atompub.client.stax.QueryWriter;
 import org.apache.chemistry.atompub.client.stax.ReadContext;
 import org.apache.chemistry.atompub.client.stax.XmlObjectWriter;
+import org.apache.chemistry.impl.simple.SimpleContentStream;
+import org.apache.commons.httpclient.Header;
 import org.apache.commons.httpclient.HttpClient;
 import org.apache.commons.httpclient.HttpMethod;
-import org.apache.commons.httpclient.NameValuePair;
-import org.apache.commons.httpclient.auth.CredentialsProvider;
+import org.apache.commons.httpclient.HttpStatus;
 import org.apache.commons.httpclient.methods.DeleteMethod;
 import org.apache.commons.httpclient.methods.GetMethod;
-import org.apache.commons.httpclient.methods.HeadMethod;
 import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
 import org.apache.commons.httpclient.methods.PostMethod;
 import org.apache.commons.httpclient.methods.PutMethod;
 import org.apache.commons.httpclient.methods.RequestEntity;
 
 /**
- *
+ * A Connector abstracts the HTTP or AtomPub operations.
  */
-public class HttpClientConnector implements Connector {
+public class Connector {
 
     protected final HttpClient client;
 
-    protected final IOProvider io;
+    protected final ReadContext ctx;
 
-    public HttpClientConnector(IOProvider io) {
-        this.io = io;
-        client = new HttpClient();
-        // use a multi-threaded connection manager because we need reentrancy
-        // when reading some property definition
-        // client.setHttpConnectionManager(new
-        // MultiThreadedHttpConnectionManager());
-    }
-
-    public void setCredentialsProvider(CredentialsProvider cp) {
-        client.getParams().setAuthenticationPreemptive(true);
-        client.getParams().setParameter(CredentialsProvider.PROVIDER, cp);
-    }
-
-    protected void setMethodParams(HttpMethod method, Request request) {
-        List<String> params = request.getParameters();
-        if (params != null) {
-            int len = params.size() >> 1;
-            if (len > 0) {
-                NameValuePair[] qs = new NameValuePair[len];
-                for (int i = 0, k = 0; i < len; i++, k += 2) {
-                    qs[i] = new NameValuePair(params.get(k), params.get(k + 1));
-                }
-                method.setQueryString(qs);
-            }
-        }
+    public Connector(HttpClient client, ReadContext ctx) {
+        this.client = client;
+        this.ctx = ctx;
     }
 
-    protected void setMethodHeaders(HttpMethod method, Request request) {
-        List<String> headers = request.getHeaders();
-        if (headers != null) {
-            int len = headers.size();
-            for (int k = 0; k < len; k += 2) {
-                method.addRequestHeader(headers.get(k), headers.get(k + 1));
+    public APPRepository[] getServiceDocument(String href) {
+        GetMethod method = new GetMethod(href);
+        try {
+            client.executeMethod(method);
+            int status = method.getStatusCode();
+            if (status >= HttpStatus.SC_BAD_REQUEST) {
+                throw new ContentManagerException(
+                        "Remote server returned error code: " + status);
             }
+            return new APPServiceDocumentReader().read(ctx,
+                    method.getResponseBodyAsStream());
+        } catch (IOException e) {
+            throw new ContentManagerException(e);
+        } finally {
+            method.releaseConnection();
         }
     }
 
-    public Response get(Request request) throws ContentManagerException {
-        try {
-            GetMethod method = new GetMethod(request.getUrl());
-            setMethodParams(method, request);
-            setMethodHeaders(method, request);
-            client.executeMethod(method);
-            return new HttpClientResponse(method, io);
-        } catch (Exception e) {
-            throw new ContentManagerException("GET request failed", e);
-        }
+    public ListPage<ObjectEntry> getEntryFeed(String href, NameValuePairs params) {
+        return getObjectFeed(href, params, new APPObjectFeedReader());
     }
 
-    public Response delete(Request request) throws ContentManagerException {
-        try {
-            DeleteMethod method = new DeleteMethod(request.getUrl());
-            setMethodParams(method, request);
-            setMethodHeaders(method, request);
-            client.executeMethod(method);
-            return new HttpClientResponse(method, io);
-        } catch (Exception e) {
-            throw new ContentManagerException("DELETE request failed", e);
-        }
+    public TypeManager getTypeFeed(String href,
+            boolean includePropertyDefinitions) {
+        return getObjectFeed(href, null, new TypeFeedReader(
+                includePropertyDefinitions));
     }
 
-    public Response head(Request request) throws ContentManagerException {
+    protected <T> T getObjectFeed(String href, NameValuePairs params,
+            FeedReader<T> reader) {
+        HttpMethod method = new GetMethod(href);
         try {
-            HeadMethod method = new HeadMethod(request.getUrl());
-            setMethodParams(method, request);
-            setMethodHeaders(method, request);
+            if (params != null) {
+                method.setQueryString(params.toArray());
+            }
             client.executeMethod(method);
-            return new HttpClientResponse(method, io);
-        } catch (Exception e) {
-            throw new ContentManagerException("HEAD request failed", e);
+            int status = method.getStatusCode();
+            if (status >= HttpStatus.SC_BAD_REQUEST) {
+                throw new ContentManagerException(
+                        "Remote server returned error code: " + status);
+            }
+            return reader.read(ctx, method.getResponseBodyAsStream());
+        } catch (IOException e) {
+            throw new ContentManagerException(e);
+        } catch (XMLStreamException e) {
+            throw new ContentManagerException(e);
+        } finally {
+            method.releaseConnection();
         }
     }
 
-    public <T> Response post(Request request, XmlObjectWriter<T> writer,
-            T object) throws ContentManagerException {
-        try {
-            PostMethod method = new PostMethod(request.getUrl());
-            setMethodParams(method, request);
-            setMethodHeaders(method, request);
-            method.setRequestEntity(new XmlObjectWriterRequestEntity<T>(writer,
-                    object));
-            method.setContentChunked(true);
-            client.executeMethod(method);
-            return new HttpClientResponse(method, io);
-        } catch (Exception e) {
-            throw new ContentManagerException("POST request failed", e);
-        }
+    public APPObjectEntry getEntry(String href, String msg) {
+        return getObject(href, msg, new APPObjectEntryReader());
+    }
+
+    public APPType getType(String href, boolean includePropertyDefinitions,
+            String msg) {
+        return getObject(href, msg, new TypeEntryReader(
+                includePropertyDefinitions));
     }
 
-    public <T> Response put(Request request, XmlObjectWriter<T> writer, T object)
-            throws ContentManagerException {
+    protected <T> T getObject(String href, String msg, EntryReader<T> reader) {
+        HttpMethod method = new GetMethod(href);
         try {
-            PutMethod method = new PutMethod(request.getUrl());
-            setMethodParams(method, request);
-            setMethodHeaders(method, request);
-            method.setRequestEntity(new XmlObjectWriterRequestEntity<T>(writer,
-                    object));
             client.executeMethod(method);
-            return new HttpClientResponse(method, io);
-        } catch (Exception e) {
-            throw new ContentManagerException("PUT request failed", e);
+            int status = method.getStatusCode();
+            if (status == HttpStatus.SC_NOT_FOUND) {
+                throw new ObjectNotFoundException(msg);
+            }
+            if (status == HttpStatus.SC_CONFLICT) {
+                throw new ConstraintViolationException(msg);
+            }
+            if (status >= HttpStatus.SC_BAD_REQUEST) {
+                throw new ContentManagerException(
+                        "Remote server returned error code: " + status);
+            }
+            return reader.read(ctx, method.getResponseBodyAsStream());
+        } catch (IOException e) {
+            throw new ContentManagerException(e);
+        } catch (XMLStreamException e) {
+            throw new ContentManagerException(e);
+        } finally {
+            method.releaseConnection();
         }
     }
 
-    public Response put(Request request, InputStream in, long length,
-            String type) throws ContentManagerException {
+    public ContentStream getContentStream(String href, String mimeType,
+            String filename) throws IOException {
+        HttpMethod method = new GetMethod(href);
         try {
-            PutMethod method = new PutMethod(request.getUrl());
-            setMethodParams(method, request);
-            setMethodHeaders(method, request);
-            method.setRequestEntity(new InputStreamRequestEntity(in, length,
-                    type));
             client.executeMethod(method);
-            return new HttpClientResponse(method, io);
-        } catch (Exception e) {
-            throw new ContentManagerException("PUT request failed", e);
+            int status = method.getStatusCode();
+            if (status == HttpStatus.SC_NOT_FOUND
+                    || status == HttpStatus.SC_CONFLICT) {
+                throw new ConstraintViolationException("No content stream");
+            }
+            if (status >= HttpStatus.SC_BAD_REQUEST) {
+                throw new ContentManagerException(
+                        "Remote server returned error code: " + status);
+            }
+            InputStream is = method.getResponseBodyAsStream();
+            return new SimpleContentStream(is, mimeType, filename);
+        } finally {
+            // because of this, we have to consume the stream completely
+            // therefore we must copy it (SimpleContentStream does it)
+            method.releaseConnection();
         }
-    }
 
-    public Type getType(ReadContext ctx, String href,
-            boolean includePropertyDefinitions) {
-        Request req = new Request(href);
-        Response resp = get(req);
-        if (!resp.isOk()) {
-            throw new ContentManagerException(
-                    "Remote server returned error code: "
-                            + resp.getStatusCode() + "\n\n" + resp.getString());
-        }
-        return resp.getType(ctx, includePropertyDefinitions);
     }
 
-    public ObjectEntry getObject(ReadContext ctx, String href) {
-        Request req = new Request(href);
-        Response resp = get(req);
-        if (!resp.isOk()) {
-            throw new ContentManagerException(
-                    "Remote server returned error code: "
-                            + resp.getStatusCode() + "\n\n" + resp.getString());
-        }
-        return resp.getObject(ctx);
+    public APPObjectEntry putEntry(String href, Header header,
+            APPObjectEntry entry) {
+        RequestEntity requestEntity = new XmlObjectWriterRequestEntity<ObjectEntry>(
+                new APPObjectEntryWriter(), entry);
+        return put(href, header, requestEntity);
     }
 
-    public List<ObjectEntry> getObjectFeed(ReadContext ctx, String href)
-            throws ContentManagerException {
-        Request req = new Request(href);
-        Response resp = get(req);
-        if (!resp.isOk()) {
-            throw new ContentManagerException(
-                    "Remote server returned error code: "
-                            + resp.getStatusCode() + "\n\n" + resp.getString());
-        }
-        return resp.getObjectFeed(ctx);
+    public APPObjectEntry putStream(String href, ContentStream cs)
+            throws IOException {
+        RequestEntity requestEntity = new InputStreamRequestEntity(
+                cs.getStream(), cs.getLength(), cs.getMimeType());
+        // Use Slug: header for filename
+        String filename = cs.getFileName();
+        Header header = filename == null ? null : new Header(
+                AtomPub.HEADER_SLUG, filename);
+        return put(href, header, requestEntity);
     }
 
-    public TypeManager getTypeFeed(ReadContext ctx, String href,
-            boolean includePropertyDefinitions) throws ContentManagerException {
-        Request req = new Request(href);
-        Response resp = get(req);
-        if (!resp.isOk()) {
-            throw new ContentManagerException(
-                    "Remote server returned error code: "
-                            + resp.getStatusCode() + "\n\n" + resp.getString());
+    protected APPObjectEntry put(String href, Header header,
+            RequestEntity requestEntity) {
+        PutMethod method = new PutMethod(href);
+        try {
+            if (header != null) {
+                method.addRequestHeader(header);
+            }
+            method.setRequestEntity(requestEntity);
+            method.setContentChunked(true);
+            client.executeMethod(method);
+            int status = method.getStatusCode();
+            if (status >= HttpStatus.SC_BAD_REQUEST) {
+                throw new ContentManagerException(
+                        "Remote server returned error code: " + status);
+            }
+            if (requestEntity instanceof InputStreamRequestEntity) {
+                // no answer expected for stream put
+                return null;
+            } else {
+                return new APPObjectEntryReader().read(ctx,
+                        method.getResponseBodyAsStream());
+            }
+        } catch (IOException e) {
+            throw new ContentManagerException(e);
+        } catch (XMLStreamException e) {
+            throw new ContentManagerException(e);
+        } finally {
+            method.releaseConnection();
         }
-        return resp.getTypeFeed(ctx, includePropertyDefinitions);
     }
 
-    public Repository[] getServiceDocument(ReadContext ctx, String href)
-            throws ContentManagerException {
-        Request req = new Request(href);
-        Response resp = get(req);
-        if (!resp.isOk()) {
-            throw new ContentManagerException(
-                    "Remote server returned error code: "
-                            + resp.getStatusCode() + "\n\n" + resp.getString());
+    public APPObjectEntry postEntry(String href, NameValuePairs params,
+            APPObjectEntry entry) {
+        PostMethod method = new PostMethod(href);
+        try {
+            if (params != null) {
+                method.setQueryString(params.toArray());
+            }
+            method.addRequestHeader("Content-Type",
+                    AtomPub.MEDIA_TYPE_ATOM_ENTRY);
+            method.setRequestEntity(new XmlObjectWriterRequestEntity<ObjectEntry>(
+                    new APPObjectEntryWriter(), entry));
+            method.setContentChunked(true);
+            client.executeMethod(method);
+            int status = method.getStatusCode();
+            if (status != HttpStatus.SC_CREATED) {
+                throw new ContentManagerException(
+                        "Remote server returned error code: " + status);
+            }
+            APPObjectEntry newEntry = new APPObjectEntryReader().read(ctx,
+                    method.getResponseBodyAsStream());
+            // newEntry SHOULD be returned (AtomPub 9.2)...
+            Header loc = method.getResponseHeader("Location");
+            Header cloc = method.getResponseHeader("Content-Location");
+            if (loc == null) {
+                throw new ContentManagerException(
+                        "Remote server failed to return a Location header");
+            }
+            if (newEntry == null || !loc.equals(cloc)) {
+                // (Content-Location defined by AtomPub 9.2)
+                // fetch actual new entry from Location header
+                // TODO could fetch only a subset of the properties, if deemed
+                // ok
+                newEntry = getEntry(loc.getValue(), loc.getValue());
+                if (newEntry == null) {
+                    throw new ContentManagerException(
+                            "Remote server failed to return an entry for Location: "
+                                    + loc);
+                }
+            }
+            return newEntry;
+        } catch (IOException e) {
+            throw new ContentManagerException(e);
+        } catch (XMLStreamException e) {
+            throw new ContentManagerException(e);
+        } finally {
+            method.releaseConnection();
         }
-        return resp.getServiceDocument(ctx);
-    }
-
-    public Response putObject(Request req, ObjectEntry entry)
-            throws ContentManagerException {
-        return put(req, io.getObjectEntryWriter(), entry);
-    }
-
-    public Response putQuery(Request req, String query,
-            boolean searchAllVersions, Inclusion inclusion, Paging paging)
-            throws ContentManagerException {
-        return put(req,
-                io.getQueryWriter(searchAllVersions, inclusion, paging), query);
     }
 
-    public Response postObject(Request req, ObjectEntry entry)
-            throws ContentManagerException {
-        return post(req, io.getObjectEntryWriter(), entry);
+    public ListPage<ObjectEntry> postQuery(String href, String statement,
+            boolean searchAllVersions, Inclusion inclusion, Paging paging) {
+        PostMethod method = new PostMethod(href);
+        try {
+            method.setRequestEntity(new XmlObjectWriterRequestEntity<String>(
+                    new QueryWriter(searchAllVersions, inclusion, paging),
+                    statement));
+            method.setContentChunked(true);
+            client.executeMethod(method);
+            int status = method.getStatusCode();
+            if (status >= HttpStatus.SC_BAD_REQUEST) {
+                throw new ContentManagerException(
+                        "Remote server returned error code: " + status);
+            }
+            return new APPObjectFeedReader().read(ctx,
+                    method.getResponseBodyAsStream());
+        } catch (IOException e) {
+            throw new ContentManagerException(e);
+        } catch (XMLStreamException e) {
+            throw new ContentManagerException(e);
+        } finally {
+            method.releaseConnection();
+        }
     }
 
-    public Response postQuery(Request req, String query,
-            boolean searchAllVersions, Inclusion inclusion, Paging paging)
-            throws ContentManagerException {
-        return post(req,
-                io.getQueryWriter(searchAllVersions, inclusion, paging), query);
+    public void delete(String href, NameValuePairs params, String msg) {
+        HttpMethod method = new DeleteMethod(href);
+        try {
+            if (params != null) {
+                method.setQueryString(params.toArray());
+            }
+            client.executeMethod(method);
+            int status = method.getStatusCode();
+            if (status == HttpStatus.SC_NOT_FOUND) {
+                throw new ObjectNotFoundException(msg);
+            }
+            if (status == HttpStatus.SC_CONFLICT) {
+                throw new ConstraintViolationException(
+                        method.getStatusLine().getReasonPhrase());
+            }
+            if (status >= HttpStatus.SC_BAD_REQUEST) {
+                throw new ContentManagerException(
+                        "Remote server returned error code: " + status);
+            }
+        } catch (IOException e) {
+            throw new ContentManagerException(e);
+        } finally {
+            method.releaseConnection();
+        }
     }
 
     public static class XmlObjectWriterRequestEntity<T> implements

Added: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/NameValuePairs.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/NameValuePairs.java?rev=901263&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/NameValuePairs.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/NameValuePairs.java Wed Jan 20 16:30:22 2010
@@ -0,0 +1,39 @@
+/*
+ * Licensed 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.
+ *
+ * Authors:
+ *     Florent Guillaume, Nuxeo
+ */
+package org.apache.chemistry.atompub.client;
+
+import java.util.LinkedList;
+
+import org.apache.commons.httpclient.NameValuePair;
+
+/**
+ * A list of {@link NameValuePair}s that can easily be turned into an array.
+ */
+public class NameValuePairs extends LinkedList<NameValuePair> {
+
+    private static final long serialVersionUID = 1L;
+
+    public void add(String name, String value) {
+        add(new NameValuePair(name, value));
+    }
+
+    @Override
+    public NameValuePair[] toArray() {
+        return super.toArray(new NameValuePair[size()]);
+    }
+
+}

Propchange: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/NameValuePairs.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/NameValuePairs.java
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/stax/QueryWriter.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/stax/QueryWriter.java?rev=901263&r1=901262&r2=901263&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/stax/QueryWriter.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/stax/QueryWriter.java Wed Jan 20 16:30:22 2010
@@ -31,21 +31,16 @@
  */
 public class QueryWriter extends AbstractXmlObjectWriter<String> {
 
-    protected boolean searchAllVersions;
+    protected final boolean searchAllVersions;
 
-    protected Inclusion inclusion;
+    protected final Inclusion inclusion;
 
-    protected Paging paging;
+    protected final Paging paging;
 
-    public void setSearchAllVersions(boolean searchAllVersions) {
+    public QueryWriter(boolean searchAllVersions, Inclusion inclusion,
+            Paging paging) {
         this.searchAllVersions = searchAllVersions;
-    }
-
-    public void setInclusion(Inclusion inclusion) {
         this.inclusion = inclusion;
-    }
-
-    public void setPaging(Paging paging) {
         this.paging = paging;
     }
 

Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/test/java/org/apache/chemistry/atompub/client/ServiceDocumentReaderTest.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/test/java/org/apache/chemistry/atompub/client/ServiceDocumentReaderTest.java?rev=901263&r1=901262&r2=901263&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/test/java/org/apache/chemistry/atompub/client/ServiceDocumentReaderTest.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/test/java/org/apache/chemistry/atompub/client/ServiceDocumentReaderTest.java Wed Jan 20 16:30:22 2010
@@ -41,7 +41,8 @@
     public void testReadServiceDocument() throws Exception {
         InputStream is = getClass().getResourceAsStream("/service-document.xml");
         ServiceDocumentReader<APPRepository> reader = new APPServiceDocumentReader();
-        Repository[] repos = reader.read(new ReadContext((Repository) null), is);
+        ReadContext ctx = new ReadContext(new APPContentManager(""));
+        Repository[] repos = reader.read(ctx, is);
         assertEquals(1, repos.length);
         Repository repo = repos[0];
         assertEquals("test", repo.getId());
@@ -62,7 +63,8 @@
         RepositoryCapabilities cap = info.getCapabilities();
         assertEquals(CapabilityACL.MANAGE, cap.getACLCapability());
         assertFalse(cap.isAllVersionsSearchable());
-        assertEquals(CapabilityChange.OBJECT_IDS_ONLY, cap.getChangeCapability());
+        assertEquals(CapabilityChange.OBJECT_IDS_ONLY,
+                cap.getChangeCapability());
         assertTrue(cap.isContentStreamUpdatableAnytime());
         assertTrue(cap.hasGetDescendants());
         assertTrue(cap.hasGetFolderTree());

Modified: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryApp.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryApp.java?rev=901263&r1=901262&r2=901263&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryApp.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryApp.java Wed Jan 20 16:30:22 2010
@@ -24,7 +24,7 @@
 
 package org.apache.chemistry.shell.app;
 
-import org.apache.chemistry.atompub.client.connector.APPContentManager;
+import org.apache.chemistry.atompub.client.APPContentManager;
 import org.apache.chemistry.shell.cmds.cmis.Cat;
 import org.apache.chemistry.shell.cmds.cmis.CreateFile;
 import org.apache.chemistry.shell.cmds.cmis.CreateFolder;

Modified: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryContext.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryContext.java?rev=901263&r1=901262&r2=901263&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryContext.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryContext.java Wed Jan 20 16:30:22 2010
@@ -33,7 +33,7 @@
 import org.apache.chemistry.ObjectEntry;
 import org.apache.chemistry.Repository;
 import org.apache.chemistry.atompub.client.APPConnection;
-import org.apache.chemistry.atompub.client.connector.APPContentManager;
+import org.apache.chemistry.atompub.client.APPContentManager;
 import org.apache.chemistry.shell.util.ColorHelper;
 import org.apache.chemistry.shell.util.Path;
 

Modified: incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryRootContext.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryRootContext.java?rev=901263&r1=901262&r2=901263&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryRootContext.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-shell/src/main/java/org/apache/chemistry/shell/app/ChemistryRootContext.java Wed Jan 20 16:30:22 2010
@@ -30,8 +30,8 @@
 import org.apache.chemistry.CMISObject;
 import org.apache.chemistry.Repository;
 import org.apache.chemistry.atompub.client.APPConnection;
+import org.apache.chemistry.atompub.client.APPContentManager;
 import org.apache.chemistry.atompub.client.ContentManager;
-import org.apache.chemistry.atompub.client.connector.APPContentManager;
 import org.apache.chemistry.shell.util.ColorHelper;
 import org.apache.chemistry.shell.util.Path;
 

Modified: incubator/chemistry/trunk/chemistry/chemistry-tests/src/test/java/org/apache/chemistry/test/TestAtomPubClientServer.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-tests/src/test/java/org/apache/chemistry/test/TestAtomPubClientServer.java?rev=901263&r1=901262&r2=901263&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-tests/src/test/java/org/apache/chemistry/test/TestAtomPubClientServer.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-tests/src/test/java/org/apache/chemistry/test/TestAtomPubClientServer.java Wed Jan 20 16:30:22 2010
@@ -19,8 +19,8 @@
 import javax.servlet.Servlet;
 
 import org.apache.chemistry.Repository;
+import org.apache.chemistry.atompub.client.APPContentManager;
 import org.apache.chemistry.atompub.client.ContentManager;
-import org.apache.chemistry.atompub.client.connector.APPContentManager;
 import org.apache.chemistry.atompub.server.servlet.CMISServlet;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;