You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@abdera.apache.org by jm...@apache.org on 2008/01/24 06:38:30 UTC

svn commit: r614798 [1/2] - in /incubator/abdera/java/branches/server_refactor_all: ./ .settings/ examples/src/main/java/org/apache/abdera/examples/appserver/ server/src/main/java/org/apache/abdera/protocol/server/ server/src/main/java/org/apache/abder...

Author: jmsnell
Date: Wed Jan 23 21:38:20 2008
New Revision: 614798

URL: http://svn.apache.org/viewvc?rev=614798&view=rev
Log:
Fix test cases and examples. Add AbstractWorkspaceProvider back in.  While it may not make
sense for a Provider to always be a WorkspaceManager, it makes things significantly easier 
when implementing a custom Provider implementation that uses a single Adapter.

This also adds the new Filter mechanism. Filters use the same model as Servlet Filters but use the
RequestContext/ResponseContext interfaces.  They are invoked by the AbderaServlet just prior to invoking the Provider.

Added:
    incubator/abdera/java/branches/server_refactor_all/.classpath
    incubator/abdera/java/branches/server_refactor_all/.settings/
    incubator/abdera/java/branches/server_refactor_all/.settings/org.eclipse.jdt.core.prefs
    incubator/abdera/java/branches/server_refactor_all/examples/src/main/java/org/apache/abdera/examples/appserver/AppServer.java
    incubator/abdera/java/branches/server_refactor_all/examples/src/main/java/org/apache/abdera/examples/appserver/CustomProvider.java
    incubator/abdera/java/branches/server_refactor_all/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleAdapter.java
    incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/Filter.java
    incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/FilterChain.java
    incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/context/RequestContextWrapper.java
    incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/context/ResponseContextWrapper.java
    incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractWorkspaceProvider.java
    incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/SimpleCollectionInfo.java
      - copied, changed from r614767, incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/SimpleCollection.java
    incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/SimpleWorkspaceInfo.java
    incubator/abdera/java/branches/server_refactor_all/server/src/test/java/org/apache/abdera/protocol/server/test/custom/
      - copied from r614767, incubator/abdera/java/branches/server_refactor_all/server/src/test/java/org/apache/abdera/protocol/server/test/simple/
    incubator/abdera/java/branches/server_refactor_all/server/src/test/java/org/apache/abdera/protocol/server/test/custom/CustomProvider.java
      - copied, changed from r614767, incubator/abdera/java/branches/server_refactor_all/server/src/test/java/org/apache/abdera/protocol/server/test/simple/SimpleProvider.java
    incubator/abdera/java/branches/server_refactor_all/server/src/test/java/org/apache/abdera/protocol/server/test/custom/CustomProviderTest.java
      - copied, changed from r614767, incubator/abdera/java/branches/server_refactor_all/server/src/test/java/org/apache/abdera/protocol/server/test/simple/SimpleTest.java
    incubator/abdera/java/branches/server_refactor_all/server/src/test/java/org/apache/abdera/protocol/server/test/custom/OpenSearchFilter.java
    incubator/abdera/java/branches/server_refactor_all/server/src/test/java/org/apache/abdera/protocol/server/test/customer/
      - copied from r614767, incubator/abdera/java/branches/server_refactor_all/server/src/test/java/org/apache/abdera/protocol/server/customer/
    incubator/abdera/java/branches/server_refactor_all/src/
Removed:
    incubator/abdera/java/branches/server_refactor_all/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleProvider.java
    incubator/abdera/java/branches/server_refactor_all/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleProviderManager.java
    incubator/abdera/java/branches/server_refactor_all/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleServiceContext.java
    incubator/abdera/java/branches/server_refactor_all/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleTargetResolver.java
    incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/SimpleCollection.java
    incubator/abdera/java/branches/server_refactor_all/server/src/test/java/org/apache/abdera/protocol/server/customer/
    incubator/abdera/java/branches/server_refactor_all/server/src/test/java/org/apache/abdera/protocol/server/test/custom/SimpleProvider.java
    incubator/abdera/java/branches/server_refactor_all/server/src/test/java/org/apache/abdera/protocol/server/test/custom/SimpleTest.java
    incubator/abdera/java/branches/server_refactor_all/server/src/test/java/org/apache/abdera/protocol/server/test/impl/
    incubator/abdera/java/branches/server_refactor_all/server/src/test/java/org/apache/abdera/protocol/server/test/simple/
Modified:
    incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/CategoriesInfo.java
    incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/CategoryInfo.java
    incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/CollectionInfo.java
    incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/Provider.java
    incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/RequestContext.java
    incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/WorkspaceInfo.java
    incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/context/AbstractRequestContext.java
    incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/context/ResponseContextException.java
    incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractCollectionAdapter.java
    incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractEntityCollectionAdapter.java
    incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractProvider.java
    incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractWorkspaceManager.java
    incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/DefaultWorkspaceManager.java
    incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/SimpleCategoriesInfo.java
    incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/SimpleCategoryInfo.java
    incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/provider/basic/BasicProvider.java
    incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/provider/basic/BasicWorkspace.java
    incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/servlet/AbderaServlet.java
    incubator/abdera/java/branches/server_refactor_all/server/src/test/java/org/apache/abdera/protocol/server/test/basic/BasicTest.java
    incubator/abdera/java/branches/server_refactor_all/server/src/test/java/org/apache/abdera/protocol/server/test/custom/SimpleAdapter.java
    incubator/abdera/java/branches/server_refactor_all/server/src/test/java/org/apache/abdera/protocol/server/test/customer/Customer.java
    incubator/abdera/java/branches/server_refactor_all/server/src/test/java/org/apache/abdera/protocol/server/test/customer/CustomerAdapter.java
    incubator/abdera/java/branches/server_refactor_all/server/src/test/java/org/apache/abdera/protocol/server/test/customer/CustomerAdapterTest.java
    incubator/abdera/java/branches/server_refactor_all/server/src/test/resources/abdera/adapter/sample.properties

