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 2006/09/12 00:04:09 UTC

svn commit: r442370 - in /incubator/abdera/java/trunk: examples/src/main/java/org/apache/abdera/examples/appserver/ examples/src/main/resources/org/apache/abdera/examples/appserver/ server/src/main/java/org/apache/abdera/protocol/server/ server/src/mai...

Author: jmsnell
Date: Mon Sep 11 15:04:08 2006
New Revision: 442370

URL: http://svn.apache.org/viewvc?view=rev&rev=442370
Log:
More incremental improvement.
Shift stuff around to eliminate unnecessary packages
Use a pool model for Providers and Request Handlers
Call it RequestHandlerManager and ProviderManager instead of a *Factory.

Added:
    incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleProviderManager.java
    incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleRequestHandlerManager.java
      - copied, changed from r441673, incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleRequestHandlerFactory.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/Provider.java
      - copied, changed from r441673, incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/provider/Provider.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/ProviderManager.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestHandlerManager.java
      - copied, changed from r441582, incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestHandlerFactory.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/SubjectResolver.java
      - copied, changed from r441629, incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/auth/SubjectResolver.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/Target.java
      - copied, changed from r442264, incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/target/Target.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/TargetResolver.java
      - copied, changed from r438670, incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/target/TargetResolver.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractPooledProviderManager.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractRequestHandlerManager.java
      - copied, changed from r441582, incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractRequestHandlerFactory.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractSimpleProviderManager.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/PoolManager.java
Removed:
    incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleRequestHandlerFactory.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestHandlerFactory.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/auth/
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/provider/
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/target/
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractRequestHandlerFactory.java
Modified:
    incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleProvider.java
    incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleRequestHandler.java
    incubator/abdera/java/trunk/examples/src/main/resources/org/apache/abdera/examples/appserver/web.xml
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/AbderaServer.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestContext.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestHandler.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/AbderaServlet.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/ServletRequestContext.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractProvider.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractRequestHandler.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/EmptyResponseContext.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/RegexTargetResolver.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/ResourceType.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/ServerConstants.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/SimpleSubjectResolver.java
    incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/TargetIterator.java

Modified: incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleProvider.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleProvider.java?view=diff&rev=442370&r1=442369&r2=442370
==============================================================================
--- incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleProvider.java (original)
+++ incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleProvider.java Mon Sep 11 15:04:08 2006
@@ -30,11 +30,11 @@
 import org.apache.abdera.model.Workspace;
 import org.apache.abdera.parser.stax.util.FOMHelper;
 import org.apache.abdera.protocol.server.AbderaServer;
+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.protocol.server.exceptions.AbderaServerException;
 import org.apache.abdera.protocol.server.exceptions.AbderaServerException.Code;
-import org.apache.abdera.protocol.server.provider.Provider;
-import org.apache.abdera.protocol.server.target.Target;
 import org.apache.abdera.protocol.server.util.AbstractProvider;
 
 public class SimpleProvider 
@@ -44,8 +44,8 @@
   private static Document<Service> service_doc = null;
   private static Document<Feed> feed_doc = null;
   
