abdera-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jmsn...@apache.org
Subject svn commit: r1173209 [13/49] - in /abdera/abdera2: ./ .settings/ activities/ activities/src/ activities/src/main/ activities/src/main/java/ activities/src/main/java/org/ activities/src/main/java/org/apache/ activities/src/main/java/org/apache/abdera2/ ...
Date Tue, 20 Sep 2011 15:57:20 GMT
Added: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RegexTargetResolver.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RegexTargetResolver.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RegexTargetResolver.java (added)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RegexTargetResolver.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,247 @@
+/*
+ * 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.abdera2.common.protocol;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.abdera2.common.misc.Resolver;
+
+/**
+ * <p>
+ * Provides a utility class helpful for determining which type of resource the client is requesting. Each resource type
+ * (e.g. service doc, collection, entry, edit uri, media resource, etc) is assigned a regex pattern. Given the request
+ * URI (path and querystring), this will determine which resource was selected and return an appropriate TargetMatcher.
+ * TargetMatcher is essentially just a simplified version of the java.util.regex.Matcher that also specifies the
+ * Resource Type.
+ * </p>
+ * 
+ * <pre>
+ *  RequestContext request = ...
+ *  RegexTargetResolver tr = new RegexTargetResolver();
+ *  tr.setPattern("/atom",ResourceType.INTROSPECTION)
+ *    .setPattern("/atom/([^/#?]+)",ResourceType.COLLECTION)
+ *    .setPattern("/atom/([^/#?]+)/([^/#?]+)",ResourceType.ENTRY)
+ *    .setPattern("/atom/([^/#?]+)/([^/#?]+)\\?edit",ResourceType.ENTRY_EDIT)
+ *    .setPattern("/atom/([^/#?]+)/([^/#?]+)\\?media",ResourceType.MEDIA)
+ *    .setPattern("/atom/([^/#?]+)/([^/#?]+)\\?edit-media",ResourceType.MEDIA_EDIT);
+ *  
+ *  Target target = tr.resolve(request);
+ *  System.out.println(target.getType());
+ *  System.out.println(targer.getParameter("foo"));
+ * </pre>
+ */
+public class RegexTargetResolver<R extends RequestContext>
+  implements Resolver<Target,R> {
+
+    protected final Map<Pattern, TargetType> patterns;
+    protected final Map<Pattern, String[]> fields;
+
+    public RegexTargetResolver() {
+        this.patterns = new HashMap<Pattern, TargetType>();
+        this.fields = new HashMap<Pattern, String[]>();
+    }
+
+    public RegexTargetResolver(Map<String, TargetType> patterns) {
+        this.patterns = new HashMap<Pattern, TargetType>();
+        this.fields = new HashMap<Pattern, String[]>();
+        for (String p : patterns.keySet()) {
+            TargetType type = patterns.get(p);
+            setPattern(p, type);
+        }
+    }
+
+    public RegexTargetResolver<R> setPattern(String pattern, TargetType type) {
+        return setPattern(pattern, type, new String[0]);
+    }
+
+    public RegexTargetResolver<R> setPattern(String pattern, TargetType type, String... fields) {
+        Pattern p = Pattern.compile(pattern);
+        this.patterns.put(p, type);
+        this.fields.put(p, fields);
+        return this;
+    }
+
+    public Target resolve(R request) {
+        String uri = request.getTargetPath();
+        for (Pattern pattern : patterns.keySet()) {
+            Matcher matcher = pattern.matcher(uri);
+            if (matcher.matches()) {
+                TargetType type = this.patterns.get(pattern);
+                String[] fields = this.fields.get(pattern);
+                return getTarget(type, request, matcher, fields);
+            }
+        }
+        return null;
+    }
+
+    protected Target getTarget(TargetType type, RequestContext request, Matcher matcher, String[] fields) {
+        return new RegexTarget(type, request, matcher, fields);
+    }
+
+    public String toString() {
+        StringBuilder buf = new StringBuilder();
+        buf.append("Regex Target Resolver:\n");
+        for (Pattern pattern : patterns.keySet()) {
+            TargetType type = this.patterns.get(pattern);
+            String[] fields = this.fields.get(pattern);
+            buf.append(pattern.toString() + ", Type: " + type + ", Fields: " + Arrays.toString(fields));
+        }
+        return buf.toString();
+    }
+
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((fields == null) ? 0 : fields.hashCode());
+        result = prime * result + ((patterns == null) ? 0 : patterns.hashCode());
+        return result;
+    }
+
+    @SuppressWarnings("unchecked")
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        final RegexTargetResolver<R> other = (RegexTargetResolver<R>)obj;
+        if (fields == null) {
+            if (other.fields != null)
+                return false;
+        } else if (!fields.equals(other.fields))
+            return false;
+        if (patterns == null) {
+            if (other.patterns != null)
+                return false;
+        } else if (!patterns.equals(other.patterns))
+            return false;
+        return true;
+    }
+
+    public static class RegexTarget 
+      extends SimpleTarget
+      implements Target {
+
+        private static final long serialVersionUID = 165211244926064449L;
+        protected Matcher matcher;
+        protected String[] fields;
+
+        public RegexTarget(TargetType type, RequestContext context, Matcher matcher, String[] fields) {
+            super(type, context);
+            this.matcher = matcher;
+            this.fields = fields;
+        }
+
+        public String getParameter(String name) {
+            if (fields == null)
+                return super.getParameter(name);
+            int idx = 0;
+            for (int n = 0; n < fields.length; n++)
+                if (fields[n].equalsIgnoreCase(name))
+                    idx = n + 1;
+            return idx > 0 && idx <= matcher.groupCount() ? matcher.group(idx) : super.getParameter(name);
+        }
+
+        public Iterable<String> getParameterNames() {
+            Iterable<String> names = super.getParameterNames();
+            Set<String> list = new HashSet<String>();
+            for (String name : names)
+              list.add(name);
+            if (fields != null)
+                list.addAll(Arrays.asList(fields));
+            return list;
+        }
+
+        @SuppressWarnings("unchecked")
+        @Override
+        public <T> T getMatcher() {
+            return (T)matcher.pattern();
+        }
+
+        @Override
+        public int hashCode() {
+            final int PRIME = 31;
+            int result = 1;
+            String m = matcher.group(0);
+            String p = matcher.pattern().pattern();
+            result = PRIME * result + super.hashCode();
+            result = PRIME * result + ((m == null) ? 0 : m.hashCode());
+            result = PRIME * result + ((p == null) ? 0 : p.hashCode());
+            result = PRIME * result + ((type == null) ? 0 : type.hashCode());
+            return result;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj)
+                return true;
+            if (obj == null)
+                return false;
+            if (getClass() != obj.getClass())
+                return false;
+            final RegexTarget other = (RegexTarget)obj;
+            String m = matcher.group(0);
+            String p = matcher.pattern().pattern();
+            String m2 = other.matcher.group(0);
+            String p2 = other.matcher.pattern().pattern();
+            if (!super.equals(obj))
+                return false;
+            if (m == null) {
+                if (m2 != null)
+                    return false;
+            } else if (!m.equals(m2))
+                return false;
+            if (p == null) {
+                if (p2 != null)
+                    return false;
+            } else if (!p.equals(p2))
+                return false;
+            if (type == null) {
+                if (other.type != null)
+                    return false;
+            } else if (!type.equals(other.type))
+                return false;
+            return true;
+        }
+
+        public String toString() {
+            String m = matcher.group(0);
+            String p = matcher.pattern().pattern();
+            StringBuilder buf = new StringBuilder();
+            buf.append("RegexTarget[").append(p).append(" ==> ").append(m).append("] = ").append(type.toString())
+                .append("\n");
+            for (String param : getParameterNames()) {
+                buf.append("    ").append(param).append(" = ").append(getParameter(param)).append("\n");
+            }
+            return buf.toString();
+        }
+
+        public String getIdentity() {
+            return context.getUri().toString();
+        }
+
+    }
+
+}