Added: incubator/abdera/java/branches/server_refactor_all/.classpath
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/.classpath?rev=614798&view=auto
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/.classpath (added)
+++ incubator/abdera/java/branches/server_refactor_all/.classpath Wed Jan 23 21:38:20 2008
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="spring/src/test/java"/>
+	<classpathentry kind="src" path="parser/src/main/resources"/>
+	<classpathentry kind="src" path="extensions/geo/src/test/java"/>
+	<classpathentry kind="src" path="extensions/gdata/src/test/java"/>
+	<classpathentry kind="src" path="core/src/main/resources"/>
+	<classpathentry kind="src" path="extensions/opensearch/src/main/java"/>
+	<classpathentry kind="src" path="extensions/opensearch/src/test/resources"/>
+	<classpathentry kind="src" path="jcr/src/test/resources"/>
+	<classpathentry kind="src" path="jcr/src/main/java"/>
+	<classpathentry kind="src" path="extensions/wsse/src/main/resources"/>
+	<classpathentry kind="src" path="extensions/sharing/src/test/java"/>
+	<classpathentry kind="src" path="examples/src/main/java"/>
+	<classpathentry kind="src" path="server/src/test/java"/>
+	<classpathentry kind="src" path="dependencies/i18n/src/test/java"/>
+	<classpathentry kind="src" path="extensions/json/src/main/java"/>
+	<classpathentry kind="src" path="extensions/json/src/test/resources"/>
+	<classpathentry kind="src" path="extensions/main/src/main/resources"/>
+	<classpathentry kind="src" path="extensions/oauth/src/test/java"/>
+	<classpathentry kind="src" path="parser/src/test/resources"/>
+	<classpathentry kind="src" path="parser/src/main/java"/>
+	<classpathentry kind="src" path="extensions/converters/src/main/java"/>
+	<classpathentry kind="src" path="core/src/main/java"/>
+	<classpathentry kind="src" path="core/src/test/resources"/>
+	<classpathentry kind="src" path="extensions/media/src/main/resources"/>
+	<classpathentry kind="src" path="extensions/opensearch/src/test/java"/>
+	<classpathentry kind="src" path="jcr/src/test/java"/>
+	<classpathentry kind="src" path="extensions/wsse/src/main/java"/>
+	<classpathentry kind="src" path="extensions/json/src/test/java"/>
+	<classpathentry kind="src" path="extensions/main/src/main/java"/>
+	<classpathentry kind="src" path="extensions/main/src/test/resources"/>
+	<classpathentry kind="src" path="security/src/test/resources"/>
+	<classpathentry kind="src" path="security/src/main/java"/>
+	<classpathentry kind="src" path="parser/src/test/java"/>
+	<classpathentry kind="src" path="extensions/converters/src/test/java"/>
+	<classpathentry kind="src" path="core/src/test/java"/>
+	<classpathentry kind="src" path="extensions/media/src/main/java"/>
+	<classpathentry kind="src" path="extensions/media/src/test/resources"/>
+	<classpathentry kind="src" path="client/src/main/java"/>
+	<classpathentry kind="src" path="contrib/rss/src/main/resources"/>
+	<classpathentry kind="src" path="extensions/html/src/main/resources"/>
+	<classpathentry kind="src" path="extensions/main/src/test/java"/>
+	<classpathentry kind="src" path="security/src/test/java"/>
+	<classpathentry kind="src" path="extensions/media/src/test/java"/>
+	<classpathentry kind="src" path="spring/src/main/resources"/>
+	<classpathentry kind="src" path="extensions/geo/src/main/resources"/>
+	<classpathentry kind="src" path="extensions/gdata/src/main/resources"/>
+	<classpathentry kind="src" path="client/src/test/java"/>
+	<classpathentry kind="src" path="protocol/src/main/resources"/>
+	<classpathentry kind="src" path="extensions/sharing/src/main/resources"/>
+	<classpathentry kind="src" path="contrib/rss/src/main/java"/>
+	<classpathentry kind="src" path="contrib/rss/src/test/resources"/>
+	<classpathentry kind="src" path="extensions/html/src/main/java"/>
+	<classpathentry kind="src" path="extensions/html/src/test/resources"/>
+	<classpathentry kind="src" path="dependencies/i18n/src/main/resources"/>
+	<classpathentry kind="src" path="extensions/oauth/src/main/resources"/>
+	<classpathentry kind="src" path="spring/src/test/resources"/>
+	<classpathentry kind="src" path="spring/src/main/java"/>
+	<classpathentry kind="src" path="extensions/geo/src/test/resources"/>
+	<classpathentry kind="src" path="extensions/geo/src/main/java"/>
+	<classpathentry kind="src" path="extensions/gdata/src/test/resources"/>
+	<classpathentry kind="src" path="extensions/gdata/src/main/java"/>
+	<classpathentry kind="src" path="extensions/opensearch/src/main/resources"/>
+	<classpathentry kind="src" path="protocol/src/main/java"/>
+	<classpathentry kind="src" path="jcr/src/main/resources"/>
+	<classpathentry kind="src" path="extensions/sharing/src/test/resources"/>
+	<classpathentry kind="src" path="extensions/sharing/src/main/java"/>
+	<classpathentry kind="src" path="examples/src/main/resources"/>
+	<classpathentry kind="src" path="contrib/rss/src/test/java"/>
+	<classpathentry kind="src" path="extensions/html/src/test/java"/>
+	<classpathentry kind="src" path="server/src/test/resources"/>
+	<classpathentry kind="src" path="server/src/main/java"/>
+	<classpathentry kind="src" path="dependencies/i18n/src/main/java"/>
+	<classpathentry kind="src" path="extensions/json/src/main/resources"/>
+	<classpathentry kind="src" path="extensions/oauth/src/main/java"/>
+	<classpathentry kind="src" path="extensions/oauth/src/test/resources"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="lib" path="dependencies/axiom-api-1.2.5.jar"/>
+	<classpathentry kind="lib" path="dependencies/axiom-impl-1.2.5.jar"/>
+	<classpathentry kind="lib" path="dependencies/bcprov-jdk15-137.jar"/>
+	<classpathentry kind="lib" path="dependencies/commons-codec-1.3.jar"/>
+	<classpathentry kind="lib" path="dependencies/commons-httpclient-3.1.jar"/>
+	<classpathentry kind="lib" path="dependencies/commons-logging-1.0.4.jar"/>
+	<classpathentry kind="lib" path="dependencies/geronimo-activation_1.0.2_spec-1.1.jar"/>
+	<classpathentry kind="lib" path="dependencies/geronimo-servlet_2.4_spec-1.0.jar"/>
+	<classpathentry kind="lib" path="dependencies/htmlparser-1.0.5.jar"/>
+	<classpathentry kind="lib" path="dependencies/jaxen-1.1.1.jar"/>
+	<classpathentry kind="lib" path="dependencies/jetty-6.1.3.jar"/>
+	<classpathentry kind="lib" path="dependencies/jetty-util-6.1.3.jar"/>
+	<classpathentry kind="lib" path="dependencies/junit-4.3.jar"/>
+	<classpathentry kind="lib" path="dependencies/log4j-1.2.14.jar"/>
+	<classpathentry kind="lib" path="dependencies/serializer.jar"/>
+	<classpathentry kind="lib" path="dependencies/stax-api-1.0.1.jar"/>
+	<classpathentry kind="lib" path="dependencies/wstx-asl-3.2.1.jar"/>
+	<classpathentry kind="lib" path="dependencies/xmlsec-1.4.1.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>

Added: incubator/abdera/java/branches/server_refactor_all/.settings/org.eclipse.jdt.core.prefs
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/.settings/org.eclipse.jdt.core.prefs?rev=614798&view=auto
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/.settings/org.eclipse.jdt.core.prefs (added)
+++ incubator/abdera/java/branches/server_refactor_all/.settings/org.eclipse.jdt.core.prefs Wed Jan 23 21:38:20 2008
@@ -0,0 +1,12 @@
+#Wed Jan 23 18:37:28 GMT-08:00 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5

Added: incubator/abdera/java/branches/server_refactor_all/examples/src/main/java/org/apache/abdera/examples/appserver/AppServer.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/examples/src/main/java/org/apache/abdera/examples/appserver/AppServer.java?rev=614798&view=auto
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/examples/src/main/java/org/apache/abdera/examples/appserver/AppServer.java (added)
+++ incubator/abdera/java/branches/server_refactor_all/examples/src/main/java/org/apache/abdera/examples/appserver/AppServer.java Wed Jan 23 21:38:20 2008
@@ -0,0 +1,25 @@
+package org.apache.abdera.examples.appserver;
+
+import org.apache.abdera.protocol.server.ServiceManager;
+import org.apache.abdera.protocol.server.servlet.AbderaServlet;
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.servlet.Context;
+import org.mortbay.jetty.servlet.ServletHolder;
+
+public class AppServer {
+
+  public static void main(String... args) throws Exception {
+    int port = 9002;
+    try {
+      port = args.length > 0 ? Integer.parseInt(args[0]) : 9002;
+    } catch (Exception e) {}
+    Server server = new Server(port);
+    Context context = new Context(server, "/", Context.SESSIONS);
+    ServletHolder servletHolder = new ServletHolder(new AbderaServlet());
+    servletHolder.setInitParameter(ServiceManager.PROVIDER, CustomProvider.class.getName());
+    context.addServlet(servletHolder, "/*");
+    server.start();
+    server.join();
+  }
+  
+}

Added: incubator/abdera/java/branches/server_refactor_all/examples/src/main/java/org/apache/abdera/examples/appserver/CustomProvider.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/examples/src/main/java/org/apache/abdera/examples/appserver/CustomProvider.java?rev=614798&view=auto
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/examples/src/main/java/org/apache/abdera/examples/appserver/CustomProvider.java (added)
+++ incubator/abdera/java/branches/server_refactor_all/examples/src/main/java/org/apache/abdera/examples/appserver/CustomProvider.java Wed Jan 23 21:38:20 2008
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  The ASF licenses this file to You
+ * under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+package org.apache.abdera.examples.appserver;
+
+import org.apache.abdera.protocol.server.CollectionAdapter;
+import org.apache.abdera.protocol.server.Filter;
+import org.apache.abdera.protocol.server.FilterChain;
+import org.apache.abdera.protocol.server.RequestContext;
+import org.apache.abdera.protocol.server.ResponseContext;
+import org.apache.abdera.protocol.server.TargetType;
+import org.apache.abdera.protocol.server.context.RequestContextWrapper;
+import org.apache.abdera.protocol.server.impl.AbstractWorkspaceProvider;
+import org.apache.abdera.protocol.server.impl.RegexTargetResolver;
+import org.apache.abdera.protocol.server.impl.SimpleCollectionInfo;
+import org.apache.abdera.protocol.server.impl.SimpleWorkspaceInfo;
+
+public class CustomProvider 
+  extends AbstractWorkspaceProvider {
+
+  private final CollectionAdapter adapter;
+  
+  public CustomProvider() {
+    // Create the adapter that will handle all of the requests processed by this provider
+    this.adapter = new SimpleAdapter();
+    
+    // The target resolver provides the URL path mappings
+    super.setTargetResolver(      
+      new RegexTargetResolver()
+        .setPattern("/atom(\\?[^#]*)?", TargetType.TYPE_SERVICE)
+        .setPattern("/atom/([^/#?]+);categories", TargetType.TYPE_CATEGORIES, "collection")
+        .setPattern("/atom/([^/#?;]+)(\\?[^#]*)?", TargetType.TYPE_COLLECTION, "collection")
+        .setPattern("/atom/([^/#?]+)/([^/#?]+)(\\?[^#]*)?", TargetType.TYPE_ENTRY, "collection","entry")
+    );
+    
+    // Add a Workspace descriptor so the provider can generate an atompub service document
+    SimpleWorkspaceInfo workspace = new SimpleWorkspaceInfo();
+    workspace.setTitle("A Simple Workspace");
+    workspace.addCollection(
+      new SimpleCollectionInfo(
+        "feed",
+        "A simple feed",
+        "/atom/feed",
+        "application/atom+xml;type=entry"
+      ));
+    addWorkspace(workspace);
+    
+    // Add one of more Filters to be invoked prior to invoking the Provider
+    addFilter(new SimpleFilter());
+  }
+
+  public CollectionAdapter getCollectionAdapter(
+    RequestContext request) {
+      return adapter;
+  }
+
+  public class SimpleFilter 
+    implements Filter {
+      public ResponseContext filter(
+        RequestContext request, 
+        FilterChain chain) {
+          RequestContextWrapper rcw = new RequestContextWrapper(request);
+          rcw.setAttribute("offset", 10);
+          rcw.setAttribute("count", 10);
+          return chain.next(rcw);
+      }    
+  }
+
+}