-  public SimpleProvider(AbderaServer abderaServer) {
-    super(abderaServer);
+  public SimpleProvider(AbderaServer abderaServer, SimpleProviderManager factory) {
+    super(abderaServer, factory);
   }
   
   private synchronized Document<Service> getService() {

Added: incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleProviderManager.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleProviderManager.java?view=auto&rev=442370
==============================================================================
--- incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleProviderManager.java (added)
+++ incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleProviderManager.java Mon Sep 11 15:04:08 2006
@@ -0,0 +1,40 @@
+/*
+* 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.AbderaServer;
+import org.apache.abdera.protocol.server.Provider;
+import org.apache.abdera.protocol.server.ProviderManager;
+import org.apache.abdera.protocol.server.exceptions.AbderaServerException;
+import org.apache.abdera.protocol.server.util.AbstractSimpleProviderManager;
+
+public class SimpleProviderManager 
+  extends AbstractSimpleProviderManager
+  implements ProviderManager {
+
+  private Provider provider = null;
+  
+  protected synchronized Provider getProvider(
+    AbderaServer abderaServer) throws AbderaServerException {
+      if (provider == null)  {
+        provider = new SimpleProvider(abderaServer, this);
+      }
+      return provider;
+  }
+
+}

Modified: incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleRequestHandler.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleRequestHandler.java?view=diff&rev=442370&r1=442369&r2=442370
==============================================================================
--- incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleRequestHandler.java (original)
+++ incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleRequestHandler.java Mon Sep 11 15:04:08 2006
@@ -24,11 +24,11 @@
 import org.apache.abdera.model.Feed;
 import org.apache.abdera.model.Service;
 import org.apache.abdera.protocol.server.AbderaServer;
+import org.apache.abdera.protocol.server.Provider;
 import org.apache.abdera.protocol.server.RequestContext;
 import org.apache.abdera.protocol.server.ResponseContext;
+import org.apache.abdera.protocol.server.Target;
 import org.apache.abdera.protocol.server.exceptions.AbderaServerException;
-import org.apache.abdera.protocol.server.provider.Provider;
-import org.apache.abdera.protocol.server.target.Target;
 import org.apache.abdera.protocol.server.util.AbstractRequestHandler;
 import org.apache.abdera.protocol.server.util.BaseResponseContext;
 import org.apache.abdera.protocol.server.util.EmptyResponseContext;
@@ -52,27 +52,17 @@
 public class SimpleRequestHandler 
   extends AbstractRequestHandler {
   
-  public SimpleRequestHandler(AbderaServer abderaServer, Provider provider) {
-    super(provider);
-  }
-  
-  @Override
-  protected ResourceType getResourceType(RequestContext requestContext) {
-    Target target = requestContext.getTarget();
-    return (target != null && target.getResourceType() != null) ? 
-      target.getResourceType() : ResourceType.UNKNOWN;
-  }
-
-  @Override
-  protected ResponseContext createResponseContext() {
-    return null;
+  public SimpleRequestHandler(
+    AbderaServer abderaServer, 
+    SimpleRequestHandlerManager factory) {
+      super(factory);
   }
   
   @SuppressWarnings("unchecked")
   @Override
   protected ResponseContext internalInvoke(
     RequestContext requestContext,
-    ResponseContext responseContext) 
+    Provider provider) 
       throws AbderaServerException {
     Target target = requestContext.getTarget();
     String method = requestContext.getMethod();
@@ -85,17 +75,17 @@
                 AbderaServerException.Code.NOTMODIFIED, 
                 "Not Modified", "");
           } catch (NullPointerException npe) {}
-          return getServiceDocument(requestContext);
+          return getServiceDocument(requestContext, provider);
       } else if (type == ResourceType.COLLECTION) {
           if (method.equals("GET")) {
             if (!target.getValue(1).equals("foo")) 
               throw new AbderaServerException(
                 AbderaServerException.Code.NOTFOUND, 
                 "Not Found", "");
-            return getFeedDocument(requestContext);
+            return getFeedDocument(requestContext, provider);
           } else if (method.equals("POST")) {
             try {
-              Entry entry = getProvider().addEntry(requestContext);
+              Entry entry = provider.addEntry(requestContext);
               if (entry != null) {
                 BaseResponseContext rc = getEntryDocument(entry);
                 rc.setStatus(201);
@@ -116,11 +106,11 @@
           }
       } else if (type == ResourceType.ENTRY_EDIT) {
           if (method.equals("GET")) {
-            Entry e = getProvider().getEntry(requestContext);
+            Entry e = provider.getEntry(requestContext);
             return new BaseResponseContext(e.getDocument());
           } else if (method.equals("PUT")) {
             try {
-              Entry entry = getProvider().updateEntry(requestContext);
+              Entry entry = provider.updateEntry(requestContext);
               if (entry == null) 
                 throw new AbderaServerException(
                   AbderaServerException.Code.UNSUPPORTEDMEDIATYPE, 
@@ -132,7 +122,7 @@
               throw new AbderaServerException(e);
             }
           } else if (method.equals("DELETE")) {
-            getProvider().deleteEntry(requestContext);
+            provider.deleteEntry(requestContext);
             return new EmptyResponseContext(204);
           }
       }
@@ -155,10 +145,11 @@
   }
   
   private BaseResponseContext<Document<Service>> getServiceDocument(
-    RequestContext context) 
+    RequestContext context, 
+    Provider provider) 
       throws AbderaServerException {
     Document<Service> service_doc = 
-      getProvider().getService(context).getDocument();
+      provider.getService(context).getDocument();
     BaseResponseContext<Document<Service>> rc = 
       new BaseResponseContext<Document<Service>>(service_doc);
     rc.setEntityTag("\"service\"");
@@ -168,10 +159,10 @@
   }
   
   private BaseResponseContext<Document<Feed>> getFeedDocument(
-    RequestContext context) 
+    RequestContext context, Provider provider) 
       throws AbderaServerException {
     Document<Feed> feed_doc = 
-      getProvider().getFeed(context).getDocument();
+      provider.getFeed(context).getDocument();
     BaseResponseContext<Document<Feed>> rc =
       new BaseResponseContext<Document<Feed>>(feed_doc);
     rc.setContentType("application/atom+xml");

Copied: incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleRequestHandlerManager.java (from r441673, incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleRequestHandlerFactory.java)
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleRequestHandlerManager.java?view=diff&rev=442370&p1=incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleRequestHandlerFactory.java&r1=441673&p2=incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleRequestHandlerManager.java&r2=442370
==============================================================================
--- incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleRequestHandlerFactory.java (original)
+++ incubator/abdera/java/trunk/examples/src/main/java/org/apache/abdera/examples/appserver/SimpleRequestHandlerManager.java Mon Sep 11 15:04:08 2006
@@ -19,27 +19,18 @@
 
 import org.apache.abdera.protocol.server.AbderaServer;
 import org.apache.abdera.protocol.server.RequestHandler;
-import org.apache.abdera.protocol.server.RequestHandlerFactory;
-import org.apache.abdera.protocol.server.provider.Provider;
-import org.apache.abdera.protocol.server.util.AbstractRequestHandlerFactory;
+import org.apache.abdera.protocol.server.RequestHandlerManager;
+import org.apache.abdera.protocol.server.exceptions.AbderaServerException;
+import org.apache.abdera.protocol.server.util.AbstractRequestHandlerManager;
 
-public class SimpleRequestHandlerFactory
-  extends AbstractRequestHandlerFactory
-  implements RequestHandlerFactory {
+public class SimpleRequestHandlerManager
+  extends AbstractRequestHandlerManager
+  implements RequestHandlerManager {
 
-  private Provider provider = null;
-
-  private synchronized Provider getProvider(AbderaServer server) {
-    if (provider == null) {
-      provider = new SimpleProvider(server);
-    }
-    return provider;
-  }
-  
   @Override
   protected RequestHandler newRequestHandlerInstance(
-    AbderaServer abderaServer) {
-      return new SimpleRequestHandler(abderaServer, getProvider(abderaServer));
+    AbderaServer abderaServer) throws AbderaServerException {
+      return new SimpleRequestHandler(abderaServer, this);
   }
 
 }

Modified: incubator/abdera/java/trunk/examples/src/main/resources/org/apache/abdera/examples/appserver/web.xml
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/examples/src/main/resources/org/apache/abdera/examples/appserver/web.xml?view=diff&rev=442370&r1=442369&r2=442370
==============================================================================
--- incubator/abdera/java/trunk/examples/src/main/resources/org/apache/abdera/examples/appserver/web.xml (original)
+++ incubator/abdera/java/trunk/examples/src/main/resources/org/apache/abdera/examples/appserver/web.xml Mon Sep 11 15:04:08 2006
@@ -12,7 +12,7 @@
       <param-value>org.apache.abdera.examples.appserver.SimpleRequestHandlerFactory</param-value>
     </init-param>
     <init-param>
-      <param-name>org.apache.abdera.protocol.server.target.TargetResolver</param-name>
+      <param-name>org.apache.abdera.protocol.server.TargetResolver</param-name>
       <param-value>org.apache.abdera.examples.appserver.SimpleTargetResolver</param-value>
     </init-param>
   </servlet>

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/AbderaServer.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/AbderaServer.java?view=diff&rev=442370&r1=442369&r2=442370
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/AbderaServer.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/AbderaServer.java Mon Sep 11 15:04:08 2006
@@ -18,65 +18,86 @@
 package org.apache.abdera.protocol.server;
 
 import org.apache.abdera.Abdera;
-import org.apache.abdera.protocol.server.auth.SubjectResolver;
-import org.apache.abdera.protocol.server.target.TargetResolver;
 import org.apache.abdera.protocol.server.util.ServerConstants;
 import org.apache.abdera.util.ServiceUtil;
 
 public class AbderaServer implements ServerConstants {
   
   private final Abdera abdera;
-  private final RequestHandlerFactory handlerFactory;
+  private final RequestHandlerManager handlerManager;
   private final TargetResolver targetResolver;
   private final SubjectResolver subjectResolver;
-  private final String defaultHandlerFactory;
+  private final ProviderManager providerManager;
+  private final String defaultHandlerManager;
+  private final String defaultProviderManager;
   private final String defaultTargetResolver;
   private final String defaultSubjectResolver;
   
   public AbderaServer() {
-    this(new Abdera(),"","",DEFAULT_SUBJECT_RESOLVER);
+    this(new Abdera());
   }
   
   public AbderaServer(
     String defaultTargetResolver, 
-    String defaultHandlerFactory,
-    String defaultSubjectResolver) {
-      this(new Abdera(), defaultTargetResolver, defaultHandlerFactory, defaultSubjectResolver);
+    String defaultHandlerManager,
+    String defaultSubjectResolver,
+    String defaultProviderManager) {
+      this(new Abdera(), 
+           defaultTargetResolver, 
+           defaultHandlerManager, 
+           defaultSubjectResolver,
+           defaultProviderManager);
   }
   
   public AbderaServer(Abdera abdera) {
-    this(abdera,"","",DEFAULT_SUBJECT_RESOLVER);
+    this(abdera,"","",DEFAULT_SUBJECT_RESOLVER, "");
   }
   
   public AbderaServer(
     Abdera abdera, 
     String defaultTargetResolver, 
-    String defaultHandlerFactory,
-    String defaultSubjectResolver) {
+    String defaultHandlerManager,
+    String defaultSubjectResolver,
+    String defaultProviderFactory) {
       this.abdera = abdera;
-      this.handlerFactory = newRequestHandlerFactory(defaultHandlerFactory);
+      this.handlerManager = newRequestHandlerManager(defaultHandlerManager);
       this.targetResolver = newTargetResolver(defaultTargetResolver);
       this.subjectResolver = newSubjectResolver(defaultSubjectResolver);
-      this.defaultHandlerFactory = defaultHandlerFactory;
+      this.providerManager = newProviderManager(defaultProviderFactory);
+      this.defaultHandlerManager = defaultHandlerManager;
       this.defaultTargetResolver = defaultTargetResolver;
       this.defaultSubjectResolver = defaultSubjectResolver;
+      this.defaultProviderManager = defaultProviderFactory;
   }
   
   public Abdera getAbdera() {
     return abdera;
   }
   
-  public RequestHandlerFactory newRequestHandlerFactory() {
-    return newRequestHandlerFactory(defaultHandlerFactory);
+  public ProviderManager newProviderManager() {
+    return newProviderManager(defaultProviderManager);
   }
   
-  public RequestHandlerFactory newRequestHandlerFactory(String _default) {
-    return (RequestHandlerFactory) ServiceUtil.newInstance(
-      HANDLER_FACTORY, (_default != null) ? _default : "", abdera);
+  public ProviderManager newProviderManager(String _default) {
+    return (ProviderManager) ServiceUtil.newInstance(
+      PROVIDER_MANAGER, (_default != null) ? _default : "", abdera);
+  }
+
+  public ProviderManager getProviderManager() {
+    return providerManager;
+  }
+  
+  public RequestHandlerManager newRequestHandlerManager() {
+    return newRequestHandlerManager(defaultHandlerManager);
+  }
+  
+  public RequestHandlerManager newRequestHandlerManager(String _default) {
+    return (RequestHandlerManager) ServiceUtil.newInstance(
+      HANDLER_MANAGER, (_default != null) ? _default : "", abdera);
   }
   
-  public RequestHandlerFactory getRequestHandlerFactory() {
-    return handlerFactory;
+  public RequestHandlerManager getRequestHandlerManager() {
+    return handlerManager;
   }
   
   public TargetResolver newTargetResolver() {

Copied: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/Provider.java (from r441673, incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/provider/Provider.java)
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/Provider.java?view=diff&rev=442370&p1=incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/provider/Provider.java&r1=441673&p2=incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/Provider.java&r2=442370
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/provider/Provider.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/Provider.java Mon Sep 11 15:04:08 2006
@@ -15,13 +15,12 @@
 * copyright in this work, please see the NOTICE file in the top level
 * directory of this distribution.
 */
-package org.apache.abdera.protocol.server.provider;
+package org.apache.abdera.protocol.server;
 
 import org.apache.abdera.model.Entry;
 import org.apache.abdera.model.Feed;
 import org.apache.abdera.model.Service;
 import org.apache.abdera.model.Source;
-import org.apache.abdera.protocol.server.RequestContext;
 import org.apache.abdera.protocol.server.exceptions.AbderaServerException;
 
 public interface Provider {
@@ -43,5 +42,7 @@
   void deleteEntry(RequestContext context) throws AbderaServerException;
   
   Source getFeedForEntry(Entry entry) throws AbderaServerException;  
+  
+  ProviderManager getProviderManager();
   
 }

Added: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/ProviderManager.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/ProviderManager.java?view=auto&rev=442370
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/ProviderManager.java (added)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/ProviderManager.java Mon Sep 11 15:04:08 2006
@@ -0,0 +1,28 @@
+/*
+* 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 org.apache.abdera.protocol.server.exceptions.AbderaServerException;
+
+public interface ProviderManager {
+
+  Provider newProvider(AbderaServer server) throws AbderaServerException;
+  
+  void releaseProvider(Provider provider);
+  
+}

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestContext.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestContext.java?view=diff&rev=442370&r1=442369&r2=442370
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestContext.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestContext.java Mon Sep 11 15:04:08 2006
@@ -24,10 +24,14 @@
 
 import javax.security.auth.Subject;
 
+import org.apache.abdera.Abdera;
 import org.apache.abdera.protocol.Request;
-import org.apache.abdera.protocol.server.target.Target;
 
 public interface RequestContext extends Request {
+  
+  Abdera getAbdera();
+  
+  AbderaServer getServer();
   
   Target getTarget();
   

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestHandler.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestHandler.java?view=diff&rev=442370&r1=442369&r2=442370
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestHandler.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestHandler.java Mon Sep 11 15:04:08 2006
@@ -28,10 +28,6 @@
     RequestContext requestContext) 
       throws AbderaServerException;
   
-  /**
-   * RequestHandlers that do have reason to store request specific state MUST
-   * clean that internal state when the clean method is invoked.
-   */
-  void clean();
+  RequestHandlerManager getRequestHandlerManager();
   
 }

Copied: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestHandlerManager.java (from r441582, incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestHandlerFactory.java)
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestHandlerManager.java?view=diff&rev=442370&p1=incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestHandlerFactory.java&r1=441582&p2=incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestHandlerManager.java&r2=442370
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestHandlerFactory.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/RequestHandlerManager.java Mon Sep 11 15:04:08 2006
@@ -19,7 +19,7 @@
 
 import org.apache.abdera.protocol.server.exceptions.AbderaServerException;
 
-public interface RequestHandlerFactory {
+public interface RequestHandlerManager {
   
   RequestHandler newRequestHandler(
     AbderaServer abderaServer) 

Copied: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/SubjectResolver.java (from r441629, incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/auth/SubjectResolver.java)
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/SubjectResolver.java?view=diff&rev=442370&p1=incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/auth/SubjectResolver.java&r1=441629&p2=incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/SubjectResolver.java&r2=442370
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/auth/SubjectResolver.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/SubjectResolver.java Mon Sep 11 15:04:08 2006
@@ -15,7 +15,7 @@
 * copyright in this work, please see the NOTICE file in the top level
 * directory of this distribution.
 */
-package org.apache.abdera.protocol.server.auth;
+package org.apache.abdera.protocol.server;
 
 import java.security.Principal;
 

Copied: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/Target.java (from r442264, incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/target/Target.java)
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/Target.java?view=diff&rev=442370&p1=incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/target/Target.java&r1=442264&p2=incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/Target.java&r2=442370
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/target/Target.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/Target.java Mon Sep 11 15:04:08 2006
@@ -15,7 +15,7 @@
 * copyright in this work, please see the NOTICE file in the top level
 * directory of this distribution.
 */
-package org.apache.abdera.protocol.server.target;
+package org.apache.abdera.protocol.server;
 
 import java.io.Serializable;
 

Copied: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/TargetResolver.java (from r438670, incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/target/TargetResolver.java)
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/TargetResolver.java?view=diff&rev=442370&p1=incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/target/TargetResolver.java&r1=438670&p2=incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/TargetResolver.java&r2=442370
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/target/TargetResolver.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/TargetResolver.java Mon Sep 11 15:04:08 2006
@@ -15,7 +15,7 @@
 * copyright in this work, please see the NOTICE file in the top level
 * directory of this distribution.
 */
-package org.apache.abdera.protocol.server.target;
+package org.apache.abdera.protocol.server;
 
 public interface TargetResolver {
 

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/AbderaServlet.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/AbderaServlet.java?view=diff&rev=442370&r1=442369&r2=442370
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/AbderaServlet.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/AbderaServlet.java Mon Sep 11 15:04:08 2006
@@ -22,6 +22,7 @@
 import java.util.List;
 import java.util.Map;
 
+import javax.servlet.ServletConfig;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
@@ -32,11 +33,9 @@
 import org.apache.abdera.protocol.server.AbderaServer;
 import org.apache.abdera.protocol.server.RequestContext;
 import org.apache.abdera.protocol.server.RequestHandler;
-import org.apache.abdera.protocol.server.RequestHandlerFactory;
+import org.apache.abdera.protocol.server.RequestHandlerManager;
 import org.apache.abdera.protocol.server.ResponseContext;
-import org.apache.abdera.protocol.server.auth.SubjectResolver;
 import org.apache.abdera.protocol.server.exceptions.AbderaServerException;
-import org.apache.abdera.protocol.server.target.TargetResolver;
 import org.apache.abdera.protocol.server.util.ServerConstants;
 
 public class AbderaServlet 
@@ -45,16 +44,28 @@
 
   private static final long serialVersionUID = -4273782501412352619L;
 
-  private final Abdera abdera;
-  private final AbderaServer abderaServer;
-  
-  public AbderaServlet() {
-    this.abdera = new Abdera();
-    this.abderaServer = new AbderaServer(abdera);
-  }
+  private Abdera abdera;
+  private AbderaServer abderaServer;
   
   @Override
-  public void init() throws ServletException {}
+  public void init() throws ServletException {
+    ServletContext context = getServletContext();
+    if (context.getAttribute("abdera") == null) {
+      synchronized(context) {
+        ServletConfig config = getServletConfig();
+        this.abdera = new Abdera();
+        this.abderaServer = 
+          new AbderaServer(
+            abdera, 
+            config.getInitParameter(TARGET_RESOLVER), 
+            config.getInitParameter(HANDLER_MANAGER), 
+            config.getInitParameter(SUBJECT_RESOLVER), 
+            config.getInitParameter(PROVIDER_MANAGER));
+        context.setAttribute("abdera", abdera);
+        context.setAttribute("server", abderaServer);
+      }
+    }
+  }
 
   /**
    * The RequestContext will either be set on the HttpServletRequest by 
@@ -62,63 +73,11 @@
    * to be created and set on the request 
    */
   private RequestContext getRequestContext(HttpServletRequest request) {
-    RequestContext context = 
-      (RequestContext) request.getAttribute(REQUESTCONTEXT);
-    if (context == null) {
-      context = new ServletRequestContext(
-        abdera,
-        getTargetResolver(),
-        getSubjectResolver(),
-        request);
-      request.setAttribute(REQUESTCONTEXT, context);
-    }
-    return context;
-  }
-  
-  
-  private RequestHandlerFactory getRequestHandlerFactory() {
-    ServletContext context = getServletContext();
-    synchronized(context) {
-      RequestHandlerFactory factory = 
-        (RequestHandlerFactory) context.getAttribute(
-        HANDLER_FACTORY);
-      if (factory == null) {
-        String s = getServletConfig().getInitParameter(HANDLER_FACTORY);
-        factory = abderaServer.newRequestHandlerFactory(s);
-        context.setAttribute(HANDLER_FACTORY, factory);
-      }
-      return factory;
-    }
+    return new ServletRequestContext(abderaServer,request);
   }
   
-  private TargetResolver getTargetResolver() {
-    ServletContext context = getServletContext();
-    synchronized(context) {
-      TargetResolver resolver = 
-        (TargetResolver) context.getAttribute(
-          TARGET_RESOLVER);
-      if (resolver == null) {
-        String s = getServletConfig().getInitParameter(TARGET_RESOLVER);
-        resolver = abderaServer.newTargetResolver(s);
-        context.setAttribute(TARGET_RESOLVER, resolver);
-      }
-      return resolver;
-    }
-  }
-  
-  private SubjectResolver getSubjectResolver() {
-    ServletContext context = getServletContext();
-    synchronized(context) {
-      SubjectResolver resolver = 
-        (SubjectResolver) context.getAttribute(
-          SUBJECT_RESOLVER);
-      if (resolver  == null) {
-        String s = getServletConfig().getInitParameter(SUBJECT_RESOLVER);
-        resolver = abderaServer.newSubjectResolver(s);
-        context.setAttribute(SUBJECT_RESOLVER, resolver);
-      }
-      return resolver;
-    }
+  private RequestHandlerManager getRequestHandlerManager() {
+    return abderaServer.getRequestHandlerManager();
   }
   
   @Override
@@ -129,25 +88,21 @@
     RequestContext requestContext = getRequestContext(request);
     ResponseContext responseContext = null;
     RequestHandler handler = null;
-    RequestHandlerFactory factory = null;
+    RequestHandlerManager manager = null;
     try {
-      factory = getRequestHandlerFactory();
-      if (factory != null)
-        handler = factory.newRequestHandler(abderaServer);
-      if (handler != null) {
-        responseContext = handler.invoke(requestContext);
-      } else {
-        throw new AbderaServerException(
-          AbderaServerException.Code.NOTFOUND, 
-          "Handler Not Found", "");
-      }
+      manager = getRequestHandlerManager();
+      handler = (manager != null) ? 
+        manager.newRequestHandler(abderaServer) : null;
+      responseContext = (handler != null) ? 
+        handler.invoke(requestContext) :
+        new AbderaServerException(AbderaServerException.Code.NOTFOUND);
     } catch (AbderaServerException exception) {  
       responseContext = exception;
     } catch (Throwable t) {
       responseContext = new AbderaServerException(t);
     } finally {
-      if (factory != null && handler != null)
-        factory.releaseRequestHandler(handler);
+      if (manager != null)
+        manager.releaseRequestHandler(handler);
     }
     doOutput(response, responseContext); 
   }

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/ServletRequestContext.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/ServletRequestContext.java?view=diff&rev=442370&r1=442369&r2=442370
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/ServletRequestContext.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/servlet/ServletRequestContext.java Mon Sep 11 15:04:08 2006
@@ -30,10 +30,11 @@
 import javax.servlet.http.HttpServletRequest;
 
 import org.apache.abdera.Abdera;
+import org.apache.abdera.protocol.server.AbderaServer;
 import org.apache.abdera.protocol.server.RequestContext;
-import org.apache.abdera.protocol.server.auth.SubjectResolver;
-import org.apache.abdera.protocol.server.target.Target;
-import org.apache.abdera.protocol.server.target.TargetResolver;
+import org.apache.abdera.protocol.server.SubjectResolver;
+import org.apache.abdera.protocol.server.Target;
+import org.apache.abdera.protocol.server.TargetResolver;
 import org.apache.abdera.protocol.server.util.ServerConstants;
 import org.apache.abdera.protocol.util.AbstractRequest;
 import org.apache.abdera.protocol.util.CacheControlUtil;
@@ -43,7 +44,7 @@
   implements RequestContext, ServerConstants {
   
   private final Target target;
-  private final Abdera abdera;
+  private final AbderaServer abderaServer;
   private final Subject subject;
   private final HttpServletRequest servletRequest;
   private final String method;
@@ -52,22 +53,31 @@
   private final URI pathInfo;
     
   public ServletRequestContext(
-    Abdera abdera,
-    TargetResolver resolver,
-    SubjectResolver subjectResolver,
+    AbderaServer abdera,
     HttpServletRequest request) {
-      this.abdera = abdera;
+      this.abderaServer = abdera;
       this.servletRequest = request;
+      this.uri = initUri();
+      this.baseUri = initBaseUri();
+      this.pathInfo = initPathInfo();
+      this.method = request.getMethod();
       CacheControlUtil.parseCacheControl(getCacheControl(), this);
-      uri = initUri();
-      baseUri = initBaseUri();
-      pathInfo = initPathInfo();
-      target = resolver.resolve(getUri().toString());
-      method = request.getMethod();
-      subject = (subjectResolver != null) ?
+      TargetResolver targetResolver = abdera.getTargetResolver();
+      this.target = (targetResolver != null) ?
+        abdera.getTargetResolver().resolve(getUri().toString()) : null;
+      SubjectResolver subjectResolver = abdera.getSubjectResolver();
+      this.subject = (subjectResolver != null) ?
         subjectResolver.resolve(request.getUserPrincipal()) : null;
   }
   
+  public AbderaServer getServer() {
+    return abderaServer;
+  }
+  
+  public Abdera getAbdera() {
+    return getServer().getAbdera();
+  }
+  
   public Subject getSubject() {
     return subject;
   }
@@ -99,7 +109,7 @@
   }
   
   private String getHost() {
-    String host = abdera.getConfiguration().getConfigurationOption(
+    String host = getAbdera().getConfiguration().getConfigurationOption(
       "org.apache.abdera.protocol.server.Host");
     return (host != null) ? 
       host : 
@@ -107,7 +117,7 @@
   }
   
   private int getPort() {
-    String port = abdera.getConfiguration().getConfigurationOption(
+    String port = getAbdera().getConfiguration().getConfigurationOption(
       "org.apache.abdera.protocol.server.Port");
     return (port != null) ? 
       Integer.parseInt(port) : 

Added: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractPooledProviderManager.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractPooledProviderManager.java?view=auto&rev=442370
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractPooledProviderManager.java (added)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractPooledProviderManager.java Mon Sep 11 15:04:08 2006
@@ -0,0 +1,53 @@
+/*
+* 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.util;
+
+import org.apache.abdera.protocol.server.AbderaServer;
+import org.apache.abdera.protocol.server.Provider;
+import org.apache.abdera.protocol.server.ProviderManager;
+import org.apache.abdera.protocol.server.exceptions.AbderaServerException;
+
+public abstract class AbstractPooledProviderManager 
+  extends PoolManager<Provider>
+  implements ProviderManager {
+  
+  public Provider newProvider(
+    AbderaServer abderaServer) 
+      throws AbderaServerException {
+    Provider prov = getProvider(abderaServer);
+    return prov;
+  }
+  
+  private synchronized Provider getProvider(
+    AbderaServer abderaServer) throws AbderaServerException {
+      return getInstance(abderaServer);
+  }
+
+  public synchronized void releaseProvider(
+    Provider provider) {
+      release(provider);
+  }
+  
+  protected abstract Provider newProviderInstance( 
+    AbderaServer abderaServer) throws AbderaServerException;
+  
+  protected Provider internalNewInstance( 
+    AbderaServer abderaServer) throws AbderaServerException {
+      return newProviderInstance(abderaServer);
+  }
+}

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractProvider.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractProvider.java?view=diff&rev=442370&r1=442369&r2=442370
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractProvider.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractProvider.java Mon Sep 11 15:04:08 2006
@@ -28,8 +28,9 @@
 import org.apache.abdera.model.Entry;
 import org.apache.abdera.parser.Parser;
 import org.apache.abdera.protocol.server.AbderaServer;
+import org.apache.abdera.protocol.server.Provider;
+import org.apache.abdera.protocol.server.ProviderManager;
 import org.apache.abdera.protocol.server.RequestContext;
-import org.apache.abdera.protocol.server.provider.Provider;
 import org.apache.abdera.util.Constants;
 import org.apache.abdera.util.MimeTypeHelper;
 
@@ -37,9 +38,15 @@
   implements Provider {
 
   private final AbderaServer abderaServer;
+  private final ProviderManager providerManager;
   
-  protected AbstractProvider(AbderaServer abderaServer) {
+  protected AbstractProvider(AbderaServer abderaServer, ProviderManager manager) {
     this.abderaServer = abderaServer;
+    this.providerManager = manager;
+  }
+  
+  public ProviderManager getProviderManager() {
+    return providerManager;
   }
   
   protected AbderaServer getAbderaServer() {
@@ -99,5 +106,6 @@
     }
     return true;
   }
-  
+
 }
+

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractRequestHandler.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractRequestHandler.java?view=diff&rev=442370&r1=442369&r2=442370
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractRequestHandler.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractRequestHandler.java Mon Sep 11 15:04:08 2006
@@ -17,72 +17,67 @@
 */
 package org.apache.abdera.protocol.server.util;
 
+import org.apache.abdera.protocol.server.AbderaServer;
+import org.apache.abdera.protocol.server.Provider;
+import org.apache.abdera.protocol.server.ProviderManager;
 import org.apache.abdera.protocol.server.RequestContext;
 import org.apache.abdera.protocol.server.RequestHandler;
+import org.apache.abdera.protocol.server.RequestHandlerManager;
 import org.apache.abdera.protocol.server.ResponseContext;
+import org.apache.abdera.protocol.server.Target;
 import org.apache.abdera.protocol.server.exceptions.AbderaServerException;
-import org.apache.abdera.protocol.server.provider.Provider;
 
 public abstract class AbstractRequestHandler 
   implements RequestHandler, ServerConstants {
   
-  protected final Provider provider;
+  protected final RequestHandlerManager manager;
   
-  protected AbstractRequestHandler() {
-    this(null);
+  protected AbstractRequestHandler(RequestHandlerManager manager) {
+    this.manager = manager;
   }
   
-  protected AbstractRequestHandler(Provider provider) {
-    this.provider = provider;
-  }
-  
-  protected Provider getProvider() {
-    return provider;
-  }
-  
-  public void clean() {
-    // by default, there is nothing to clean
+  public RequestHandlerManager getRequestHandlerManager() {
+    return manager;
   }
   
   public ResponseContext invoke(
     RequestContext requestContext)
       throws AbderaServerException {
+    AbderaServer server = requestContext.getServer();
+    ProviderManager providerManager =  server.getProviderManager();
+    Provider provider = null;
     try {
-      ResponseContext response = createResponseContext();
-      checkExists(requestContext);
+      provider = (providerManager != null) ? 
+        providerManager.newProvider(server) : null;
       checkMethod(requestContext);
-      checkModified(requestContext);
-      checkRequest(requestContext);
-      response = internalInvoke(requestContext, response);
-      if (response != null)
-        return response;
-      else
-        throw new AbderaServerException(
-          AbderaServerException.Code.NOTFOUND);
-    } catch (AbderaServerException ase) {
-      throw ase;
+      checkExists(requestContext, provider);
+      checkModified(requestContext, provider);
+      ResponseContext response = internalInvoke(requestContext, provider);
+      if (response != null) return response;
+      else throw new AbderaServerException(AbderaServerException.Code.NOTFOUND);
     } catch (Throwable t) {
       t.printStackTrace();
       String message = t.getMessage();
       if (message == null || message.length() == 0)
         message = "Unknown Server Exception";
       throw new AbderaServerException(500,message);
+    } finally {
+      if (provider != null)
+        providerManager.releaseProvider(provider);
     }
   }
-
-  protected abstract ResponseContext createResponseContext();
-  
-  /**
-   * Returns the type of the requested resource
-   */
-  protected abstract ResourceType getResourceType(RequestContext requestContext);
   
   /**
    * Check that the requested resource exists.  If not, the method
    * MUST throw an appropriate ExistenceException (e.g. not found,
    * gone, moved, etc)
    */
-  protected void checkExists(RequestContext requestContext) throws AbderaServerException{}
+  protected void checkExists(
+    RequestContext requestContext, 
+    Provider provider) 
+      throws AbderaServerException{
+    if (provider != null) provider.checkExists(requestContext);
+  }
   
   /**
    * Check the request method.  If the method is not supported, 
@@ -91,7 +86,8 @@
    */
   protected void checkMethod(RequestContext requestContext) throws AbderaServerException {
     String method = requestContext.getMethod();
-    String[] methods = getAllowedMethods(getResourceType(requestContext));
+    Target target = requestContext.getTarget();
+    String[] methods = getAllowedMethods(target.getResourceType());
     java.util.Arrays.sort(methods);
     if (java.util.Arrays.binarySearch(methods, method) < 0)
       notAllowed(requestContext);
@@ -101,21 +97,21 @@
    * Check to see if the requested resource has been modified.  If not,
    * a NotModifiedException MUST be thrown, otherwise the method
    * should return with no exceptions
+   * @throws AbderaServerException 
    */
-  protected void checkModified(RequestContext requestContext) {}
-  
-  /**
-   * Check to see if the request is valid. If not, throw an appropriate
-   * RequestException
-   */
-  protected void checkRequest(RequestContext requestContext) throws AbderaServerException {}
+  protected void checkModified(
+    RequestContext requestContext, 
+    Provider provider) 
+      throws AbderaServerException {
+    if (provider != null) provider.checkModified(requestContext);
+  }
   
   /**
    * Handle the request
    */
   protected abstract ResponseContext internalInvoke(
     RequestContext requestContext,
-    ResponseContext responseContext) 
+    Provider provider) 
       throws AbderaServerException;
   
   /**
@@ -138,12 +134,11 @@
    * Utility method for reporting MethodNotAllowedExceptions properly
    */
   protected void notAllowed(RequestContext requestContext) throws AbderaServerException {
+    Target target = requestContext.getTarget();
     AbderaServerException notallowed = 
       new AbderaServerException(
         AbderaServerException.Code.METHODNOTALLOWED);
-    notallowed.setAllow(
-      getAllowedMethods(
-        getResourceType(requestContext)));
+    notallowed.setAllow(getAllowedMethods(target.getResourceType()));
     throw notallowed;
   }
   

Copied: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractRequestHandlerManager.java (from r441582, incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractRequestHandlerFactory.java)
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractRequestHandlerManager.java?view=diff&rev=442370&p1=incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractRequestHandlerFactory.java&r1=441582&p2=incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractRequestHandlerManager.java&r2=442370
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractRequestHandlerFactory.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractRequestHandlerManager.java Mon Sep 11 15:04:08 2006
@@ -17,17 +17,14 @@
 */
 package org.apache.abdera.protocol.server.util;
 
-import java.util.Stack;
-
 import org.apache.abdera.protocol.server.AbderaServer;
 import org.apache.abdera.protocol.server.RequestHandler;
-import org.apache.abdera.protocol.server.RequestHandlerFactory;
+import org.apache.abdera.protocol.server.RequestHandlerManager;
 import org.apache.abdera.protocol.server.exceptions.AbderaServerException;
 
-public abstract class AbstractRequestHandlerFactory 
-  implements RequestHandlerFactory {
-
-  private static Stack<RequestHandler> requestHandlerPool = new Stack<RequestHandler>();
+public abstract class AbstractRequestHandlerManager 
+  extends PoolManager<RequestHandler>
+  implements RequestHandlerManager {
   
   public RequestHandler newRequestHandler(
     AbderaServer abderaServer) 
@@ -37,18 +34,20 @@
   }
   
   private synchronized RequestHandler getRequestHandler(
-    AbderaServer abderaServer) {
-      if (!requestHandlerPool.empty()) 
-        return requestHandlerPool.pop();
-      return newRequestHandlerInstance(abderaServer);
+    AbderaServer abderaServer) throws AbderaServerException {
+      return getInstance(abderaServer);
   }
 
-  public synchronized void releaseRequestHandler(RequestHandler handler) {
-    handler.clean(); // tell the handler to clean any internal state
-    requestHandlerPool.push(handler);
+  public synchronized void releaseRequestHandler(
+    RequestHandler handler) {
+      release(handler);
   }
   
   protected abstract RequestHandler newRequestHandlerInstance( 
-    AbderaServer abderaServer);
+    AbderaServer abderaServer) throws AbderaServerException;
   
+  protected RequestHandler internalNewInstance( 
+    AbderaServer abderaServer) throws AbderaServerException {
+      return newRequestHandlerInstance(abderaServer);
+  }
 }

Added: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractSimpleProviderManager.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractSimpleProviderManager.java?view=auto&rev=442370
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractSimpleProviderManager.java (added)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/AbstractSimpleProviderManager.java Mon Sep 11 15:04:08 2006
@@ -0,0 +1,40 @@
+/*
+* 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.util;
+
+import org.apache.abdera.protocol.server.AbderaServer;
+import org.apache.abdera.protocol.server.Provider;
+import org.apache.abdera.protocol.server.ProviderManager;
+import org.apache.abdera.protocol.server.exceptions.AbderaServerException;
+
+public abstract class AbstractSimpleProviderManager 
+  implements ProviderManager {
+
+  protected abstract Provider getProvider(
+    AbderaServer server) 
+      throws AbderaServerException;
+  
+  public Provider newProvider(
+    AbderaServer server) 
+      throws AbderaServerException {
+    return getProvider(server);
+  }
+
+  public void releaseProvider(Provider provider) {}
+
+}

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/EmptyResponseContext.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/EmptyResponseContext.java?view=diff&rev=442370&r1=442369&r2=442370
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/EmptyResponseContext.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/EmptyResponseContext.java Mon Sep 11 15:04:08 2006
@@ -20,7 +20,8 @@
 import java.io.IOException;
 import java.io.OutputStream;
 
-public class EmptyResponseContext extends AbstractResponseContext {
+public final class EmptyResponseContext 
+  extends AbstractResponseContext {
 
   public EmptyResponseContext(int status) {
     setStatus(status);
@@ -30,7 +31,7 @@
     return false;
   }
 
-  public void writeTo(OutputStream out) throws IOException {
-  }
+  public void writeTo(OutputStream out) 
+    throws IOException {}
 
 }

Added: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/PoolManager.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/PoolManager.java?view=auto&rev=442370
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/PoolManager.java (added)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/PoolManager.java Mon Sep 11 15:04:08 2006
@@ -0,0 +1,44 @@
+/*
+* 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.util;
+
+import java.util.Stack;
+
+import org.apache.abdera.protocol.server.AbderaServer;
+import org.apache.abdera.protocol.server.exceptions.AbderaServerException;
+
+public abstract class PoolManager<T> {
+
+  private final Stack<T> pool = new Stack<T>();
+  
+  protected synchronized T getInstance(
+    AbderaServer abderaServer) throws AbderaServerException {
+      if (!pool.empty()) 
+        return pool.pop();
+      return internalNewInstance(abderaServer);
+  }
+
+  protected synchronized void release(T t) {
+    if (t == null || pool.contains(t)) return;
+    pool.push(t);
+  }
+  
+  protected abstract T internalNewInstance( 
+    AbderaServer abderaServer) throws AbderaServerException;
+ 
+}

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/RegexTargetResolver.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/RegexTargetResolver.java?view=diff&rev=442370&r1=442369&r2=442370
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/RegexTargetResolver.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/RegexTargetResolver.java Mon Sep 11 15:04:08 2006
@@ -17,17 +17,20 @@
 */
 package org.apache.abdera.protocol.server.util;
 
+import java.io.FileInputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.Properties;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import org.apache.abdera.protocol.server.target.Target;
-import org.apache.abdera.protocol.server.target.TargetResolver;
+import org.apache.abdera.protocol.server.Target;
+import org.apache.abdera.protocol.server.TargetResolver;
 
 /**
  * <p>Provides a utility class helpful for determining which type of resource
@@ -68,6 +71,32 @@
       Pattern pattern = Pattern.compile(p);
       this.patterns.put(type, pattern);
     }
+  }
+  
+  public RegexTargetResolver(Properties properties) {
+    this.patterns = new HashMap<ResourceType,Pattern>();
+    loadPatterns(properties);
+  }
+  
+  public synchronized void loadPatterns(Properties properties) {
+    this.patterns.clear();
+    for (Object key : properties.keySet()) {
+      String skey = (String) key;
+      String value = properties.getProperty(skey);
+      ResourceType type = ResourceType.getOrCreate(skey);
+      Pattern pattern = Pattern.compile(value);
+      this.patterns.put(type, pattern);
+    }
+  }
+  
+  public synchronized void loadPatterns(InputStream in) throws IOException {
+    Properties properties = new Properties();
+    properties.load(in);
+    loadPatterns(properties);
+  }
+  
+  public synchronized void loadPatterns(String file) throws IOException {
+    loadPatterns(new FileInputStream(file));
   }
   
   public synchronized void setPattern(ResourceType type, String pattern) {

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/ResourceType.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/ResourceType.java?view=diff&rev=442370&r1=442369&r2=442370
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/ResourceType.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/ResourceType.java Mon Sep 11 15:04:08 2006
@@ -92,6 +92,11 @@
     return null;
   }
   
+  public static ResourceType getOrCreate(String string) {
+    ResourceType type = valueOf(string);
+    return (type != null) ? type : new ResourceType(string);
+  }
+  
   public static ResourceType valueOf(int ordinal) {
     return values()[ordinal];
   }
@@ -148,4 +153,5 @@
   public String toString() {
     return name();
   }
+
 }

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/ServerConstants.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/ServerConstants.java?view=diff&rev=442370&r1=442369&r2=442370
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/ServerConstants.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/ServerConstants.java Mon Sep 11 15:04:08 2006
@@ -22,14 +22,17 @@
   public static final String REQUESTCONTEXT = 
     "org.apache.abdera.protocol.server.RequestContext";
  
-  public static final String HANDLER_FACTORY = 
-    "org.apache.abdera.protocol.server.RequestHandlerFactory";
+  public static final String HANDLER_MANAGER = 
+    "org.apache.abdera.protocol.server.RequestHandlerManager";
+  
+  public static final String PROVIDER_MANAGER = 
+    "org.apache.abdera.protocol.server.ProviderManager";
   
   public static final String TARGET_RESOLVER = 
-    "org.apache.abdera.protocol.server.target.TargetResolver";
+    "org.apache.abdera.protocol.server.TargetResolver";
   
   public static final String SUBJECT_RESOLVER = 
-    "org.apache.abdera.protocol.server.auth.SubjectResolver";
+    "org.apache.abdera.protocol.server.SubjectResolver";
   
   public static final String DEFAULT_SUBJECT_RESOLVER = 
     "org.apache.abdera.protocol.server.util.SimpleSubjectResolver";

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/SimpleSubjectResolver.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/SimpleSubjectResolver.java?view=diff&rev=442370&r1=442369&r2=442370
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/SimpleSubjectResolver.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/SimpleSubjectResolver.java Mon Sep 11 15:04:08 2006
@@ -22,7 +22,7 @@
 
 import javax.security.auth.Subject;
 
-import org.apache.abdera.protocol.server.auth.SubjectResolver;
+import org.apache.abdera.protocol.server.SubjectResolver;
 
 public class SimpleSubjectResolver 
   implements SubjectResolver {

Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/TargetIterator.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/TargetIterator.java?view=diff&rev=442370&r1=442369&r2=442370
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/TargetIterator.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/util/TargetIterator.java Mon Sep 11 15:04:08 2006
@@ -19,7 +19,7 @@
 
 import java.util.Iterator;
 
-import org.apache.abdera.protocol.server.target.Target;
+import org.apache.abdera.protocol.server.Target;
 
 public final class TargetIterator 
   implements Iterator<String> {