Propchange: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RegexTargetResolver.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/Request.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/Request.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/Request.java (added)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/Request.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,69 @@
+/*
+ * 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.abdera2.common.protocol;
+
+import java.util.Date;
+
+import org.apache.abdera2.common.http.EntityTag;
+
+/**
+ * A protocol request. This is used as a base for both server and client requests
+ */
+public interface Request extends Message {
+
+    /**
+     * Get the value of the Accept header
+     */
+    String getAccept();
+
+    /**
+     * Get the value of the Accept-Charset header
+     */
+    String getAcceptCharset();
+
+    /**
+     * Get the value of the Accept-Encoding header
+     */
+    String getAcceptEncoding();
+
+    /**
+     * Get the value of the Accept-Language header
+     */
+    String getAcceptLanguage();
+
+    /**
+     * Get a listing of Etags from the If-Match header
+     */
+    Iterable<EntityTag> getIfMatch();
+
+    /**
+     * Get the value of the If-Modified-Since header
+     */
+    Date getIfModifiedSince();
+
+    /**
+     * Get a listing of ETags from the If-None-Match header
+     */
+    Iterable<EntityTag> getIfNoneMatch();
+
+    /**
+     * Get the value of the If-Unmodified-Since header
+     */
+    Date getIfUnmodifiedSince();
+
+}

Propchange: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/Request.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RequestContext.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RequestContext.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RequestContext.java (added)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RequestContext.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,211 @@
+/*
+ * 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.abdera2.common.protocol;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.security.Principal;
+import java.util.List;
+import java.util.Locale;
+
+import javax.security.auth.Subject;
+
+import org.apache.abdera2.common.iri.IRI;
+
+/**
+ * The RequestContext provides access to every detail of the Request.
+ */
+public interface RequestContext
+  extends Request, Iterable<RequestContext.Property> {
+
+    /**
+     * RequestContext attributes can either have Session or Request scope. Request scope attributes are only valid
+     * within the context of the current request. Session scope attributes, however, will remain valid as long as the
+     * Session is active. Container scope attributes are set on the Web container (e.g. the ServletContext)
+     */
+    public enum Scope {
+        REQUEST, SESSION, CONTAINER
+    };
+
+    /**
+     * Special properties provided by the server
+     */
+    public enum Property {
+        SESSIONID, 
+        SESSIONCREATED, 
+        SESSIONACCESSED, 
+        SESSIONTIMEOUT, 
+        CHARACTERENCODING, 
+        LOCALES, 
+        PROTOCOL, 
+        REMOTEADDRESS, 
+        REMOTEHOST, 
+        REMOTEUSER, 
+        SCHEME, 
+        PRINCIPAL, 
+        AUTHTYPE, 
+        CONTENTLENGTH, 
+        CONTENTTYPE, 
+        CONTEXTPATH, 
+        LOCALADDR, 
+        LOCALNAME, 
+        SERVERNAME, 
+        SERVERPORT, 
+        SECURE, 
+        PARTS,
+    };
+
+    /**
+     * Get the Provider associated with this request
+     */
+    <P extends Provider>P getProvider();
+
+    /**
+     * Get this requests resolved Target
+     */
+    Target getTarget();
+
+    /**
+     * Get this requests resolved Subject
+     */
+    Subject getSubject();
+
+    /**
+     * Get this requests authenticated Principal object
+     */
+    Principal getPrincipal();
+
+    /**
+     * Get the client's preferred locale as specified in the request
+     */
+    Locale getPreferredLocale();
+
+    /**
+     * Get a listing of the client's preferred locales as specified in the request. The listing will be sorted in order
+     * of preference.
+     */
+    Iterable<Locale> getPreferredLocales();
+
+    /**
+     * Get the HTTP method
+     */
+    String getMethod();
+
+    /**
+     * Get the request URI
+     */
+    IRI getUri();
+
+    /**
+     * Get the absolute request URI (includes server name, port, etc)
+     */
+    IRI getResolvedUri();
+
+    /**
+     * Get the absolute base URI ... this is the request URI up to the Context Path of the web application within which
+     * the Abdera Servlet is deployed
+     */
+    IRI getBaseUri();
+
+    /**
+     * Get the specified system property
+     */
+    <T>T getProperty(Property property);
+
+    /**
+     * Get the specified request parameter
+     */
+    String getParameter(String name);
+
+    /**
+     * Return the listing of parameter names
+     */
+    Iterable<String> getParameterNames();
+
+    /**
+     * Return all the values for the specified parameter
+     */
+    List<String> getParameters(String name);
+
+    /**
+     * Get the named attribute from the specified scope
+     */
+    Object getAttribute(Scope scope, String name);
+
+    /**
+     * Return the list of attribute names in the specified scope
+     */
+    Iterable<String> getAttributeNames(Scope scope);
+
+    /**
+     * Set the named attribute in the request scope
+     */
+    <T extends RequestContext>T setAttribute(String name, Object value);
+
+    /**
+     * Set the named attribute in the specified scope. If Session scope is specific, a new session will be created if
+     * one does not already exist
+     */
+    <T extends RequestContext>T setAttribute(Scope scope, String name, Object value);
+
+    /**
+     * Get the InputStream containing the request entity
+     */
+    InputStream getInputStream() throws IOException;
+
+    /**
+     * Get a Reader containing the request entity
+     */
+    Reader getReader() throws IOException;
+    
+    /**
+     * Check to see if the authenticated user is in the specified role
+     */
+    boolean isUserInRole(String role);
+
+    /**
+     * Return the web applications context path
+     */
+    String getContextPath();
+
+    /**
+     * Returns the subset of the request URI that is to be used to resolve the Target (everything after the context
+     * path)
+     */
+    String getTargetPath();
+
+    /**
+     * Returns the subset of the request URI that is the base of the target path (e.g.
+     * HttpServletRequest.getServletPath())
+     * 
+     * @return
+     */
+    String getTargetBasePath();
+
+    /**
+     * Construct a URL using the Provider's Target Builder
+     */
+    String urlFor(Object key, Object param);
+
+    /**
+     * Construct an absolute URL using the Provider's Target Builder. Relative URL's are resolved against the base URI
+     */
+    String absoluteUrlFor(Object key, Object param);
+
+}