Added: incubator/abdera/java/branches/server_refactor_all/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleAdapter.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleAdapter.java?rev=614798&view=auto
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleAdapter.java (added)
+++ incubator/abdera/java/branches/server_refactor_all/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleAdapter.java Wed Jan 23 21:38:20 2008
@@ -0,0 +1,253 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  The ASF licenses this file to You
+* under the Apache License, Version 2.0 (the "License"); you may not
+* use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.  For additional information regarding
+* copyright in this work, please see the NOTICE file in the top level
+* directory of this distribution.
+*/
+package org.apache.abdera.examples.appserver;
+
+import java.io.IOException;
+import java.util.Date;
+
+import org.apache.abdera.Abdera;
+import org.apache.abdera.i18n.text.UrlEncoding;
+import org.apache.abdera.model.Document;
+import org.apache.abdera.model.Entry;
+import org.apache.abdera.model.Feed;
+import org.apache.abdera.parser.ParseException;
+import org.apache.abdera.protocol.server.ProviderHelper;
+import org.apache.abdera.protocol.server.RequestContext;
+import org.apache.abdera.protocol.server.ResponseContext;
+import org.apache.abdera.protocol.server.TargetType;
+import org.apache.abdera.protocol.server.RequestContext.Scope;
+import org.apache.abdera.protocol.server.context.BaseResponseContext;
+import org.apache.abdera.protocol.server.context.ResponseContextException;
+import org.apache.abdera.protocol.server.context.StreamWriterResponseContext;
+import org.apache.abdera.protocol.server.impl.AbstractCollectionAdapter;
+import org.apache.abdera.util.Constants;
+import org.apache.abdera.writer.StreamWriter;
+
+@SuppressWarnings("unchecked")
+public class SimpleAdapter 
+  extends AbstractCollectionAdapter {
+  
+  @Override
+  public String getAuthor() throws ResponseContextException {
+    return "Simple McGee";
+  }
+
+  @Override
+  public String getId(RequestContext request) {
+    return "tag:example.org,2008:feed";
+  }
+
+  public String getHref(RequestContext request) {
+    return "atom/feed";
+  }
+
+  public String getTitle(RequestContext request) {
+    return "A simple feed";
+  }
+
+  public ResponseContext extensionRequest(RequestContext request) {
+    return ProviderHelper.notallowed(
+      request, 
+      "Method Not Allowed", 
+      ProviderHelper.getDefaultMethods(request));
+  }
+  
+  private Document<Feed> getFeedDocument(RequestContext context) throws ResponseContextException {
+    Feed feed = (Feed)context.getAttribute(Scope.SESSION, "feed");
+    if (feed == null) {
+      feed = createFeedBase(context);
+      context.setAttribute(Scope.SESSION, "feed", feed);
+    }
+    return feed.getDocument();
+  }
+
+  public ResponseContext getFeed(
+    RequestContext request) {
+      Document<Feed> feed;
+      try {
+        feed = getFeedDocument(request);
+      } catch (ResponseContextException e) {
+        return e.getResponseContext();
+      } 
+      
+      return ProviderHelper.returnBase(
+        feed, 
+        200, 
+        feed.getRoot().getUpdated())
+          .setEntityTag(
+            ProviderHelper.calculateEntityTag(
+              feed.getRoot()));
+  }
+
+  
+  public ResponseContext deleteEntry(
+    RequestContext request) {
+      Entry entry = getAbderaEntry(request);
+      if (entry != null)
+        entry.discard();
+      return ProviderHelper.nocontent();
+  }
+
+  public ResponseContext getEntry(
+    RequestContext request) {
+      Entry entry = (Entry) getAbderaEntry(request);
+      if (entry != null) {
+        Feed feed = entry.getParentElement();
+        entry = (Entry) entry.clone();
+        entry.setSource(feed.getAsSource());
+        Document<Entry> entry_doc = entry.getDocument();
+        return 
+          ProviderHelper.returnBase(
+            entry_doc, 
+            200, 
+            entry.getEdited())
+              .setEntityTag(
+                ProviderHelper.calculateEntityTag(
+                  entry));
+      } else {
+        return ProviderHelper.notfound(request);
+      }
+  }
+
+  public ResponseContext postEntry(
+    RequestContext request) {
+      Abdera abdera = request.getAbdera();
+      try {
+        Document<Entry> entry_doc = 
+          (Document<Entry>) request.getDocument(
+            abdera.getParser()).clone();
+        if (entry_doc != null) {
+          Entry entry = entry_doc.getRoot();
+          if (!ProviderHelper.isValidEntry(entry))
+            return ProviderHelper.badrequest(request);
+          setEntryDetails(
+            entry, 
+            abdera.getFactory().newUuidUri());
+          Feed feed = getFeedDocument(request).getRoot();
+          feed.insertEntry(entry);
+          feed.setUpdated(new Date());
+          BaseResponseContext rc = 
+            (BaseResponseContext) ProviderHelper.returnBase(
+              entry_doc, 201, entry.getEdited());
+          return 
+            rc.setLocation(
+                ProviderHelper.resolveBase(request).resolve(
+                  entry.getEditLinkResolvedHref()).toString())
+              .setContentLocation(rc.getLocation().toString())
+              .setEntityTag(ProviderHelper.calculateEntityTag(entry));
+        } else {
+          return ProviderHelper.badrequest(request);
+        }
+      } catch (ParseException pe) {
+        return ProviderHelper.notsupported(request);
+      } catch (ClassCastException cce) {
+        return ProviderHelper.notsupported(request);
+      } catch (Exception e) {
+        return ProviderHelper.badrequest(request);
+    }
+  }
+  
+  private void setEntryDetails(
+    Entry entry, 
+    String id) {
+      entry.setUpdated(new Date());
+      entry.setEdited(entry.getUpdated());
+      entry.getIdElement().setValue(id);
+      entry.addLink(
+        "/atom/feed/" + entry.getId().toASCIIString(), 
+        "edit");
+  }
+  
+  public ResponseContext putEntry(
+    RequestContext request) {
+      Abdera abdera = request.getAbdera();
+      Entry orig_entry = getAbderaEntry(request);
+      if (orig_entry != null) {
+        try {
+          Document<Entry> entry_doc = 
+            (Document<Entry>) request.getDocument(
+              abdera.getParser()).clone();
+          if (entry_doc != null) {
+            Entry entry = entry_doc.getRoot();
+            if (!entry.getId().equals(orig_entry.getId()))
+              return ProviderHelper.conflict(request);
+            if (!ProviderHelper.isValidEntry(entry))
+              return ProviderHelper.badrequest(request);
+            setEntryDetails(
+              entry, 
+              orig_entry.getId().toString());
+            orig_entry.discard();
+            Feed feed = getFeedDocument(request).getRoot();
+            feed.insertEntry(entry);
+            feed.setUpdated(new Date());
+            return ProviderHelper.nocontent();
+          } else {
+            return ProviderHelper.badrequest(request);
+          }
+        } catch (ParseException pe) {
+          return ProviderHelper.notsupported(request);
+        } catch (ClassCastException cce) {
+          return ProviderHelper.notsupported(request);
+        } catch (Exception e) {
+          return ProviderHelper.badrequest(request);
+        }
+      } else {
+        return ProviderHelper.notfound(request);
+      }
+  }
+  
+  private Entry getAbderaEntry(
+    RequestContext request) {
+      try { 
+        return getFeedDocument( 
+          request)
+            .getRoot()
+            .getEntry(
+              getEntryID(request)); 
+      } catch (Exception e) {}
+      return null;
+  }
+  
+  public String getEntryID(
+    RequestContext request) {
+      if (request.getTarget().getType() != TargetType.TYPE_ENTRY) 
+        return null;
+      String[] segments = request.getUri().toString().split("/");
+      return UrlEncoding.decode(segments[segments.length-1]);
+  }
+  
+  public ResponseContext getCategories(
+    RequestContext request) {
+      return 
+        new StreamWriterResponseContext(request.getAbdera()) {
+          protected void writeTo(
+            StreamWriter sw) 
+              throws IOException {
+            sw.startDocument()
+              .startCategories(false)
+              .writeCategory("foo")
+              .writeCategory("bar")
+              .writeCategory("baz")
+              .endCategories()
+              .endDocument();
+          }
+        }
+        .setStatus(200)
+        .setContentType(Constants.CAT_MEDIA_TYPE);    
+  }
+}
\ No newline at end of file

Modified: incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/CategoriesInfo.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/CategoriesInfo.java?rev=614798&r1=614797&r2=614798&view=diff
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/CategoriesInfo.java (original)
+++ incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/CategoriesInfo.java Wed Jan 23 21:38:20 2008
@@ -17,7 +17,6 @@
 */
 package org.apache.abdera.protocol.server;
 
-import org.apache.abdera.Abdera;
 import org.apache.abdera.model.Categories;
 
 public interface CategoriesInfo 
@@ -29,5 +28,5 @@
 
   String getHref(RequestContext request);
   
-  Categories asCategoriesElement(Abdera abdera);
+  Categories asCategoriesElement(RequestContext request);
 }

Modified: incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/CategoryInfo.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/CategoryInfo.java?rev=614798&r1=614797&r2=614798&view=diff
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/CategoryInfo.java (original)
+++ incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/CategoryInfo.java Wed Jan 23 21:38:20 2008
@@ -17,7 +17,6 @@
 */
 package org.apache.abdera.protocol.server;
 
-import org.apache.abdera.Abdera;
 import org.apache.abdera.model.Category;
 
 public interface CategoryInfo {
@@ -28,5 +27,5 @@
   
   String getLabel(RequestContext request);
   
-  Category asCategoryElement(Abdera abdera);
+  Category asCategoryElement(RequestContext request);
 }

Modified: incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/CollectionInfo.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/CollectionInfo.java?rev=614798&r1=614797&r2=614798&view=diff
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/CollectionInfo.java (original)
+++ incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/CollectionInfo.java Wed Jan 23 21:38:20 2008
@@ -17,6 +17,8 @@
 */
 package org.apache.abdera.protocol.server;
 
+import org.apache.abdera.model.Collection;
+
 
 public interface CollectionInfo {
 
@@ -27,5 +29,7 @@
   String[] getAccepts(RequestContext request);
   
   CategoriesInfo[] getCategoriesInfo(RequestContext request);
+  
+  Collection asCollectionElement(RequestContext request);
 
 }

Added: incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/Filter.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/Filter.java?rev=614798&view=auto
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/Filter.java (added)
+++ incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/Filter.java Wed Jan 23 21:38:20 2008
@@ -0,0 +1,24 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  The ASF licenses this file to You
+* under the Apache License, Version 2.0 (the "License"); you may not
+* use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.  For additional information regarding
+* copyright in this work, please see the NOTICE file in the top level
+* directory of this distribution.
+*/
+package org.apache.abdera.protocol.server;
+
+public interface Filter {
+  
+  ResponseContext filter(RequestContext request, FilterChain chain);
+  
+}

Added: incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/FilterChain.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/FilterChain.java?rev=614798&view=auto
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/FilterChain.java (added)
+++ incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/FilterChain.java Wed Jan 23 21:38:20 2008
@@ -0,0 +1,43 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  The ASF licenses this file to You
+* under the Apache License, Version 2.0 (the "License"); you may not
+* use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.  For additional information regarding
+* copyright in this work, please see the NOTICE file in the top level
+* directory of this distribution.
+*/
+package org.apache.abdera.protocol.server;
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+public class FilterChain {
+
+  private final Iterator<Filter> filters;
+  private final Provider provider;
+  
+  public FilterChain( 
+    Provider provider,
+    RequestContext request) {
+      this.provider = provider;
+      this.filters = 
+        Arrays.asList(
+          provider.getFilters(request)).iterator();
+  }
+  
+  public ResponseContext next(RequestContext request) {
+    return filters.hasNext() ?
+      filters.next().filter(request, this) :
+      provider.process(request);
+  }
+  
+}

Modified: incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/Provider.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/Provider.java?rev=614798&r1=614797&r2=614798&view=diff
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/Provider.java (original)
+++ incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/Provider.java Wed Jan 23 21:38:20 2008
@@ -40,4 +40,6 @@
   
   ResponseContext process(RequestContext request);
   
+  Filter[] getFilters(RequestContext request);
+  
 }

Modified: incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/RequestContext.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/RequestContext.java?rev=614798&r1=614797&r2=614798&view=diff
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/RequestContext.java (original)
+++ incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/RequestContext.java Wed Jan 23 21:38:20 2008
@@ -80,6 +80,8 @@
   
   String[] getAttributeNames(Scope scope);
   
+  RequestContext setAttribute(String name, Object value);
+  
   RequestContext setAttribute(Scope scope, String name, Object value);
   
   InputStream getInputStream() throws IOException;

Modified: incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/WorkspaceInfo.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/WorkspaceInfo.java?rev=614798&r1=614797&r2=614798&view=diff
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/WorkspaceInfo.java (original)
+++ incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/WorkspaceInfo.java Wed Jan 23 21:38:20 2008
@@ -19,10 +19,13 @@
 
 import java.util.Collection;
 
+import org.apache.abdera.model.Workspace;
+
 public interface WorkspaceInfo {
 
   String getTitle(RequestContext requsest);
   
   Collection<CollectionInfo> getCollections(RequestContext request);
   
+  Workspace asWorkspaceElement(RequestContext request);
 }

Modified: incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/context/AbstractRequestContext.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/context/AbstractRequestContext.java?rev=614798&r1=614797&r2=614798&view=diff
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/context/AbstractRequestContext.java (original)
+++ incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/context/AbstractRequestContext.java Wed Jan 23 21:38:20 2008
@@ -153,4 +153,7 @@
     return cpath == null ? uri : uri.substring(cpath.length());
   }
   
+  public RequestContext setAttribute(String name, Object value) {
+    return setAttribute(Scope.REQUEST, name, value);
+  }
 }