Propchange: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RequestContext.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RequestProcessor.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RequestProcessor.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RequestProcessor.java (added)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RequestProcessor.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,38 @@
+/*
+ * 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.abdera2.common.protocol;
+
+/**
+ * Request processors implement the actual business logic for handling requests to the Atompub server and producing the
+ * related response.
+ */
+public interface RequestProcessor {
+ 
+    /**
+     * Provide the actual request processing logic.
+     * 
+     * @param requestContext The {@link AtompubRequestContext} object, holding information about the request to process.
+     * @param workspaceManager The {@link AtompubWorkspaceManager} object, holding information useful for request processing.
+     * @param collectionAdapter The {@link AtompubCollectionAdapter} object, holding information useful for request processing;
+     *            may be null if not needed.
+     * @return A {@link AtompubResponseContext} object, as resulted from the request processing.
+     */
+  <S extends ResponseContext>S process(RequestContext requestContext,
+            WorkspaceManager workspaceManager,
+            CollectionAdapter collectionAdapter);
+}

Propchange: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RequestProcessor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RequestTemplateContext.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RequestTemplateContext.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RequestTemplateContext.java (added)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RequestTemplateContext.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,155 @@
+package org.apache.abdera2.common.protocol;
+
+import java.security.Principal;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.Set;
+
+import org.apache.abdera2.common.protocol.RequestContext.Scope;
+import org.apache.abdera2.common.templates.Context;
+import org.apache.abdera2.common.templates.DelegatingContext;
+
+public class RequestTemplateContext extends DelegatingContext {
+
+  private static final long serialVersionUID = 4332356546022014897L;
+
+  private final RequestContext request;
+
+  public RequestTemplateContext(RequestContext request, Context subcontext) {
+      super(subcontext);
+      this.request = request;
+  }
+  
+  private String[] split(String val) {
+      if (val.equals(""))
+          return null;
+      String[] segments = val.split("/");
+      return segments.length > 0 ? segments : null;
+  }
+
+  @Override
+  public boolean contains(String var) {
+    if (super.contains(var)) return true;
+    return resolveActual(var) != null;
+  }
+  
+  @Override
+  @SuppressWarnings("unchecked")
+  protected <T> T resolveActual(String var) {
+      Variable variable = Variable.get(var);
+      if (variable == null)
+          return subcontext != null ? (T)subcontext.resolve(var) : null;
+      switch (variable) {
+          case REQUEST_URI:
+              return (T)request.getUri().toString();
+          case REQUEST_RESOLVED_URI:
+              return (T)request.getResolvedUri().toString();
+          case REQUEST_CONTENT_TYPE:
+              return (T)request.getContentType().toString();
+          case REQUEST_CONTEXT_PATH:
+              return (T)split(request.getContextPath());
+          case REQUEST_PARAMETER:
+              String name = Variable.REQUEST_PARAMETER.label(var);
+              return (T)request.getParameter(name);
+          case REQUEST_LANGUAGE:
+              return (T)request.getAcceptLanguage();
+          case REQUEST_CHARSET:
+              return (T)request.getAcceptCharset();
+          case REQUEST_USER:
+              Principal p = request.getPrincipal();
+              return p != null ? (T)p.getName() : null;
+          case SESSION_ATTRIBUTE:
+              name = Variable.SESSION_ATTRIBUTE.label(var);
+              return (T)request.getAttribute(Scope.SESSION, name);
+          case REQUEST_ATTRIBUTE:
+              name = Variable.REQUEST_ATTRIBUTE.label(var);
+              return (T)request.getAttribute(Scope.REQUEST, name);
+          case REQUEST_HEADER:
+              name = Variable.REQUEST_HEADER.label(var);
+              return (T)request.getHeader(name);
+          case TARGET_PARAMETER:
+              name = Variable.TARGET_PARAMETER.label(var);
+              return (T)request.getTarget().getParameter(name);
+          case TARGET_IDENTITY:
+              return (T)request.getTarget().getIdentity();
+          case TARGET_PATH:
+              return (T)split(request.getTargetPath());
+          case TARGET_BASE:
+              return (T)split(request.getTargetBasePath());
+          default:
+              return subcontext != null ? (T)subcontext.resolve(var) : null;
+      }
+  }
+
+  @Override
+  public Iterator<String> iterator() {
+      Set<String> vars = new HashSet<String>();
+      for (String var : subcontext)
+          vars.add(var);
+      for (String var : request.getParameterNames())
+          vars.add(toVar(Variable.REQUEST_PARAMETER, var));
+      for (String var : request.getAttributeNames(Scope.SESSION))
+          vars.add(toVar(Variable.SESSION_ATTRIBUTE, var));
+      for (String var : request.getAttributeNames(Scope.REQUEST))
+          vars.add(toVar(Variable.REQUEST_ATTRIBUTE, var));
+      for (String var : request.getHeaderNames())
+          vars.add(toVar(Variable.REQUEST_HEADER, var));
+      Target target = request.getTarget();
+      for (String var : target.getParameterNames())
+          vars.add(toVar(Variable.TARGET_PARAMETER, var));
+      vars.add(Variable.REQUEST_CONTEXT_PATH.name().toLowerCase());
+      vars.add(Variable.REQUEST_CONTENT_TYPE.name().toLowerCase());
+      vars.add(Variable.REQUEST_URI.name().toLowerCase());
+      vars.add(Variable.REQUEST_RESOLVED_URI.name().toLowerCase());
+      vars.add(Variable.REQUEST_LANGUAGE.name().toLowerCase());
+      vars.add(Variable.REQUEST_CHARSET.name().toLowerCase());
+      vars.add(Variable.REQUEST_USER.name().toLowerCase());
+      vars.add(Variable.TARGET_IDENTITY.name().toLowerCase());
+      vars.add(Variable.TARGET_PATH.name().toLowerCase());
+      vars.add(Variable.TARGET_BASE.name().toLowerCase());
+      return vars.iterator();
+  }
+  
+  private static String toVar(Variable variable, String label) {
+    return String.format("%s_%s", variable.name().toLowerCase(), label);
+  }
+
+  public static enum Variable {
+    REQUEST_CONTEXT_PATH, 
+    REQUEST_CONTENT_TYPE, 
+    REQUEST_URI, 
+    REQUEST_RESOLVED_URI, 
+    REQUEST_PARAMETER, 
+    REQUEST_LANGUAGE, 
+    REQUEST_CHARSET, 
+    REQUEST_USER, 
+    SESSION_ATTRIBUTE, 
+    REQUEST_ATTRIBUTE, 
+    REQUEST_HEADER, 
+    TARGET_PARAMETER, 
+    TARGET_IDENTITY, 
+    TARGET_PATH, 
+    TARGET_BASE;
+
+    static Variable get(String var) {
+      if (var == null) return null;
+      var = var.toUpperCase(Locale.US);
+      for (Variable variable : Variable.values())
+        if (var.startsWith(variable.name()))
+          return variable;
+      return null;
+    }
+    
+    boolean match(String var) {
+      if (var == null) return false;
+      var = var.toUpperCase(Locale.US);
+      return var.startsWith(name());
+    }
+
+    String label(String var) {
+        return var.substring(name().length() + 1);
+    }
+  }
+
+}

Propchange: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RequestTemplateContext.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/Response.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/Response.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/Response.java (added)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/Response.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,81 @@
+/*
+ * 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.abdera2.common.protocol;
+
+import java.util.Date;
+
+import org.apache.abdera2.common.iri.IRI;
+import org.apache.abdera2.common.http.EntityTag;
+import org.apache.abdera2.common.http.ResponseType;
+
+/**
+ * Base interface for an Atompub protocol response message
+ */
+public interface Response extends Message {
+
+    /**
+     * Get the Entity Tag returned by the server
+     */
+    EntityTag getEntityTag();
+
+    /**
+     * Get the response type classification
+     */
+    ResponseType getType();
+
+    /**
+     * Get the specific response status code
+     */
+    int getStatus();
+
+    /**
+     * Get the response status text
+     */
+    String getStatusText();
+
+    /**
+     * Get the value of the Last-Modified response header
+     */
+    Date getLastModified();
+
+    /**
+     * Get the value of the Content-Length response header
+     */
+    long getContentLength();
+
+    /**
+     * Get the value of the Allow response header
+     */
+    String getAllow();
+
+    /**
+     * Get the value of the Location response header
+     */
+    IRI getLocation();
+
+    /**
+     * Get the age of this response as specified by the server
+     */
+    long getAge();
+
+    /**
+     * Get the date/time this response expires
+     */
+    Date getExpires();
+
+}

Propchange: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/Response.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/ResponseContext.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/ResponseContext.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/ResponseContext.java (added)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/ResponseContext.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,209 @@
+/*
+ * 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.abdera2.common.protocol;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Date;
+
+import org.apache.abdera2.common.text.CharUtils.Profile;
+import org.apache.abdera2.common.http.CacheControl;
+import org.apache.abdera2.common.http.EntityTag;
+import org.apache.abdera2.common.http.Preference;
+import org.apache.abdera2.common.http.WebLink;
+
+/**
+ * The ResponseContext encapsulates a server response
+ */
+public interface ResponseContext extends Response {
+
+    /**
+     * True if the response contains a binary entity as opposed to a character based entity. Default is false. If true,
+     * the AbderaServlet will pass in the OutputStream for writing out, if false, the AbderaServlet will pass in the
+     * Writer.
+     */
+    boolean isBinary();
+
+    /**
+     * True if the response contains a binary entity as opposed to a character based entity. Default is false. If true,
+     * the AbderaServlet will pass in the OutputStream for writing out, if false, the AbderaServlet will pass in the
+     * Writer.
+     */
+    <B extends ResponseContext>B setBinary(boolean binary);
+
+    /**
+     * True if the response contains an entity
+     */
+    boolean hasEntity();
+
+    /**
+     * Write the response out to the specified OutputStream
+     */
+    void writeTo(OutputStream out) throws IOException;
+
+    /**
+     * Write the response out to the specified Writer
+     */
+    void writeTo(java.io.Writer javaWriter) throws IOException;
+
+    /**
+     * Remove the specified header from the response
+     */
+    <B extends ResponseContext>B removeHeader(String name);
+
+    /**
+     * Set an RFC 2047 encoded header in the response
+     */
+    <B extends ResponseContext>B setEncodedHeader(String name, String charset, String value);
+
+    /**
+     * Set an RFC 2047 encoded header in the response
+     */
+    <B extends ResponseContext>B setEncodedHeader(String name, String charset, String... vals);
+
+    /**
+     * Set a pct-encoded header in the response
+     */
+    <B extends ResponseContext>B setEscapedHeader(String name, Profile profile, String value);
+
+    /**
+     * Set the value of a header in the response
+     */
+    <B extends ResponseContext>B setHeader(String name, Object value);
+
+    /**
+     * Set the value of a header in the response
+     */
+    <B extends ResponseContext>B setHeader(String name, Object... vals);
+
+    /**
+     * Add an RFC 2047 encoded header in the response
+     */
+    <B extends ResponseContext>B addEncodedHeader(String name, String charset, String value);
+
+    /**
+     * Add an RFC 2047 encoded header in the response
+     */
+    <B extends ResponseContext>B addEncodedHeaders(String name, String charset, String... vals);
+
+    /**
+     * Add a header to the response
+     */
+    <B extends ResponseContext>B addHeader(String name, Object value);
+
+    /**
+     * Add a header to the response
+     */
+    <B extends ResponseContext>B addHeaders(String name, Object... vals);
+
+    /**
+     * Set the value of the Age header
+     */
+    <B extends ResponseContext>B setAge(long age);
+
+    /**
+     * Set the value of the Content-Language header
+     */
+    <B extends ResponseContext>B setContentLanguage(String language);
+
+    /**
+     * Set the value of the Content-Length header
+     */
+    <B extends ResponseContext>B setContentLength(long length);
+
+    /**
+     * Set the value of the Content-Location header
+     */
+    <B extends ResponseContext>B setContentLocation(String uri);
+
+    /**
+     * Set the value of the Slug header
+     */
+    <B extends ResponseContext>B setSlug(String slug);
+
+    /**
+     * Set the value of the Content-Type header
+     */
+    <B extends ResponseContext>B setContentType(String type);
+
+    /**
+     * Set the value of the Content-Type header
+     */
+    <B extends ResponseContext>B setContentType(String type, String charset);
+
+    /**
+     * Set the value of the ETag header
+     */
+    <B extends ResponseContext>B setEntityTag(String etag);
+
+    /**
+     * Set the value of the ETag header
+     */
+    <B extends ResponseContext>B setEntityTag(EntityTag etag);
+
+    /**
+     * Set the value of the Expires header
+     */
+    <B extends ResponseContext>B setExpires(Date date);
+
+    /**
+     * Set the value of the Last-Modified header
+     */
+    <B extends ResponseContext>B setLastModified(Date date);
+
+    /**
+     * Set the value of the Location header
+     */
+    <B extends ResponseContext>B setLocation(String uri);
+
+    /**
+     * Set the response status code
+     */
+    <B extends ResponseContext>B setStatus(int status);
+
+    /**
+     * Set the response status text
+     */
+    <B extends ResponseContext>B setStatusText(String text);
+
+    /**
+     * Specify the HTTP methods allowed
+     */
+    <B extends ResponseContext>B setAllow(String method);
+
+    /**
+     * Specify the HTTP methods allowed
+     */
+    <B extends ResponseContext>B setAllow(String... methods);
+    
+    /**
+     * Specify the CacheControl header
+     */
+    <B extends ResponseContext>B setCacheControl(CacheControl cc);
+    
+    /**
+     * Specify the CacheControl header
+     */
+    <B extends ResponseContext>B setCacheControl(String cc);
+
+    <B extends ResponseContext>B setWebLinks(WebLink link, WebLink... links);
+    
+    <B extends ResponseContext>B setPrefer(Preference pref, Preference... prefs);
+    
+    <B extends ResponseContext>B setPreferApplied(Preference pref, Preference... prefs);
+}