Added: incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/context/RequestContextWrapper.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/context/RequestContextWrapper.java?rev=614798&view=auto
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/context/RequestContextWrapper.java (added)
+++ incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/context/RequestContextWrapper.java Wed Jan 23 21:38:20 2008
@@ -0,0 +1,278 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  The ASF licenses this file to You
+* under the Apache License, Version 2.0 (the "License"); you may not
+* use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.  For additional information regarding
+* copyright in this work, please see the NOTICE file in the top level
+* directory of this distribution.
+*/
+package org.apache.abdera.protocol.server.context;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.security.Principal;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+
+import javax.activation.MimeType;
+import javax.security.auth.Subject;
+
+import org.apache.abdera.Abdera;
+import org.apache.abdera.i18n.iri.IRI;
+import org.apache.abdera.model.Document;
+import org.apache.abdera.model.Element;
+import org.apache.abdera.parser.ParseException;
+import org.apache.abdera.parser.Parser;
+import org.apache.abdera.parser.ParserOptions;
+import org.apache.abdera.protocol.server.Provider;
+import org.apache.abdera.protocol.server.RequestContext;
+import org.apache.abdera.protocol.server.Target;
+import org.apache.abdera.util.EntityTag;
+
+public class RequestContextWrapper 
+  implements RequestContext {
+  
+  protected final RequestContext request;
+  
+  public RequestContextWrapper(RequestContext request) {
+    this.request = request;
+  }
+  
+  public Abdera getAbdera() {
+    return request.getAbdera();
+  }
+  
+  public Object getAttribute(Scope scope, String name) {
+    return request.getAttribute(scope,name);
+  }
+  
+  public String[] getAttributeNames(Scope scope) {
+    return request.getAttributeNames(scope);
+  }
+  
+  public IRI getBaseUri() {
+    return request.getBaseUri();
+  }
+  
+  public String getContextPath() {
+    return request.getContextPath();
+  }
+  
+  public <T extends Element> Document<T> getDocument() 
+    throws ParseException, IOException {
+      return request.getDocument();
+  }
+  
+  public <T extends Element> Document<T> getDocument(Parser parser)
+      throws ParseException, IOException {
+    return request.getDocument(parser);
+  }
+  
+  public <T extends Element> Document<T> getDocument(Parser parser,
+      ParserOptions options) throws ParseException, IOException {
+    return request.getDocument(parser,options);
+  }
+  
+  public <T extends Element> Document<T> getDocument(ParserOptions options)
+      throws ParseException, IOException {
+    return request.getDocument(options);
+  }
+  
+  public InputStream getInputStream() throws IOException {
+    return request.getInputStream();
+  }
+  
+  public String getMethod() {
+    return request.getMethod();
+  }
+  
+  public String getParameter(String name) {
+    return request.getParameter(name);
+  }
+  
+  public String[] getParameterNames() {
+    return request.getParameterNames();
+  }
+  
+  public List<String> getParameters(String name) {
+    return request.getParameters(name);
+  }
+  
+  public Locale getPreferredLocale() {
+    return request.getPreferredLocale();
+  }
+  
+  public Locale[] getPreferredLocales() {
+    return request.getPreferredLocales();
+  }
+  
+  public Principal getPrincipal() {
+    return request.getPrincipal();
+  }
+  
+  public Object getProperty(Property property) {
+    return request.getProperty(property);
+  }
+  
+  public Provider getProvider() {
+    return request.getProvider();
+  }
+  
+  public Reader getReader() throws IOException {
+    return request.getReader();
+  }
+  
+  public IRI getResolvedUri() {
+    return request.getResolvedUri();
+  }
+  
+  public Subject getSubject() {
+    return request.getSubject();
+  }
+  
+  public Target getTarget() {
+    return request.getTarget();
+  }
+  
+  public String getTargetPath() {
+    return request.getTargetPath();
+  }
+  
+  public IRI getUri() {
+    return request.getUri();
+  }
+  
+  public boolean isUserInRole(String role) {
+    return request.isUserInRole(role);
+  }
+  
+  public RequestContext setAttribute(Scope scope, String name, Object value) {
+    request.setAttribute(scope, name, value);
+    return this;
+  }
+  
+  public RequestContext setAttribute(String name, Object value) {
+    request.setAttribute(name, value);
+    return this;
+  }
+  
+  public String getAccept() {
+    return request.getAccept();
+  }
+  
+  public String getAcceptCharset() {
+    return request.getAcceptCharset();
+  }
+  
+  public String getAcceptEncoding() {
+    return request.getAcceptEncoding();
+  }
+  
+  public String getAcceptLanguage() {
+    return request.getAcceptLanguage();
+  }
+  
+  public String getAuthorization() {
+    return request.getAuthorization();
+  }
+  
+  public EntityTag[] getIfMatch() {
+    return request.getIfMatch();
+  }
+  
+  public Date getIfModifiedSince() {
+    return request.getIfModifiedSince();
+  }
+  
+  public EntityTag[] getIfNoneMatch() {
+    return request.getIfNoneMatch();
+  }
+  
+  public Date getIfUnmodifiedSince() {
+    return request.getIfUnmodifiedSince();
+  }
+  
+  public long getMaxStale() {
+    return request.getMaxStale();
+  }
+  
+  public long getMinFresh() {
+    return request.getMinFresh();
+  }
+  
+  public boolean isOnlyIfCached() {
+    return request.isOnlyIfCached();
+  }
+  
+  public String getCacheControl() {
+    return request.getCacheControl();
+  }
+  
+  public String getContentLanguage() {
+    return request.getContentLanguage();
+  }
+  
+  public IRI getContentLocation() {
+    return request.getContentLocation();
+  }
+  
+  public MimeType getContentType() {
+    return request.getContentType();
+  }
+  
+  public Date getDateHeader(String name) {
+    return request.getDateHeader(name);
+  }
+  
+  public String getDecodedHeader(String name) {
+    return request.getDecodedHeader(name);
+  }
+  
+  public String[] getDecodedHeaders(String name) {
+    return request.getDecodedHeaders(name);
+  }
+  
+  public String getHeader(String name) {
+    return request.getHeader(name);
+  }
+  
+  public String[] getHeaderNames() {
+    return request.getHeaderNames();
+  }
+  
+  public Object[] getHeaders(String name) {
+    return request.getHeaders(name);
+  }
+  
+  public long getMaxAge() {
+    return request.getMaxAge();
+  }
+  
+  public String getSlug() {
+    return request.getSlug();
+  }
+  
+  public boolean isNoCache() {
+    return request.isNoCache();
+  }
+  
+  public boolean isNoStore() {
+    return request.isNoStore();
+  }
+  
+  public boolean isNoTransform() {
+    return request.isNoTransform();
+  }
+  
+}