Propchange: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/ResponseContext.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/ResponseContextException.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/ResponseContextException.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/ResponseContextException.java (added)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/ResponseContextException.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,63 @@
+/*
+ * 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.abdera2.common.protocol;
+
+
+public class ResponseContextException extends RuntimeException {
+
+    private static final long serialVersionUID = -3031651143835987024L;
+
+    private ResponseContext responseContext;
+
+    public ResponseContextException(ResponseContext responseContext, Throwable t) {
+        super(t);
+        this.responseContext = responseContext;
+    }
+
+    public ResponseContextException(ResponseContext responseContext) {
+        super();
+        this.responseContext = responseContext;
+    }
+
+    public ResponseContextException(int responseCode) {
+        this(new EmptyResponseContext(responseCode));
+    }
+
+    public ResponseContextException(int responseCode, Throwable t) {
+        this(new EmptyResponseContext(responseCode), t);
+    }
+
+    public ResponseContextException(String msg, int responseCode) {
+        this.responseContext = new EmptyResponseContext(responseCode);
+        this.responseContext.setStatusText(msg);
+    }
+
+    @SuppressWarnings("unchecked")
+    public <T extends ResponseContext>T getResponseContext() {
+        return (T)responseContext;
+    }
+
+    @Override
+    public String getMessage() {
+        return responseContext.getStatusText();
+    }
+
+    public int getStatusCode() {
+        return responseContext.getStatus();
+    }
+}

Propchange: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/ResponseContextException.java
------------------------------------------------------------------------------
    svn:executable = *

Propchange: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/ResponseContextException.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RouteManager.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RouteManager.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RouteManager.java (added)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RouteManager.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,233 @@
+/*
+ * 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.abdera2.common.protocol;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.abdera2.common.misc.Resolver;
+import org.apache.abdera2.common.templates.CachingContext;
+import org.apache.abdera2.common.templates.Context;
+import org.apache.abdera2.common.templates.MapContext;
+import org.apache.abdera2.common.templates.ObjectContext;
+import org.apache.abdera2.common.templates.Route;
+
+/**
+ * This is a largely experimental implementation of a Target Resolver and Target Builder based on URL patterns similar
+ * (but not identical) to Ruby on Rails style routes. For instance:
+ * 
+ * <pre>
+ * RouteManager rm =
+ *     new RouteManager().addRoute(&quot;entry&quot;, &quot;:collection/:entry&quot;, TargetType.TYPE_ENTRY)
+ *         .addRoute(&quot;feed&quot;, &quot;:collection&quot;, TargetType.TYPE_COLLECTION);
+ * </pre>
+ * 
+ * The RouteManager can be used by Provider implementations as the target resolver and target builder
+ */
+public class RouteManager<T,X extends RequestContext> 
+  implements Resolver<Target,X>, 
+             TargetBuilder<T> {
+
+    protected class RouteTargetType {
+        protected Route<T> route;
+        protected TargetType targetType;
+
+        RouteTargetType(Route<T> route, TargetType targetType) {
+            this.route = route;
+            this.targetType = targetType;
+        }
+
+        public Route<T> getRoute() {
+            return route;
+        }
+
+        public TargetType getTargetType() {
+            return targetType;
+        }
+    }
+
+    protected List<RouteTargetType> targets = new ArrayList<RouteTargetType>();
+
+    protected Map<T, Route<T>> routes = new HashMap<T, Route<T>>();
+
+    protected Map<Route<T>, CollectionAdapter> route2CA = new HashMap<Route<T>, CollectionAdapter>();
+
+    public RouteManager<T,X> addRoute(Route<T> route) {
+        return addRoute(route, null);
+    }
+
+    public RouteManager<T,X> addRoute(T key, String pattern) {
+        return addRoute(key, pattern, null);
+    }
+
+    public RouteManager<T,X> addRoute(Route<T> route, TargetType type) {
+        routes.put(route.getKey(), route);
+        if (type != null)
+            targets.add(new RouteTargetType(route, type));
+        return this;
+    }
+
+    public RouteManager<T,X> addRoute(T key, String pattern, TargetType type) {
+        return addRoute(new Route<T>(key, pattern), type);
+    }
+
+    public RouteManager<T,X> addRoute(T key, String pattern, TargetType type, CollectionAdapter collectionAdapter) {
+
+        Route<T> route = new Route<T>(key, pattern);
+        route2CA.put(route, collectionAdapter);
+        return addRoute(route, type);
+    }
+
+    public Target resolve(X request) {
+        String uri = request.getTargetPath();
+        int idx = uri.indexOf('?');
+        if (idx != -1) {
+            uri = uri.substring(0, idx);
+        }
+
+        RouteTargetType target = get(uri);
+        if (target == null) {
+            target = match(uri);
+        }
+
+        if (target != null) {
+            return getTarget(request, target, uri);
+        }
+
+        return null;
+    }
+
+    private RouteTargetType get(String uri) {
+        for (RouteTargetType target : targets) {
+            if (target.route.getPattern().equals(uri)) {
+                return target;
+            }
+        }
+        return null;
+    }
+
+    private RouteTargetType match(String uri) {
+        for (RouteTargetType target : targets) {
+            if (target.route.match(uri)) {
+                return target;
+            }
+        }
+        return null;
+    }
+
+    private Target getTarget(RequestContext context, RouteTargetType target, String uri) {
+        CollectionAdapter ca = route2CA.get(target.route);
+        if (ca != null) {
+            context.setAttribute(AbstractWorkspaceManager.COLLECTION_ADAPTER_ATTRIBUTE, ca);
+        }
+        return getTarget(context, target.route, uri, target.targetType);
+    }
+
+    private Target getTarget(RequestContext context, Route<T> route, String uri, TargetType type) {
+        return new RouteTarget(type, context, route, uri);
+    }
+
+    public String urlFor(Request context, T key, Object param) {
+        RequestContext rc = (RequestContext) context;
+        Route<T> route = routes.get(key);
+        return route != null ? rc.getContextPath() + route.expand(getContext(param)) : null;
+    }
+
+    private Context getContext(Object param) {
+        Context context = new EmptyContext();
+        if (param != null) {
+            if (param instanceof Map) {
+                context = new MapContext(cleanMapCtx(param), true);
+            } else if (param instanceof Context) {
+                context = (Context)param;
+            } else {
+                context = new ObjectContext(param, true);
+            }
+        }
+        return context;
+    }
+
+    @SuppressWarnings("unchecked")
+    private Map<String, Object> cleanMapCtx(Object param) {
+        Map<String, Object> map = new HashMap<String, Object>();
+        for (Map.Entry<String, Object> entry : ((Map<String, Object>)param).entrySet()) {
+            map.put(entry.getKey().replaceFirst("^:", ""), entry.getValue());
+        }
+        ((Map<String, Object>)param).clear();
+        ((Map<String, Object>)param).putAll(map);
+        return (Map<String, Object>)param;
+    }
+
+    private static class EmptyContext extends CachingContext {
+        private static final long serialVersionUID = 4681906592987534451L;
+
+        public boolean contains(String var) {
+          return false;
+        }
+        
+        protected <T> T resolveActual(String var) {
+            return null;
+        }
+
+        public Iterator<String> iterator() {
+            List<String> list = Arrays.asList(new String[0]);
+            return list.iterator();
+        }
+    }
+
+    public static class RouteTarget extends SimpleTarget {
+        private final Map<String, String> params;
+        private final Route<?> route;
+
+        public RouteTarget(TargetType type, RequestContext context, Route<?> route, String uri) {
+            super(type, context);
+            this.route = route;
+            this.params = route.parse(uri);
+        }
+
+        public Route<?> getRoute() {
+            return route;
+        }
+
+        @SuppressWarnings("unchecked")
+        @Override
+        public <T> T getMatcher() {
+            return (T)getRoute();
+        }
+
+        public String getParameter(String name) {
+            return params.containsKey(name) ? params.get(name) : super.getParameter(name);
+        }
+
+        public Iterable<String> getParameterNames() {
+            Iterable<String> ns = super.getParameterNames();
+            Set<String> names = new HashSet<String>();
+            for (String name : ns)
+              names.add(name);
+            for (String name : params.keySet())
+                names.add(name);
+            return names;
+        }
+    }
+}

Propchange: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/RouteManager.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/ServiceManager.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/ServiceManager.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/ServiceManager.java (added)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/ServiceManager.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,60 @@
+/*
+ * 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.abdera2.common.protocol;
+
+import java.util.Map;
+
+import org.apache.abdera2.common.Discover;
+import org.apache.abdera2.common.anno.DefaultImplementation;
+import org.apache.abdera2.common.protocol.servlet.async.ProcessorQueue;
+import org.apache.abdera2.common.protocol.servlet.async.TaskExecutor;
+import org.apache.abdera2.common.pusher.ChannelManager;
+
+@DefaultImplementation("org.apache.abdera2.protocol.server.AtompubServiceManager")
+public interface ServiceManager<P extends Provider> {
+
+  public static final String PROVIDER = Provider.class.getName();
+  public static final String PROCESSORQUEUE = ProcessorQueue.class.getName();
+  public static final String TASKEXECUTOR = TaskExecutor.class.getName();
+  public static final String CHANNELMANAGER = ChannelManager.class.getName();
+
+  
+  public abstract P newProvider(Map<String, String> properties);
+
+  public abstract ProcessorQueue newProcessorQueue(
+      Map<String, String> properties);
+
+  public abstract TaskExecutor newTaskExecutor(Map<String, String> properties);
+
+  public abstract ChannelManager newChannelManager(
+      Map<String, String> properties);
+
+  @SuppressWarnings({"rawtypes" })
+  public static class Factory {
+    
+    @SuppressWarnings("unchecked")
+    public static ServiceManager<Provider> getInstance() {
+      return getInstance("org.apache.abdera2.protocol.server.AtompubServiceManager");
+    }
+  
+    public static ServiceManager getInstance(String impl) {
+      return Discover.locate(ServiceManager.class, impl);
+    }
+    
+  }
+}
\ No newline at end of file

Propchange: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/ServiceManager.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/SimpleResponseContext.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/SimpleResponseContext.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/SimpleResponseContext.java (added)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/SimpleResponseContext.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,69 @@
+/*
+ * 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.abdera2.common.protocol;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+
+
+/**
+ * A simple base implementation of AbstractResponseContext that makes it a bit easier to create custom ResponseContext
+ * implementations e.g. new SimpleResponseContext() { public boolean hasEntity() { return true; } public void
+ * writeEntity(Writer writer) { ... } }
+ */
+public abstract class SimpleResponseContext extends AbstractResponseContext {
+
+    protected String encoding = "UTF-8";
+
+    protected SimpleResponseContext() {
+        this(null);
+    }
+
+    protected SimpleResponseContext(String encoding) {
+        if (encoding != null) {
+            this.encoding = encoding;
+        }
+    }
+
+    protected SimpleResponseContext setEncoding(String encoding) {
+        this.encoding = encoding;
+        return this;
+    }
+
+    protected String getEncoding() {
+        return this.encoding;
+    }
+
+    public void writeTo(OutputStream out) throws IOException {
+        if (hasEntity()) {
+            OutputStreamWriter writer = new OutputStreamWriter(out, encoding);
+            writeTo(writer);
+            writer.flush();
+        }
+    }
+
+    public void writeTo(Writer writer) throws IOException {
+        if (hasEntity())
+            writeEntity(writer);
+    }
+
+    protected abstract void writeEntity(Writer writer) throws IOException;
+
+}

Propchange: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/SimpleResponseContext.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/SimpleSubjectResolver.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/SimpleSubjectResolver.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/SimpleSubjectResolver.java (added)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/SimpleSubjectResolver.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,120 @@
+/*
+ * 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.abdera2.common.protocol;
+
+import java.io.Serializable;
+import java.security.Principal;
+
+import javax.security.auth.Subject;
+
+import org.apache.abdera2.common.misc.Resolver;
+
+/**
+ * The default subject resolver implementation
+ */
+public class SimpleSubjectResolver 
+  implements Resolver<Subject,Request> {
+
+    public static final Principal ANONYMOUS = new AnonymousPrincipal();
+
+    public Subject resolve(Request request) {
+        RequestContext context = (RequestContext)request;
+        return resolve(context.getPrincipal());
+    }
+
+    public Subject resolve(Principal principal) {
+        Subject subject = new Subject();
+        subject.getPrincipals().add((principal != null) ? principal : ANONYMOUS);
+        return subject;
+    }
+
+    public Subject resolve(String userid) {
+        if (userid == null)
+            return resolve(ANONYMOUS);
+        return resolve(new SimplePrincipal(userid));
+    }
+
+    static class SimplePrincipal implements Principal, Serializable {
+        private static final long serialVersionUID = 7161420960293729670L;
+        final String name;
+
+        SimplePrincipal(String name) {
+            this.name = name;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public String toString() {
+            return name;
+        }
+
+        @Override
+        public int hashCode() {
+            final int PRIME = 31;
+            int result = 1;
+            result = PRIME * result + ((name == null) ? 0 : name.hashCode());
+            return result;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj)
+                return true;
+            if (obj == null)
+                return false;
+            if (getClass() != obj.getClass())
+                return false;
+            final SimplePrincipal other = (SimplePrincipal)obj;
+            if (name == null) {
+                if (other.name != null)
+                    return false;
+            } else if (!name.equals(other.name))
+                return false;
+            return true;
+        }
+
+    }
+
+    public static final class AnonymousPrincipal implements Principal, Serializable {
+        private static final long serialVersionUID = -5050930075733261944L;
+        final String name = "Anonymous";
+
+        public String getName() {
+            return name;
+        }
+
+        public String toString() {
+            return name;
+        }
+
+        public boolean equals(Object other) {
+            if (other == null)
+                return false;
+            return this == other;
+        }
+
+        public int hashCode() {
+            final int PRIME = 31;
+            int result = 1;
+            result = PRIME * result + ((name == null) ? 0 : name.hashCode());
+            return result;
+        }
+    }
+}