Modified: incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/context/ResponseContextException.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/context/ResponseContextException.java?rev=614798&r1=614797&r2=614798&view=diff
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/context/ResponseContextException.java (original)
+++ incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/context/ResponseContextException.java Wed Jan 23 21:38:20 2008
@@ -19,6 +19,9 @@
 
 
 public class ResponseContextException extends Exception {
+
+  private static final long serialVersionUID = -3031651143835987024L;
+
   private AbstractResponseContext responseContext;
 
   public ResponseContextException(AbstractResponseContext responseContext, Throwable t) {

Added: incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/context/ResponseContextWrapper.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/context/ResponseContextWrapper.java?rev=614798&view=auto
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/context/ResponseContextWrapper.java (added)
+++ incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/context/ResponseContextWrapper.java Wed Jan 23 21:38:20 2008
@@ -0,0 +1,313 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  The ASF licenses this file to You
+* under the Apache License, Version 2.0 (the "License"); you may not
+* use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.  For additional information regarding
+* copyright in this work, please see the NOTICE file in the top level
+* directory of this distribution.
+*/
+package org.apache.abdera.protocol.server.context;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Date;
+
+import javax.activation.MimeType;
+
+import org.apache.abdera.i18n.iri.IRI;
+import org.apache.abdera.i18n.text.CharUtils.Profile;
+import org.apache.abdera.protocol.server.ResponseContext;
+import org.apache.abdera.util.EntityTag;
+import org.apache.abdera.writer.Writer;
+
+public class ResponseContextWrapper 
+  implements ResponseContext {
+  
+  protected final ResponseContext response;
+  
+  public ResponseContextWrapper(ResponseContext response) {
+    this.response = response;
+  }
+  
+  public ResponseContext addEncodedHeader(
+    String name, 
+    String charset,
+    String value) {
+      return response.addEncodedHeader(name, charset, value);
+  }
+  
+  public ResponseContext addEncodedHeaders(
+    String name, 
+    String charset,
+    String... vals) {
+      return response.addEncodedHeaders(name, charset, vals);
+  }
+  
+  public ResponseContext addHeader(String name, Object value) {
+    return response.addHeader(name, value);
+  }
+  
+  public ResponseContext addHeaders(String name, Object... vals) {
+    return response.addHeaders(name, vals);
+  }
+  
+  public boolean hasEntity() {
+    return response.hasEntity();
+  }
+  
+  public ResponseContext removeHeader(String name) {
+    return response.removeHeader(name);
+  }
+  
+  public ResponseContext setAge(long age) {
+    return response.setAge(age);
+  }
+  
+  public ResponseContext setAllow(String method) {
+    return response.setAllow(method);
+  }
+  
+  public ResponseContext setAllow(String... methods) {
+    return response.setAllow(methods);
+  }
+  
+  public ResponseContext setContentLanguage(String language) {
+    return response.setContentLanguage(language);
+  }
+  
+  public ResponseContext setContentLength(long length) {
+    return response.setContentLength(length);
+  }
+  
+  public ResponseContext setContentLocation(String uri) {
+    return response.setContentLocation(uri);
+  }
+  
+  public ResponseContext setContentType(String type) {
+    return response.setContentType(type);
+  }
+  
+  public ResponseContext setContentType(String type, String charset) {
+    return response.setContentType(type, charset);
+  }
+  
+  public ResponseContext setEncodedHeader(
+    String name, 
+    String charset,
+    String value) {
+      return response.setEncodedHeader(name, charset, value);
+  }
+  
+  public ResponseContext setEncodedHeader(
+    String name, 
+    String charset,
+    String... vals) {
+      return response.setEncodedHeader(name, charset, vals);
+  }
+  
+  public ResponseContext setEntityTag(String etag) {
+    return response.setEntityTag(etag);
+  }
+  
+  public ResponseContext setEntityTag(EntityTag etag) {
+    return response.setEntityTag(etag);
+  }
+  
+  public ResponseContext setEscapedHeader(
+    String name, 
+    Profile profile,
+    String value) {
+      return response.setEscapedHeader(name, profile, value);
+  }
+  
+  public ResponseContext setExpires(Date date) {
+    return response.setExpires(date);
+  }
+  
+  public ResponseContext setHeader(String name, Object value) {
+    return response.setHeader(name, value);
+  }
+  
+  public ResponseContext setHeader(String name, Object... vals) {
+    return response.setHeader(name, vals);
+  }
+  
+  public ResponseContext setLastModified(Date date) {
+    return response.setLastModified(date);
+  }
+  
+  public ResponseContext setLocation(String uri) {
+    return response.setLocation(uri);
+  }
+  
+  public ResponseContext setSlug(String slug) {
+    return response.setSlug(slug);
+  }
+  
+  public ResponseContext setStatus(int status) {
+    return response.setStatus(status);
+  }
+  
+  public ResponseContext setStatusText(String text) {
+    return response.setStatusText(text);
+  }
+  
+  public ResponseContext setWriter(Writer writer) {
+    return response.setWriter(writer);
+  }
+  
+  public void writeTo(OutputStream out) throws IOException {
+    response.writeTo(out);
+  }
+  
+  public void writeTo(java.io.Writer javaWriter) throws IOException {
+    response.writeTo(javaWriter);
+  }
+  
+  public void writeTo(OutputStream out, Writer writer) throws IOException {
+    response.writeTo(out, writer);
+  }
+  
+  public void writeTo(java.io.Writer javaWriter, Writer abderaWriter)
+      throws IOException {
+    response.writeTo(javaWriter, abderaWriter);
+  }
+  
+  public long getAge() {
+    return response.getAge();
+  }
+  
+  public String getAllow() {
+    return response.getAllow();
+  }
+  
+  public long getContentLength() {
+    return response.getContentLength();
+  }
+  
+  public EntityTag getEntityTag() {
+    return response.getEntityTag();
+  }
+  
+  public Date getExpires() {
+    return response.getExpires();
+  }
+  
+  public Date getLastModified() {
+    return response.getLastModified();
+  }
+  
+  public IRI getLocation() {
+    return response.getLocation();
+  }
+  
+  public String[] getNoCacheHeaders() {
+    return response.getNoCacheHeaders();
+  }
+  
+  public String[] getPrivateHeaders() {
+    return response.getPrivateHeaders();
+  }
+  
+  public long getSMaxAge() {
+    return response.getSMaxAge();
+  }
+  
+  public int getStatus() {
+    return response.getStatus();
+  }
+  
+  public String getStatusText() {
+    return response.getStatusText();
+  }
+  
+  public ResponseType getType() {
+    return response.getType();
+  }
+  
+  public boolean isMustRevalidate() {
+    return response.isMustRevalidate();
+  }
+  
+  public boolean isPrivate() {
+    return response.isPrivate();
+  }
+  
+  public boolean isProxyRevalidate() {
+    return response.isProxyRevalidate();
+  }
+  
+  public boolean isPublic() {
+    return response.isPublic();
+  }
+  
+  public String getCacheControl() {
+    return response.getCacheControl();
+  }
+  
+  public String getContentLanguage() {
+    return response.getContentLanguage();
+  }
+  
+  public IRI getContentLocation() {
+    return response.getContentLocation();
+  }
+  
+  public MimeType getContentType() {
+    return response.getContentType();
+  }
+  
+  public Date getDateHeader(String name) {
+    return response.getDateHeader(name);
+  }
+  
+  public String getDecodedHeader(String name) {
+    return response.getDecodedHeader(name);
+  }
+  
+  public String[] getDecodedHeaders(String name) {
+    return response.getDecodedHeaders(name);
+  }
+  
+  public String getHeader(String name) {
+    return response.getHeader(name);
+  }
+  
+  public String[] getHeaderNames() {
+    return response.getHeaderNames();
+  }
+  
+  public Object[] getHeaders(String name) {
+    return response.getHeaders(name);
+  }
+  
+  public long getMaxAge() {
+    return response.getMaxAge();
+  }
+  
+  public String getSlug() {
+    return response.getSlug();
+  }
+  
+  public boolean isNoCache() {
+    return response.isNoCache();
+  }
+  
+  public boolean isNoStore() {
+    return response.isNoStore();
+  }
+  
+  public boolean isNoTransform() {
+    return response.isNoTransform();
+  }
+  
+}

Modified: incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractCollectionAdapter.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractCollectionAdapter.java?rev=614798&r1=614797&r2=614798&view=diff
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractCollectionAdapter.java (original)
+++ incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractCollectionAdapter.java Wed Jan 23 21:38:20 2008
@@ -5,12 +5,11 @@
 import java.io.IOException;
 import java.util.Date;
 
-import javax.activation.MimeType;
-
 import org.apache.abdera.Abdera;
 import org.apache.abdera.factory.Factory;
 import org.apache.abdera.i18n.iri.IRI;
 import org.apache.abdera.i18n.text.UrlEncoding;
+import org.apache.abdera.model.Collection;
 import org.apache.abdera.model.Document;
 import org.apache.abdera.model.Entry;
 import org.apache.abdera.model.Feed;
@@ -28,12 +27,14 @@
 import org.apache.abdera.protocol.server.context.BaseResponseContext;
 import org.apache.abdera.protocol.server.context.EmptyResponseContext;
 import org.apache.abdera.protocol.server.context.ResponseContextException;
-import org.apache.abdera.util.MimeTypeHelper;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
-public abstract class AbstractCollectionAdapter implements CollectionAdapter, MediaCollectionAdapter,
-  Transactional, CollectionInfo {
+public abstract class AbstractCollectionAdapter 
+  implements CollectionAdapter, 
+             MediaCollectionAdapter,
+             Transactional, 
+             CollectionInfo {
 
   private final static Log log = LogFactory.getLog(AbstractEntityCollectionAdapter.class);
 
@@ -182,4 +183,14 @@
     return ProviderHelper.getDefaultMethods(request);
   }
 
+  public Collection asCollectionElement(RequestContext request) {
+    Collection collection = request.getAbdera().getFactory().newCollection();
+    collection.setHref(getHref(request));
+    collection.setTitle(getTitle(request));
+    collection.setAccept(getAccepts(request));
+    for (CategoriesInfo catsinfo : getCategoriesInfo(request)) {
+      collection.addCategories(catsinfo.asCategoriesElement(request));
+    }
+    return collection;
+  }
 }

Modified: incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractEntityCollectionAdapter.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractEntityCollectionAdapter.java?rev=614798&r1=614797&r2=614798&view=diff
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractEntityCollectionAdapter.java (original)
+++ incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractEntityCollectionAdapter.java Wed Jan 23 21:38:20 2008
@@ -452,4 +452,5 @@
 
     return entry;
   }
+  
 }

Modified: incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractProvider.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractProvider.java?rev=614798&r1=614797&r2=614798&view=diff
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractProvider.java (original)
+++ incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractProvider.java Wed Jan 23 21:38:20 2008
@@ -18,16 +18,20 @@
 package org.apache.abdera.protocol.server.impl;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 
 import javax.security.auth.Subject;
 
 import org.apache.abdera.Abdera;
+import org.apache.abdera.model.Service;
 import org.apache.abdera.protocol.Resolver;
 import org.apache.abdera.protocol.server.CategoriesInfo;
 import org.apache.abdera.protocol.server.CategoryInfo;
 import org.apache.abdera.protocol.server.CollectionAdapter;
 import org.apache.abdera.protocol.server.CollectionInfo;
+import org.apache.abdera.protocol.server.Filter;
 import org.apache.abdera.protocol.server.MediaCollectionAdapter;
 import org.apache.abdera.protocol.server.Provider;
 import org.apache.abdera.protocol.server.ProviderHelper;
@@ -47,6 +51,7 @@
   
   protected Abdera abdera;
   protected Map<String,String> properties;
+  protected List<Filter> filters = new ArrayList<Filter>();
   
   public void init(
     Abdera abdera, 
@@ -161,6 +166,13 @@
     RequestContext request);
   
 
+  protected Service getServiceElement(RequestContext request) {
+    Service service = abdera.newService();
+    for (WorkspaceInfo wi : getWorkspaceManager(request).getWorkspaces(request))
+      service.addWorkspace(wi.asWorkspaceElement(request));
+    return service;
+  }
+  
   protected ResponseContext getServiceDocument(
     final RequestContext request) {
       return 
@@ -211,5 +223,12 @@
         .setContentType(Constants.APP_MEDIA_TYPE);
   }
 
-  
+  public Filter[] getFilters(RequestContext request) {
+    return filters.toArray(new Filter[filters.size()]);
+  }
+
+  public void addFilter(Filter... filters) {
+    for (Filter filter : filters)
+      this.filters.add(filter);
+  }  
 }

Modified: incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractWorkspaceManager.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractWorkspaceManager.java?rev=614798&r1=614797&r2=614798&view=diff
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractWorkspaceManager.java (original)
+++ incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractWorkspaceManager.java Wed Jan 23 21:38:20 2008
@@ -19,14 +19,14 @@
 
 import java.util.Collection;
 import java.util.HashSet;
-import java.util.Map;
 
-import org.apache.abdera.protocol.server.CollectionAdapter;
 import org.apache.abdera.protocol.server.RequestContext;
 import org.apache.abdera.protocol.server.WorkspaceInfo;
 import org.apache.abdera.protocol.server.WorkspaceManager;
 