Propchange: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/SimpleSubjectResolver.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/SimpleTarget.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/SimpleTarget.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/SimpleTarget.java (added)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/SimpleTarget.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,99 @@
+/*
+ * 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.abdera2.common.protocol;
+
+import java.util.Iterator;
+
+
+
+@SuppressWarnings("unchecked")
+public class SimpleTarget
+  implements Target {
+
+    protected final TargetType type;
+    protected final RequestContext context;
+
+    public SimpleTarget(TargetType type, RequestContext context) {
+        this.type = type;
+        this.context = context;
+    }
+
+    public String getIdentity() {
+        return context.getUri().toString();
+    }
+
+    public String getParameter(String name) {
+        return context.getParameter(name);
+    }
+
+    public Iterable<String> getParameterNames() {
+        return context.getParameterNames();
+    }
+
+    public Iterator<String> iterator() {
+        return getParameterNames().iterator();
+    }
+
+    public TargetType getType() {
+        return type;
+    }
+
+    public <T extends RequestContext>T getRequestContext() {
+        return (T)context;
+    }
+
+    public String toString() {
+        return getType() + " - " + getIdentity();
+    }
+
+    public <T> T getMatcher() {
+        return (T)null;
+    }
+
+    @Override
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + ((context == null) ? 0 : context.hashCode());
+        result = PRIME * result + ((type == null) ? 0 : type.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        final SimpleTarget other = (SimpleTarget)obj;
+        if (context == null) {
+            if (other.context != null)
+                return false;
+        } else if (!context.equals(other.context))
+            return false;
+        if (type == null) {
+            if (other.type != null)
+                return false;
+        } else if (!type.equals(other.type))
+            return false;
+        return true;
+    }
+
+}

Propchange: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/SimpleTarget.java
------------------------------------------------------------------------------
    svn:executable = *

Propchange: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/SimpleTarget.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/Target.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/Target.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/Target.java (added)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/Target.java Tue Sep 20 15:56:46 2011
@@ -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.abdera2.common.protocol;
+
+
+/**
+ * Identifies the target of the request.
+ */
+public interface Target extends Iterable<String> {
+
+    /**
+     * Return the resolved Target Type
+     */
+    TargetType getType();
+
+    /**
+     * Return the identity of this target. Usually this will just be the request URI
+     */
+    String getIdentity();
+
+    /**
+     * Return the named target parameter
+     */
+    String getParameter(String name);
+
+    /**
+     * Return a listing of all parameter names
+     */
+    Iterable<String> getParameterNames();
+
+    /**
+     * Return the object that matches with the uri
+     * 
+     * @return
+     */
+    public <T> T getMatcher();
+
+}

Propchange: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/Target.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/TargetBuilder.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/TargetBuilder.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/TargetBuilder.java (added)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/TargetBuilder.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,31 @@
+/*
+ * 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.abdera2.common.protocol;
+
+/**
+ * The TargetBuilder component is responsible for constructing appropriate IRIs/URIs for various kinds of targets based
+ * on specified input parameters. The input params are specific to the Target Manager implementation.
+ */
+public interface TargetBuilder<T> {
+
+    /**
+     * Construct a URL for the specified key
+     */
+    String urlFor(Request context, T key, Object param);
+
+}

Propchange: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/TargetBuilder.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/TargetType.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/TargetType.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/TargetType.java (added)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/TargetType.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,144 @@
+/*
+ * 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.abdera2.common.protocol;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Identifies the type of resource being requests.
+ */
+public final class TargetType {
+
+    public static final String UNKNOWN = "UNKNOWN";
+    public static final String NOT_FOUND = "NOT_FOUND";
+    public static final String SERVICE = "SERVICE";
+    public static final String COLLECTION = "COLLECTION";
+    public static final String ENTRY = "ENTRY";
+    public static final String MEDIA = "MEDIA";
+    public static final String CATEGORIES = "CATEGORIES";
+
+    private static final Map<String, TargetType> types = 
+      new ConcurrentHashMap<String, TargetType>();
+
+    /**
+     * An unknown target type
+     */
+    public static final TargetType TYPE_UNKNOWN = new TargetType(UNKNOWN);
+    /**
+     * A not found target type
+     */
+    public static final TargetType TYPE_NOT_FOUND = new TargetType(NOT_FOUND);
+    /**
+     * An Atompub Service Document
+     */
+    public static final TargetType TYPE_SERVICE = new TargetType(SERVICE);
+    /**
+     * An Atom Feed Document representing an Atompub Collection
+     */
+    public static final TargetType TYPE_COLLECTION = new TargetType(COLLECTION);
+    /**
+     * An Atompub Collection member entry
+     */
+    public static final TargetType TYPE_ENTRY = new TargetType(ENTRY);
+    /**
+     * An Atompub Collection media resource
+     */
+    public static final TargetType TYPE_MEDIA = new TargetType(MEDIA);
+    /**
+     * An Atompub Categories Document
+     */
+    public static final TargetType TYPE_CATEGORIES = new TargetType(CATEGORIES);
+
+    /**
+     * Return a listing of TargetTypes
+     */
+    public static Iterable<TargetType> values() {
+        return types.values();
+    }
+
+    /**
+     * Get the specified target type
+     */
+    public static TargetType get(String name) {
+        return types.get(name.toUpperCase());
+    }
+
+    /**
+     * Get the specified target type. If the target type does not currently exist, and create = true, a new type will be
+     * created.
+     */
+    public static TargetType get(String name, boolean create) {
+        if (name == null)
+            return null;
+        TargetType type = get(name);
+        return type != null ? type : create ? create(name) : null;
+    }
+
+    private static synchronized TargetType create(String name) {
+        TargetType type = new TargetType(name.toUpperCase());
+        types.put(type.name(), type);
+        return type;
+    }
+
+    private final String name;
+
+    private TargetType(String name) {
+        if (name == null || name.length() == 0)
+            throw new IllegalArgumentException();
+        if (get(name) != null)
+            throw new IllegalArgumentException();
+        this.name = name.toUpperCase();
+        types.put(name, this);
+    }
+
+    /**
+     * Return the target name
+     */
+    public String name() {
+        return name;
+    }
+
+    public String toString() {
+        return name;
+    }
+
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + ((name == null) ? 0 : name.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 TargetType other = (TargetType)obj;
+        if (name == null) {
+            if (other.name != null)
+                return false;
+        } else if (!name.equals(other.name))
+            return false;
+        return true;
+    }
+
+}

Propchange: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/TargetType.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/TemplateManagerTargetBuilder.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/TemplateManagerTargetBuilder.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/TemplateManagerTargetBuilder.java (added)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/TemplateManagerTargetBuilder.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,113 @@
+/*
+ * 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.abdera2.common.protocol;
+
+import java.util.Map;
+
+import org.apache.abdera2.common.iri.IRI;
+import org.apache.abdera2.common.templates.Context;
+import org.apache.abdera2.common.templates.MapContext;
+import org.apache.abdera2.common.templates.ObjectContext;
+import org.apache.abdera2.common.templates.TemplateManager;
+
+public class TemplateManagerTargetBuilder<T> 
+  extends TemplateManager<T>
+  implements TargetBuilder<T> {
+
+  public TemplateManagerTargetBuilder() {
+    super();
+  }
+
+  public TemplateManagerTargetBuilder(boolean iri) {
+    super(iri);
+  }
+
+  public TemplateManagerTargetBuilder(Context defaults) {
+    super(defaults);
+  }
+
+  public TemplateManagerTargetBuilder(IRI base, boolean iri) {
+    super(base, iri);
+  }
+
+  public TemplateManagerTargetBuilder(IRI base, Context defaults) {
+    super(base, defaults);
+  }
+
+  public TemplateManagerTargetBuilder(IRI base, Object defaults, boolean isiri) {
+    super(base, defaults, isiri);
+  }
+
+  public TemplateManagerTargetBuilder(IRI base, Object defaults) {
+    super(base, defaults);
+  }
+
+  public TemplateManagerTargetBuilder(IRI base) {
+    super(base);
+  }
+
+  public TemplateManagerTargetBuilder(Object defaults, boolean isiri) {
+    super(defaults, isiri);
+  }
+
+  public TemplateManagerTargetBuilder(Object defaults) {
+    super(defaults);
+  }
+
+  public TemplateManagerTargetBuilder(String base, boolean iri) {
+    super(base, iri);
+  }
+
+  public TemplateManagerTargetBuilder(String base, Context defaults) {
+    super(base, defaults);
+  }
+
+  public TemplateManagerTargetBuilder(String base, Object defaults,
+      boolean isiri) {
+    super(base, defaults, isiri);
+  }
+
+  public TemplateManagerTargetBuilder(String base, Object defaults) {
+    super(base, defaults);
+  }
+
+  public TemplateManagerTargetBuilder(String base) {
+    super(base);
+  }
+
+  public String urlFor(Request request, T key, Object param) {
+    RequestContext rc = (RequestContext) request;
+    if (param == null) param = new MapContext(true);
+    return expand(key,getContext(rc,param));
+  }
+
+  @SuppressWarnings("unchecked")
+  public static Context getContext(RequestContext request, Object param) {
+    Context context = null;
+    if (param != null) {
+        if (param instanceof Map) {
+            context = new MapContext((Map<String, Object>)param, true);
+        } else if (param instanceof Context) {
+            context = (Context)param;
+        } else {
+            context = new ObjectContext(param, true);
+        }
+    }
+    return new RequestTemplateContext(request, context);
+  }
+}

Propchange: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/TemplateManagerTargetBuilder.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/Transactional.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/Transactional.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/Transactional.java (added)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/Transactional.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,42 @@
+/*
+ * 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.abdera2.common.protocol;
+
+/**
+ * CollectionAdapter implementations can implement the Transactional interface in order to support start/end/compensate
+ * behaviors. Providers will invoke the start/end methods before/after calling the appropriate CollectionAdapter methods
+ * and will call compensate if an error occurs
+ */
+public interface Transactional {
+
+    /**
+     * Called by the provider before dispatching the request to the adapter
+     */
+    void start(RequestContext request);
+
+    /**
+     * Called by the provider after dispatching the request to the adapter
+     */
+    void end(RequestContext request, ResponseContext response);
+
+    /**
+     * Called by the provider when a processing error occurs
+     */
+    void compensate(RequestContext request, Throwable t);
+
+}

Propchange: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/Transactional.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/WorkspaceInfo.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/WorkspaceInfo.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/WorkspaceInfo.java (added)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/WorkspaceInfo.java Tue Sep 20 15:56:46 2011
@@ -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.abdera2.common.protocol;
+
+import java.util.Collection;
+
+
+/**
+ * Metadata interface used by WorkspaceManager and Provider implementations to construct Atompub Service Documents. The
+ * WorkspaceInfo interface provides information used to construct an app:workspace element
+ */
+public interface WorkspaceInfo {
+
+    /**
+     * Return the value of the app:workspace element's atom:title. This assumes that the atom:title element uses
+     * type="text". This must not be null
+     */
+    String getTitle(RequestContext requsest);
+
+    /**
+     * Return the listing of collections available as part of the workspace
+     */
+    Collection<CollectionInfo> getCollections(RequestContext request);
+
+}

Propchange: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/WorkspaceInfo.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/WorkspaceManager.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/WorkspaceManager.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/WorkspaceManager.java (added)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/WorkspaceManager.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,45 @@
+/*
+ * 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.abdera2.common.protocol;
+
+import java.util.Collection;
+import java.util.Date;
+
+import org.apache.abdera2.common.http.EntityTag;
+
+/**
+ * The Workspace Manager is used by a Provider to access metadata used to construct Atompub service documents and to
+ * determine the appropriate CollectionAdapter to handle a particular request
+ */
+public interface WorkspaceManager {
+
+    /**
+     * Get the Collection Adapter that will handle this request
+     */
+    CollectionAdapter getCollectionAdapter(RequestContext request);
+
+    /**
+     * Return the list of available workspaces
+     */
+    Collection<WorkspaceInfo> getWorkspaces(RequestContext request);
+
+    Date getLastModified();
+    
+    EntityTag getEntityTag();
+    
+}

Propchange: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/WorkspaceManager.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/servlet/AbderaServlet.java
URL: http://svn.apache.org/viewvc/abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/servlet/AbderaServlet.java?rev=1173209&view=auto
==============================================================================
--- abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/servlet/AbderaServlet.java (added)
+++ abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/servlet/AbderaServlet.java Tue Sep 20 15:56:46 2011
@@ -0,0 +1,38 @@
+/*
+ * 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.abdera2.common.protocol.servlet;
+
+import java.io.IOException;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class AbderaServlet 
+  extends AbstractAbderaServlet {
+
+    private static final long serialVersionUID = 2393643907128535158L;
+
+    @Override
+    protected void service(
+        HttpServletRequest request, 
+        HttpServletResponse response) 
+          throws ServletException,IOException {
+        process(request,response,getServletContext());
+    }
+
+}

Propchange: abdera/abdera2/common/src/main/java/org/apache/abdera2/common/protocol/servlet/AbderaServlet.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain



Mime
View raw message