-public abstract class AbstractWorkspaceManager implements WorkspaceManager {
+public abstract class AbstractWorkspaceManager 
+  implements WorkspaceManager {
+  
   protected Collection<WorkspaceInfo> workspaces;
 
   public Collection<WorkspaceInfo> getWorkspaces(RequestContext request) {

Added: incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractWorkspaceProvider.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractWorkspaceProvider.java?rev=614798&view=auto
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractWorkspaceProvider.java (added)
+++ incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/AbstractWorkspaceProvider.java Wed Jan 23 21:38:20 2008
@@ -0,0 +1,44 @@
+package org.apache.abdera.protocol.server.impl;
+
+import java.util.Collection;
+import java.util.HashSet;
+
+import org.apache.abdera.protocol.Resolver;
+import org.apache.abdera.protocol.server.RequestContext;
+import org.apache.abdera.protocol.server.Target;
+import org.apache.abdera.protocol.server.WorkspaceInfo;
+import org.apache.abdera.protocol.server.WorkspaceManager;
+
+public abstract class AbstractWorkspaceProvider 
+  extends AbstractProvider 
+  implements WorkspaceManager {
+  
+  protected Resolver<Target> targetResolver;
+  protected Collection<WorkspaceInfo> workspaces;
+
+  protected WorkspaceManager getWorkspaceManager(
+    RequestContext request) {
+      return this;
+  }
+    
+  protected Resolver<Target> getTargetResolver(
+    RequestContext request) {
+      return targetResolver;
+  }
+  
+  protected void setTargetResolver(Resolver<Target> targetResolver) {
+    this.targetResolver = targetResolver;
+  }
+  
+  public Collection<WorkspaceInfo> getWorkspaces(RequestContext request) {
+    return workspaces;
+  }
+
+  public void addWorkspace(WorkspaceInfo workspace) {
+    if (workspaces == null) {
+      workspaces = new HashSet<WorkspaceInfo>();
+    }
+    workspaces.add(workspace);
+  }
+  
+}

Modified: incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/DefaultWorkspaceManager.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/DefaultWorkspaceManager.java?rev=614798&r1=614797&r2=614798&view=diff
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/DefaultWorkspaceManager.java (original)
+++ incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/DefaultWorkspaceManager.java Wed Jan 23 21:38:20 2008
@@ -1,9 +1,7 @@
 package org.apache.abdera.protocol.server.impl;
 
 import org.apache.abdera.protocol.server.CollectionAdapter;
-import org.apache.abdera.protocol.server.CollectionInfo;
 import org.apache.abdera.protocol.server.RequestContext;
-import org.apache.abdera.protocol.server.WorkspaceInfo;
 import org.apache.abdera.protocol.server.RequestContext.Scope;
 
 

Modified: incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/SimpleCategoriesInfo.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/SimpleCategoriesInfo.java?rev=614798&r1=614797&r2=614798&view=diff
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/SimpleCategoriesInfo.java (original)
+++ incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/SimpleCategoriesInfo.java Wed Jan 23 21:38:20 2008
@@ -22,7 +22,6 @@
 import java.util.Iterator;
 import java.util.List;
 
-import org.apache.abdera.Abdera;
 import org.apache.abdera.model.Categories;
 import org.apache.abdera.protocol.server.CategoriesInfo;
 import org.apache.abdera.protocol.server.CategoryInfo;
@@ -30,10 +29,10 @@
 
 public class SimpleCategoriesInfo 
   implements CategoriesInfo, 
-             Serializable, 
-             Cloneable {
+             Serializable {
+  
+  private static final long serialVersionUID = 8732335394387909260L;
   
-  private static final long serialVersionUID = 1L;
   private final String href;
   private final String scheme;
   private final boolean fixed;
@@ -111,29 +110,15 @@
     return true;
   }
   
-  public Object clone() {
-    try {
-      return super.clone();
-    } catch (CloneNotSupportedException e) {
-      return href != null ? 
-        new SimpleCategoriesInfo(href) : 
-        new SimpleCategoriesInfo(
-          scheme, 
-          fixed, 
-          list.toArray(
-            new CategoryInfo[list.size()]));
-    }
-  }
-  
-  public Categories asCategoriesElement(Abdera abdera) {
-    Categories cats = abdera.getFactory().newCategories();
+  public Categories asCategoriesElement(RequestContext request) {
+    Categories cats = request.getAbdera().getFactory().newCategories();
     if (href != null) cats.setHref(href);
     else {
       cats.setFixed(fixed);
       cats.setScheme(scheme);
       for (CategoryInfo cat : this)
         cats.addCategory(
-          cat.asCategoryElement(abdera));
+          cat.asCategoryElement(request));
     }
     return cats;
   }

Modified: incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/SimpleCategoryInfo.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/SimpleCategoryInfo.java?rev=614798&r1=614797&r2=614798&view=diff
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/SimpleCategoryInfo.java (original)
+++ incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/SimpleCategoryInfo.java Wed Jan 23 21:38:20 2008
@@ -19,15 +19,13 @@
 
 import java.io.Serializable;
 
-import org.apache.abdera.Abdera;
 import org.apache.abdera.model.Category;
 import org.apache.abdera.protocol.server.CategoryInfo;
 import org.apache.abdera.protocol.server.RequestContext;
 
 public class SimpleCategoryInfo 
   implements CategoryInfo, 
-             Serializable, 
-             Cloneable {
+             Serializable {
   
   private static final long serialVersionUID = -4013333222147077975L;
   private final String label;
@@ -92,16 +90,8 @@
     return true;
   }
   
-  public Object clone() {
-    try {
-      return super.clone();
-    } catch (CloneNotSupportedException e) {
-      return new SimpleCategoryInfo(term,scheme,label);
-    }
-  }
-  
-  public Category asCategoryElement(Abdera abdera) {
-    Category cat = abdera.getFactory().newCategory();
+  public Category asCategoryElement(RequestContext request) {
+    Category cat = request.getAbdera().getFactory().newCategory();
     cat.setTerm(term);
     if (scheme != null) cat.setScheme(scheme);
     if (label != null) cat.setLabel(label);

Copied: incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/SimpleCollectionInfo.java (from r614767, incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/SimpleCollection.java)
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/SimpleCollectionInfo.java?p2=incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/SimpleCollectionInfo.java&p1=incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/SimpleCollection.java&r1=614767&r2=614798&rev=614798&view=diff
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/SimpleCollection.java (original)
+++ incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/SimpleCollectionInfo.java Wed Jan 23 21:38:20 2008
@@ -19,44 +19,34 @@
 
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
+import org.apache.abdera.model.Collection;
 import org.apache.abdera.protocol.server.CategoriesInfo;
-import org.apache.abdera.protocol.server.CollectionAdapter;
 import org.apache.abdera.protocol.server.CollectionInfo;
 import org.apache.abdera.protocol.server.RequestContext;
 
-public class SimpleCollection 
+public class SimpleCollectionInfo 
   implements CollectionInfo, 
              Serializable {
   
   private static final long serialVersionUID = 8026455829158149510L;
   
-  private final CollectionAdapter adapter;
-  private final String id;
   private final String title;
   private final String href;
   private final String[] accepts;
   private final List<CategoriesInfo> catinfos = new ArrayList<CategoriesInfo>();
   
-  public SimpleCollection(
-    CollectionAdapter adapter,
-    String id,
+  public SimpleCollectionInfo(
     String title,
     String href,
     String... accepts) {
-      this.adapter = adapter;
-      this.id = id;
       this.title = title;
       this.accepts = accepts;
       this.href = href;
   }
   
-  public boolean isCollectionFor(RequestContext request) {
-    // TODO Auto-generated method stub
-    return false;
-  }
-
   public String[] getAccepts(RequestContext request) {
     return accepts;
   }
@@ -69,14 +59,6 @@
     return title;
   }
   
-  public boolean isAdapterFor(RequestContext request) {
-    return request.getTarget().getParameter("collection").equals(this.id);
-  }
-
-  public CollectionAdapter getCollectionAdapter(RequestContext request) {
-    return adapter;
-  }
-
   public CategoriesInfo[] getCategoriesInfo(RequestContext request) {
     return catinfos.toArray(new CategoriesInfo[catinfos.size()]);
   }
@@ -89,5 +71,44 @@
   public void setCategoriesInfo(CategoriesInfo...catinfos) {
     this.catinfos.clear();
     addCategoriesInfo(catinfos);
+  }
+
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + Arrays.hashCode(accepts);
+    result = prime * result + ((catinfos == null) ? 0 : catinfos.hashCode());
+    result = prime * result + ((href == null) ? 0 : href.hashCode());
+    result = prime * result + ((title == null) ? 0 : title.hashCode());
+    return result;
+  }
+
+  public boolean equals(Object obj) {
+    if (this == obj) return true;
+    if (obj == null) return false;
+    if (getClass() != obj.getClass()) return false;
+    final SimpleCollectionInfo other = (SimpleCollectionInfo) obj;
+    if (!Arrays.equals(accepts, other.accepts)) return false;
+    if (catinfos == null) {
+      if (other.catinfos != null) return false;
+    } else if (!catinfos.equals(other.catinfos)) return false;
+    if (href == null) {
+      if (other.href != null) return false;
+    } else if (!href.equals(other.href)) return false;
+    if (title == null) {
+      if (other.title != null) return false;
+    } else if (!title.equals(other.title)) return false;
+    return true;
+  }
+  
+  public Collection asCollectionElement(RequestContext request) {
+    Collection collection = request.getAbdera().getFactory().newCollection();
+    collection.setHref(href);
+    collection.setTitle(title);
+    collection.setAccept(accepts);
+    for (CategoriesInfo catsinfo : this.catinfos) {
+      collection.addCategories(catsinfo.asCategoriesElement(request));
+    }
+    return collection;
   }
 }

Added: incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/SimpleWorkspaceInfo.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/SimpleWorkspaceInfo.java?rev=614798&view=auto
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/SimpleWorkspaceInfo.java (added)
+++ incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/impl/SimpleWorkspaceInfo.java Wed Jan 23 21:38:20 2008
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  The ASF licenses this file to You
+ * under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+package org.apache.abdera.protocol.server.impl;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.abdera.model.Workspace;
+import org.apache.abdera.protocol.server.CollectionInfo;
+import org.apache.abdera.protocol.server.RequestContext;
+import org.apache.abdera.protocol.server.WorkspaceInfo;
+
+public class SimpleWorkspaceInfo 
+  implements WorkspaceInfo,
+             Serializable {
+
+  private static final long serialVersionUID = -8459688584319762878L;
+  
+  protected String title;
+  protected Set<CollectionInfo> collections;
+
+  public String getTitle() {
+    return title;
+  }
+
+  public void setTitle(String title) {
+    this.title = title;
+  }
+
+  public String getTitle(RequestContext request) {
+    return title;
+  }
+
+  public void addCollection(CollectionInfo ci) {
+    getCollections().add(ci);
+  }
+
+  public Collection<CollectionInfo> getCollections(RequestContext request) {
+    return collections;
+  }
+
+  public Set<CollectionInfo> getCollections() {
+    if (collections == null) {
+      collections = new HashSet<CollectionInfo>();
+    }
+
+    return collections;
+  }
+
+  public void setCollections(Set<CollectionInfo> collections) {
+    this.collections = collections;
+  }
+
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result
+        + ((collections == null) ? 0 : collections.hashCode());
+    result = prime * result + ((title == null) ? 0 : title.hashCode());
+    return result;
+  }
+
+  public boolean equals(Object obj) {
+    if (this == obj) return true;
+    if (obj == null) return false;
+    if (getClass() != obj.getClass()) return false;
+    final SimpleWorkspaceInfo other = (SimpleWorkspaceInfo) obj;
+    if (collections == null) {
+      if (other.collections != null) return false;
+    } else if (!collections.equals(other.collections)) return false;
+    if (title == null) {
+      if (other.title != null) return false;
+    } else if (!title.equals(other.title)) return false;
+    return true;
+  }
+  
+  public Workspace asWorkspaceElement(RequestContext request) {
+    Workspace workspace = request.getAbdera().getFactory().newWorkspace();
+    workspace.setTitle(title);
+    for (CollectionInfo collection : this.collections)
+      workspace.addCollection(collection.asCollectionElement(request));
+    return workspace;
+  }
+}

Modified: incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/provider/basic/BasicProvider.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/provider/basic/BasicProvider.java?rev=614798&r1=614797&r2=614798&view=diff
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/provider/basic/BasicProvider.java (original)
+++ incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/provider/basic/BasicProvider.java Wed Jan 23 21:38:20 2008
@@ -17,12 +17,16 @@
 */
 package org.apache.abdera.protocol.server.provider.basic;
 
+import org.apache.abdera.Abdera;
+import org.apache.abdera.protocol.server.CollectionAdapter;
+import org.apache.abdera.protocol.server.RequestContext;
 import org.apache.abdera.protocol.server.TargetType;
-import org.apache.abdera.protocol.server.impl.DefaultProvider;
+import org.apache.abdera.protocol.server.impl.AbstractWorkspaceProvider;
+import org.apache.abdera.protocol.server.impl.CollectionAdapterManager;
 import org.apache.abdera.protocol.server.impl.RegexTargetResolver;
 
 public class BasicProvider 
-  extends DefaultProvider {
+  extends AbstractWorkspaceProvider {
 
   public static final String PARAM_FEED = "feed";
   public static final String PARAM_ENTRY = "entry";
@@ -34,7 +38,28 @@
         .setPattern("/" + "([^/#?]+)", TargetType.TYPE_COLLECTION, PARAM_FEED)
         .setPattern("/" + "([^/#?]+)/([^/#?]+)", TargetType.TYPE_ENTRY, PARAM_FEED, PARAM_ENTRY)
     );
-    addWorkspace(new BasicWorkspace());
+    addWorkspace(new BasicWorkspace(this));
+  }
+
+  protected CollectionAdapterManager cam;
+  
+  protected CollectionAdapterManager getCollectionAdapterManager(
+    Abdera abdera) {
+      if (cam == null) 
+        cam = new CollectionAdapterManager(abdera);
+    return cam;
+  }
+  
+  public CollectionAdapter getCollectionAdapter(RequestContext request) {
+    try {
+      return getCollectionAdapterManager(request.getAbdera())
+        .getAdapter(
+          request.getTarget()
+            .getParameter(
+                BasicProvider.PARAM_FEED));
+    } catch (Exception e) {
+      return null;
+    }
   }
   
 }

Modified: incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/provider/basic/BasicWorkspace.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/provider/basic/BasicWorkspace.java?rev=614798&r1=614797&r2=614798&view=diff
==============================================================================
--- incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/provider/basic/BasicWorkspace.java (original)
+++ incubator/abdera/java/branches/server_refactor_all/server/src/main/java/org/apache/abdera/protocol/server/provider/basic/BasicWorkspace.java Wed Jan 23 21:38:20 2008
@@ -23,61 +23,47 @@
 import java.util.Map;
 import java.util.Properties;
 
-import org.apache.abdera.protocol.server.CollectionAdapter;
+import org.apache.abdera.model.Workspace;
 import org.apache.abdera.protocol.server.CollectionInfo;
 import org.apache.abdera.protocol.server.RequestContext;
 import org.apache.abdera.protocol.server.WorkspaceInfo;
 import org.apache.abdera.protocol.server.impl.CollectionAdapterManager;
-import org.apache.abdera.protocol.server.impl.SimpleCollection;
+import org.apache.abdera.protocol.server.impl.SimpleCollectionInfo;
 
-public class BasicWorkspace implements WorkspaceInfo {
-
-  protected CollectionAdapterManager cam;
+class BasicWorkspace 
+  implements WorkspaceInfo {
+  
+  private final BasicProvider provider;
   
-  protected CollectionAdapterManager getCollectionAdapterManager(
-    RequestContext request) {
-      if (cam == null) 
-        cam = new CollectionAdapterManager(
-          request.getAbdera());
-    return cam;
+  BasicWorkspace(BasicProvider provider) {
+    this.provider = provider;
   }
   
   public Collection<CollectionInfo> getCollections(RequestContext request) {
-    CollectionAdapterManager cam = getCollectionAdapterManager(request);
+    CollectionAdapterManager cam = provider.getCollectionAdapterManager(request.getAbdera());
     List<CollectionInfo> collections = new ArrayList<CollectionInfo>();
     try {
       Map<String,Properties> map = cam.listAdapters();
       for (Map.Entry<String,Properties> entry : map.entrySet()) {
-        String id = entry.getKey();
         Properties properties = entry.getValue();
-        CollectionAdapter ca = cam.getAdapter(id);
         String href = properties.getProperty(BasicAdapter.PROP_NAME_FEED_URI);
         String title = properties.getProperty(BasicAdapter.PROP_NAME_TITLE);
-        SimpleCollection col = new SimpleCollection(ca,id,title,href,"application/atom+xml;type=entry");
+        SimpleCollectionInfo col = new SimpleCollectionInfo(title,href,"application/atom+xml;type=entry");
         collections.add(col);
       }
     } catch (Exception e) {}
     return collections;
   }
 
-  public CollectionAdapter getCollectionAdapter(RequestContext request) {
-    try {
-      return getCollectionAdapterManager(request)
-        .getAdapter(
-          request.getTarget()
-            .getParameter(
-                BasicProvider.PARAM_FEED));
-    } catch (Exception e) {
-      return null;
-    }
-  }
-
   public String getTitle(RequestContext request) {
     return "Abdera";
   }
 
-  public boolean isWorkspaceFor(RequestContext request) {
-    return getCollectionAdapter(request) != null;
+  public Workspace asWorkspaceElement(RequestContext request) {
+    Workspace workspace = request.getAbdera().getFactory().newWorkspace();
+    workspace.setTitle(getTitle(null));
+    for (CollectionInfo collection : getCollections(request))
+      workspace.addCollection(collection.asCollectionElement(request));
+    return workspace;
   }
-
 }