You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2008/07/01 20:41:29 UTC

svn commit: r673167 [2/6] - in /cxf/trunk: parent/ rt/frontend/jaxrs/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ rt/frontend...

Copied: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/VariantListBuilderImpl.java (from r651969, cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/VariantListBuilderImpl.java)
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/VariantListBuilderImpl.java?p2=cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/VariantListBuilderImpl.java&p1=cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/VariantListBuilderImpl.java&r1=651969&r2=673167&rev=673167&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/VariantListBuilderImpl.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/VariantListBuilderImpl.java Tue Jul  1 11:41:24 2008
@@ -18,7 +18,7 @@
  */
 
 
-package org.apache.cxf.jaxrs.provider;
+package org.apache.cxf.jaxrs.impl;
 
 import java.util.ArrayList;
 import java.util.Arrays;

Added: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/AbstractThreadLocalProxy.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/AbstractThreadLocalProxy.java?rev=673167&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/AbstractThreadLocalProxy.java (added)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/AbstractThreadLocalProxy.java Tue Jul  1 11:41:24 2008
@@ -0,0 +1,42 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. 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.
+ */
+
+package org.apache.cxf.jaxrs.impl.tl;
+
+
+public class AbstractThreadLocalProxy<T> implements ThreadLocalProxy<T> {
+
+    private ThreadLocal<T> infos = new ThreadLocal<T>();
+    
+    protected AbstractThreadLocalProxy() {
+        
+    }
+    
+    public T get() {
+        return infos.get();
+    }
+
+    public void remove() {
+        infos.remove();
+    }
+
+    public void set(T value) {
+        infos.set(value);
+    }
+}

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/AbstractThreadLocalProxy.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/AbstractThreadLocalProxy.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalContextResolver.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalContextResolver.java?rev=673167&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalContextResolver.java (added)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalContextResolver.java Tue Jul  1 11:41:24 2008
@@ -0,0 +1,32 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. 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.
+ */
+
+package org.apache.cxf.jaxrs.impl.tl;
+
+import javax.ws.rs.ext.ContextResolver;
+
+public class ThreadLocalContextResolver extends AbstractThreadLocalProxy<ContextResolver> 
+    implements ContextResolver {
+
+    @SuppressWarnings("unchecked")
+    public Object getContext(Class type) {
+        return get().getContext(type);
+    }
+
+}

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalContextResolver.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalContextResolver.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalHttpHeaders.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalHttpHeaders.java?rev=673167&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalHttpHeaders.java (added)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalHttpHeaders.java Tue Jul  1 11:41:24 2008
@@ -0,0 +1,62 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. 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.
+ */
+
+
+package org.apache.cxf.jaxrs.impl.tl;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.ws.rs.core.Cookie;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+
+public class ThreadLocalHttpHeaders extends AbstractThreadLocalProxy<HttpHeaders> 
+    implements HttpHeaders {
+
+    public List<MediaType> getAcceptableMediaTypes() {
+        return get().getAcceptableMediaTypes();
+    }
+
+    public Map<String, Cookie> getCookies() {
+        return get().getCookies();
+    }
+
+    public String getLanguage() {
+        return get().getLanguage();
+    }
+
+    public MediaType getMediaType() {
+        return get().getMediaType();
+    }
+
+    public MultivaluedMap<String, String> getRequestHeaders() {
+        return get().getRequestHeaders();
+    }
+
+    public List<String> getAcceptableLanguages() {
+        return get().getAcceptableLanguages();
+    }
+
+    public List<String> getRequestHeader(String name) {
+        return get().getRequestHeader(name);
+    }
+
+}

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalHttpHeaders.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalHttpHeaders.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalHttpServletRequest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalHttpServletRequest.java?rev=673167&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalHttpServletRequest.java (added)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalHttpServletRequest.java Tue Jul  1 11:41:24 2008
@@ -0,0 +1,260 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. 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.
+ */
+
+package org.apache.cxf.jaxrs.impl.tl;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.security.Principal;
+import java.util.Enumeration;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+public class ThreadLocalHttpServletRequest extends AbstractThreadLocalProxy<HttpServletRequest> 
+    implements HttpServletRequest {
+
+    public String getAuthType() {
+        return get().getAuthType();
+    }
+
+    public String getContextPath() {
+        return get().getContextPath();
+    }
+
+    public Cookie[] getCookies() {
+        return get().getCookies();
+    }
+
+    public long getDateHeader(String name) {
+        return get().getDateHeader(name);
+    }
+
+    public String getHeader(String name) {
+        return get().getHeader(name);
+    }
+
+    public Enumeration getHeaderNames() {
+        return get().getHeaderNames();
+    }
+
+    public Enumeration getHeaders(String name) {
+        return get().getHeaders(name);
+    }
+
+    public int getIntHeader(String name) {
+        return get().getIntHeader(name);
+    }
+
+    public String getMethod() {
+        return get().getMethod();
+    }
+
+    public String getPathInfo() {
+        return get().getPathInfo();
+    }
+
+    public String getPathTranslated() {
+        return get().getPathTranslated();
+    }
+
+    public String getQueryString() {
+        return get().getQueryString();
+    }
+
+    public String getRemoteUser() {
+        return get().getRemoteUser();
+    }
+
+    public String getRequestURI() {
+        return get().getRequestURI();
+    }
+
+    public StringBuffer getRequestURL() {
+        return get().getRequestURL();
+    }
+
+    public String getRequestedSessionId() {
+        return get().getRequestedSessionId();
+    }
+
+    public String getServletPath() {
+        return get().getServletPath();
+    }
+
+    public HttpSession getSession() {
+        return get().getSession();
+    }
+
+    public HttpSession getSession(boolean create) {
+        return get().getSession(create);
+    }
+
+    public Principal getUserPrincipal() {
+        return get().getUserPrincipal();
+    }
+
+    public boolean isRequestedSessionIdFromCookie() {
+        return get().isRequestedSessionIdFromCookie();
+    }
+
+    public boolean isRequestedSessionIdFromURL() {
+        return get().isRequestedSessionIdFromURL();
+    }
+
+    @SuppressWarnings("deprecation")
+    public boolean isRequestedSessionIdFromUrl() {
+        return get().isRequestedSessionIdFromUrl();
+    }
+
+    public boolean isRequestedSessionIdValid() {
+        return get().isRequestedSessionIdValid();
+    }
+
+    public boolean isUserInRole(String role) {
+        return get().isUserInRole(role);
+    }
+
+    public Object getAttribute(String name) {
+        return get().getAttribute(name);
+    }
+
+    public Enumeration getAttributeNames() {
+        return get().getAttributeNames();
+    }
+
+    public String getCharacterEncoding() {
+        return get().getCharacterEncoding();
+    }
+
+    public int getContentLength() {
+        return get().getContentLength();
+    }
+
+    public String getContentType() {
+        return get().getContentType();
+    }
+
+    public ServletInputStream getInputStream() throws IOException {
+        return get().getInputStream();
+    }
+
+    public String getLocalAddr() {
+        return get().getLocalAddr();
+    }
+
+    public String getLocalName() {
+        return get().getLocalName();
+    }
+
+    public int getLocalPort() {
+        return get().getLocalPort();
+    }
+
+    public Locale getLocale() {
+        return get().getLocale();
+    }
+
+    public Enumeration getLocales() {
+        return get().getLocales();
+    }
+
+    public String getParameter(String name) {
+        return get().getParameter(name);
+    }
+
+    public Map getParameterMap() {
+        return get().getParameterMap();
+    }
+
+    public Enumeration getParameterNames() {
+        return get().getParameterNames();
+    }
+
+    public String[] getParameterValues(String name) {
+        return get().getParameterValues(name);
+    }
+
+    public String getProtocol() {
+        return get().getProtocol();
+    }
+
+    public BufferedReader getReader() throws IOException {
+        return get().getReader();
+    }
+
+    @SuppressWarnings("deprecation")
+    public String getRealPath(String path) {
+        return get().getRealPath(path);
+    }
+
+    public String getRemoteAddr() {
+        return get().getRemoteAddr();
+    }
+
+    public String getRemoteHost() {
+        return get().getRemoteHost();
+    }
+
+    public int getRemotePort() {
+        return get().getRemotePort();
+    }
+
+    public RequestDispatcher getRequestDispatcher(String path) {
+        return get().getRequestDispatcher(path);
+    }
+
+    public String getScheme() {
+        return get().getScheme();
+    }
+
+    public String getServerName() {
+        return get().getServerName();
+    }
+
+    public int getServerPort() {
+        return get().getServerPort();
+    }
+
+    public boolean isSecure() {
+        return get().isSecure();
+    }
+
+    public void removeAttribute(String name) {
+        get().removeAttribute(name);
+
+    }
+
+    public void setAttribute(String name, Object o) {
+        get().setAttribute(name, o);
+
+    }
+
+    public void setCharacterEncoding(String env) throws UnsupportedEncodingException {
+        get().setCharacterEncoding(env);
+
+    }
+
+}

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalHttpServletRequest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalHttpServletRequest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalMessageBodyWorkers.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalMessageBodyWorkers.java?rev=673167&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalMessageBodyWorkers.java (added)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalMessageBodyWorkers.java Tue Jul  1 11:41:24 2008
@@ -0,0 +1,47 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. 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.
+ */
+
+package org.apache.cxf.jaxrs.impl.tl;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.ext.MessageBodyReader;
+import javax.ws.rs.ext.MessageBodyWorkers;
+import javax.ws.rs.ext.MessageBodyWriter;
+
+public class ThreadLocalMessageBodyWorkers extends AbstractThreadLocalProxy<MessageBodyWorkers>
+       implements MessageBodyWorkers {
+
+    public <T> MessageBodyReader<T> getMessageBodyReader(Class<T> type, 
+                                                         Type genericType, 
+                                                         Annotation[] annotations,
+                                                         MediaType mediaType) {
+        return get().getMessageBodyReader(type, genericType, annotations, mediaType);
+    }
+
+    public <T> MessageBodyWriter<T> getMessageBodyWriter(Class<T> type, 
+                                                         Type genericType, 
+                                                         Annotation[] annotations,
+                                                         MediaType mediaType) {
+        return get().getMessageBodyWriter(type, genericType, annotations, mediaType);
+    }
+
+}

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalMessageBodyWorkers.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalMessageBodyWorkers.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalProxy.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalProxy.java?rev=673167&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalProxy.java (added)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalProxy.java Tue Jul  1 11:41:24 2008
@@ -0,0 +1,26 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. 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.
+ */
+
+package org.apache.cxf.jaxrs.impl.tl;
+
+public interface ThreadLocalProxy<T> {
+    void set(T value);
+    T get(); 
+    void remove();
+}

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalProxy.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalProxy.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalRequest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalRequest.java?rev=673167&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalRequest.java (added)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalRequest.java Tue Jul  1 11:41:24 2008
@@ -0,0 +1,49 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. 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.
+ */
+
+package org.apache.cxf.jaxrs.impl.tl;
+
+import java.util.Date;
+import java.util.List;
+
+import javax.ws.rs.core.EntityTag;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.Response.ResponseBuilder;
+import javax.ws.rs.core.Variant;
+
+public class ThreadLocalRequest extends AbstractThreadLocalProxy<Request> 
+    implements Request {
+
+    public ResponseBuilder evaluatePreconditions(EntityTag eTag) {
+        return get().evaluatePreconditions(eTag);
+    }
+
+    public ResponseBuilder evaluatePreconditions(Date lastModified) {
+        return get().evaluatePreconditions(lastModified);
+    }
+
+    public ResponseBuilder evaluatePreconditions(Date lastModified, EntityTag eTag) {
+        return get().evaluatePreconditions(lastModified, eTag);
+    }
+
+    public Variant selectVariant(List<Variant> vars) throws IllegalArgumentException {
+        return get().selectVariant(vars);
+    }
+
+}

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalRequest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalRequest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalSecurityContext.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalSecurityContext.java?rev=673167&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalSecurityContext.java (added)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalSecurityContext.java Tue Jul  1 11:41:24 2008
@@ -0,0 +1,45 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. 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.
+ */
+
+package org.apache.cxf.jaxrs.impl.tl;
+
+import java.security.Principal;
+
+import javax.ws.rs.core.SecurityContext;
+
+public class ThreadLocalSecurityContext extends AbstractThreadLocalProxy<SecurityContext> 
+    implements SecurityContext {
+
+    public String getAuthenticationScheme() {
+        return get().getAuthenticationScheme();
+    }
+
+    public Principal getUserPrincipal() {
+        return get().getUserPrincipal();
+    }
+
+    public boolean isSecure() {
+        return get().isSecure();
+    }
+
+    public boolean isUserInRole(String role) {
+        return get().isUserInRole(role);
+    }
+
+}

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalSecurityContext.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalSecurityContext.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalUriInfo.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalUriInfo.java?rev=673167&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalUriInfo.java (added)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalUriInfo.java Tue Jul  1 11:41:24 2008
@@ -0,0 +1,110 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. 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.
+ */
+
+package org.apache.cxf.jaxrs.impl.tl;
+
+import java.net.URI;
+import java.util.List;
+
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.PathSegment;
+import javax.ws.rs.core.UriBuilder;
+import javax.ws.rs.core.UriInfo;
+
+public class ThreadLocalUriInfo extends AbstractThreadLocalProxy<UriInfo> 
+                                    implements UriInfo {
+
+    
+    public URI getAbsolutePath() {
+        return get().getAbsolutePath();
+    }
+
+    public UriBuilder getAbsolutePathBuilder() {
+        return get().getAbsolutePathBuilder();
+    }
+
+    public List<String> getAncestorResourceURIs() {
+        return get().getAncestorResourceURIs();
+    }
+
+    public List<Object> getAncestorResources() {
+        return get().getAncestorResources();
+    }
+
+    public URI getBaseUri() {
+        return get().getBaseUri();
+    }
+
+    public UriBuilder getBaseUriBuilder() {
+        return get().getBaseUriBuilder();
+    }
+
+    public String getPath() {
+        return get().getPath();
+    }
+
+    public String getPath(boolean decode) {
+        return get().getPath(decode);
+    }
+
+    public List<PathSegment> getPathSegments() {
+        return get().getPathSegments();
+    }
+
+    public List<PathSegment> getPathSegments(boolean decode) {
+        return get().getPathSegments(decode);
+    }
+
+    public MultivaluedMap<String, String> getQueryParameters() {
+        return get().getQueryParameters();
+    }
+
+    public MultivaluedMap<String, String> getQueryParameters(boolean decode) {
+        return get().getQueryParameters(decode);
+    }
+
+    public URI getRequestUri() {
+        return get().getRequestUri();
+    }
+
+    public UriBuilder getRequestUriBuilder() {
+        return get().getRequestUriBuilder();
+    }
+
+    public MultivaluedMap<String, String> getPathParameters() {
+        return get().getPathParameters();
+    }
+
+    public MultivaluedMap<String, String> getPathParameters(boolean decode) {
+        return get().getPathParameters(decode);
+    }
+
+    public List<String> getAncestorResourceURIs(boolean decode) {
+        return get().getAncestorResourceURIs(decode);
+    }
+
+    public String getPathExtension() {
+        return get().getPathExtension();
+    }
+
+    public UriBuilder getPlatonicRequestUriBuilder() {
+        return get().getPlatonicRequestUriBuilder();
+    }
+
+}

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalUriInfo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/tl/ThreadLocalUriInfo.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java?rev=673167&r1=673166&r2=673167&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java Tue Jul  1 11:41:24 2008
@@ -23,19 +23,24 @@
 import java.util.ResourceBundle;
 import java.util.logging.Logger;
 
+import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response;
 
 import org.apache.cxf.common.i18n.BundleUtils;
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.interceptor.Fault;
 import org.apache.cxf.jaxrs.JAXRSServiceImpl;
-import org.apache.cxf.jaxrs.JAXRSUtils;
-import org.apache.cxf.jaxrs.MetadataMap;
+import org.apache.cxf.jaxrs.ext.RequestHandler;
+import org.apache.cxf.jaxrs.impl.MetadataMap;
+import org.apache.cxf.jaxrs.impl.RequestPreprocessor;
+import org.apache.cxf.jaxrs.impl.UriInfoImpl;
 import org.apache.cxf.jaxrs.model.ClassResourceInfo;
 import org.apache.cxf.jaxrs.model.OperationResourceInfo;
+import org.apache.cxf.jaxrs.model.ProviderInfo;
 import org.apache.cxf.jaxrs.model.URITemplate;
 import org.apache.cxf.jaxrs.provider.ProviderFactory;
-import org.apache.cxf.jaxrs.provider.SystemQueryHandler;
+import org.apache.cxf.jaxrs.utils.JAXRSUtils;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.phase.AbstractPhaseInterceptor;
 import org.apache.cxf.phase.Phase;
@@ -44,6 +49,7 @@
 public class JAXRSInInterceptor extends AbstractPhaseInterceptor<Message> {
 
     public static final String RELATIVE_PATH = "relative.path";
+    public static final String ROOT_RESOURCE_CLASS = "root.resource.class";
 
     private static final Logger LOG = LogUtils.getL7dLogger(JAXRSInInterceptor.class);
     private static final ResourceBundle BUNDLE = BundleUtils.getBundle(JAXRSInInterceptor.class);
@@ -53,6 +59,28 @@
     }
 
     public void handleMessage(Message message) {
+        
+        try {
+            processRequest(message);
+        } catch (RuntimeException ex) {
+            Response excResponse = JAXRSUtils.convertFaultToResponse(ex);
+            if (excResponse == null) {
+                ProviderFactory.getInstance().cleatThreadLocalProxies();
+                throw ex;
+            }
+            message.getExchange().put(Response.class, excResponse);
+        }
+        
+        
+    }
+    
+    private void processRequest(Message message) {
+        RequestPreprocessor rp = 
+            ProviderFactory.getInstance().getRequestPreprocessor();
+        if (rp != null) {
+            rp.preprocess(message, new UriInfoImpl(message, null));
+        }
+        
         String path = (String)message.get(Message.PATH_INFO);
         String address = (String)message.get(Message.BASE_PATH);
         String httpMethod = (String)message.get(Message.HTTP_REQUEST_METHOD);
@@ -79,51 +107,62 @@
             path = path + "/";
         }
         
-        //TODO : make sure we do this parsing only once
-        MultivaluedMap<String, String> queries = 
-            JAXRSUtils.getStructuredParams((String)message.get(Message.QUERY_STRING), 
-                                            "&", true);
-        SystemQueryHandler sqh = ProviderFactory.getInstance().getQueryHandler(queries);
-        if (sqh != null) {
-            // TODO : if Response != null then make sure no invocations happen
-            // TODO : root resource class needs be selected earlier
-            sqh.handleQuery(message, null, queries);
+        
+        //1. Matching target resource class
+        Service service = message.getExchange().get(Service.class);
+        List<ClassResourceInfo> resources = ((JAXRSServiceImpl)service).getClassResourceInfos();
+
+        MultivaluedMap<String, String> values = new MetadataMap<String, String>();
+        ClassResourceInfo resource = JAXRSUtils.selectResourceClass(resources, path, values);
+        if (resource == null) {
+            org.apache.cxf.common.i18n.Message errorMsg = 
+                new org.apache.cxf.common.i18n.Message("NO_ROOT_EXC", 
+                                                   BUNDLE, 
+                                                   path);
+            LOG.severe(errorMsg.toString());
+            throw new Fault(errorMsg);
+        }
+        
+        List<ProviderInfo<RequestHandler>> shs = 
+            ProviderFactory.getInstance().getRequestHandlers();
+        for (ProviderInfo<RequestHandler> sh : shs) {
+            Response response = sh.getProvider().handleRequest(message, resource);
+            if (response != null) {
+                message.getExchange().put(Response.class, response);
+                return;
+            }
         }
         
-        String acceptContentTypes = (String)message.get(Message.ACCEPT_CONTENT_TYPE);
-        if (acceptContentTypes == null) {
-            acceptContentTypes = "*/*";
+        String acceptTypes = (String)message.get(Message.ACCEPT_CONTENT_TYPE);
+        if (acceptTypes == null) {
+            acceptTypes = "*/*";
         }
+        
+        List<MediaType> acceptContentTypes = JAXRSUtils.sortMediaTypes(acceptTypes);
         message.getExchange().put(Message.ACCEPT_CONTENT_TYPE, acceptContentTypes);
+        message.getExchange().put(ROOT_RESOURCE_CLASS, resource);
         
         LOG.fine("Request path is: " + path);
         LOG.fine("Request HTTP method is: " + httpMethod);
         LOG.fine("Request contentType is: " + requestContentType);
-        LOG.fine("Accept contentType is: " + acceptContentTypes);
+        LOG.fine("Accept contentType is: " + acceptTypes);
         
-        //1. Matching target resource classes and method
-        Service service = message.getExchange().get(Service.class);
-        List<ClassResourceInfo> resources = ((JAXRSServiceImpl)service).getClassResourceInfos();
-
-        MultivaluedMap<String, String> values = new MetadataMap<String, String>();
-        OperationResourceInfo ori = JAXRSUtils.findTargetResourceClass(resources, 
-                                                                       path, 
-                                                                       httpMethod, 
-                                                                       values,
-                                                                       requestContentType, 
-                                                                       acceptContentTypes);
+        
+        OperationResourceInfo ori = 
+            JAXRSUtils.findTargetMethod(resource, values.getFirst(URITemplate.FINAL_MATCH_GROUP), 
+                                       httpMethod, values, requestContentType, acceptContentTypes);
 
         if (ori == null) {
-            String errorMessage = "No operation found for path: " + path + ", contentType: " 
-                + requestContentType + ", Accept contentType: " + acceptContentTypes;
-            LOG.severe(errorMessage);
-            throw new Fault(new org.apache.cxf.common.i18n.Message("NO_OP_EXC", 
-                                                                   BUNDLE, 
-                                                                   path,
-                                                                   requestContentType,
-                                                                   acceptContentTypes));
+            org.apache.cxf.common.i18n.Message errorMsg = 
+                new org.apache.cxf.common.i18n.Message("NO_OP_EXC", 
+                                                   BUNDLE, 
+                                                   path,
+                                                   requestContentType,
+                                                   acceptTypes);
+            LOG.severe(errorMsg.toString());
+            throw new Fault(errorMsg);
         }
-        LOG.fine("Found operation: " + ori.getMethod().getName());
+        LOG.fine("Found operation: " + ori.getMethodToInvoke().getName());
         
         message.getExchange().put(OperationResourceInfo.class, ori);
         message.put(RELATIVE_PATH, values.getFirst(URITemplate.FINAL_MATCH_GROUP));

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java?rev=673167&r1=673166&r2=673167&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java Tue Jul  1 11:41:24 2008
@@ -21,11 +21,13 @@
 
 import java.io.IOException;
 import java.io.OutputStream;
+import java.lang.reflect.Method;
+import java.util.Collections;
 import java.util.List;
 import java.util.ResourceBundle;
 import java.util.logging.Logger;
 
-import javax.ws.rs.ProduceMime;
+import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.ext.MessageBodyWriter;
@@ -33,9 +35,12 @@
 import org.apache.cxf.common.i18n.BundleUtils;
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor;
-import org.apache.cxf.jaxrs.JAXRSUtils;
+import org.apache.cxf.jaxrs.ext.ResponseHandler;
+import org.apache.cxf.jaxrs.model.ClassResourceInfo;
 import org.apache.cxf.jaxrs.model.OperationResourceInfo;
+import org.apache.cxf.jaxrs.model.ProviderInfo;
 import org.apache.cxf.jaxrs.provider.ProviderFactory;
+import org.apache.cxf.jaxrs.utils.JAXRSUtils;
 import org.apache.cxf.message.Exchange;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.message.MessageContentsList;
@@ -51,6 +56,24 @@
 
     @SuppressWarnings("unchecked")
     public void handleMessage(Message message) {
+        
+        try {
+            processResponse(message);
+        } finally {
+            ProviderFactory.getInstance().cleatThreadLocalProxies();
+            ClassResourceInfo cri =
+                (ClassResourceInfo)message.getExchange().get(JAXRSInInterceptor.ROOT_RESOURCE_CLASS);
+            if (cri != null) {
+                cri.clearThreadLocalProxies();
+            }
+        }
+            
+
+    }
+    
+    @SuppressWarnings("unchecked")
+    private void processResponse(Message message) {
+        
         Exchange exchange = message.getExchange();
         OperationResourceInfo operation = (OperationResourceInfo)exchange.get(OperationResourceInfo.class
             .getName());
@@ -63,33 +86,54 @@
         if (objs == null || objs.size() == 0) {
             return;
         }
-
+        
         OutputStream out = message.getContent(OutputStream.class);
         
         if (objs.get(0) != null) {
             Object responseObj = objs.get(0);
+            Response response = null;
             if (objs.get(0) instanceof Response) {
-                Response response = (Response)responseObj;
-                
-                message.put(Message.RESPONSE_CODE, response.getStatus());
-                message.put(Message.PROTOCOL_HEADERS, response.getMetadata());
-                                
-                responseObj = response.getEntity();
-                if (responseObj == null) {
-                    return;
+                response = (Response)responseObj;
+            } else {    
+                response = Response.ok(responseObj).build();
+            }
+            
+            List<ProviderInfo<ResponseHandler>> handlers = 
+                ProviderFactory.getInstance().getResponseHandlers();
+            for (ProviderInfo<ResponseHandler> rh : handlers) {
+                Response r = rh.getProvider().handleResponse(message, operation, response);
+                if (r != null) {
+                    response = r;
                 }
-            } 
+            }
+            
+            message.put(Message.RESPONSE_CODE, response.getStatus());
+            message.put(Message.PROTOCOL_HEADERS, response.getMetadata());
+                            
+            responseObj = response.getEntity();
+            if (responseObj == null) {
+                return;
+            }
             
             Class targetType = responseObj.getClass();
             List<MediaType> availableContentTypes = 
-                computeAvailableContentTypes(message);  
+                computeAvailableContentTypes(message, response);  
+            
+            Method invoked = ((OperationResourceInfo)message.getExchange()
+                    .get(OperationResourceInfo.class)).getMethodToInvoke();
             
             MessageBodyWriter writer = null;
+            MediaType responseType = null;
             for (MediaType type : availableContentTypes) { 
                 writer = ProviderFactory.getInstance()
-                    .createMessageBodyWriter(targetType, type);
-                 
+                    .createMessageBodyWriter(targetType, 
+                          invoked.getGenericReturnType(), 
+                          invoked.getAnnotations(), 
+                          type,
+                          exchange.getInMessage());
+                
                 if (writer != null) {
+                    responseType = type;
                     break;
                 }
             }
@@ -98,16 +142,23 @@
                 message.put(Message.RESPONSE_CODE, 406);
                 writeResponseErrorMessage(out, 
                                           "NO_MSG_WRITER",
-                                          responseObj.getClass().getSimpleName());
+                                          invoked.getReturnType().getSimpleName());
                 return;
             }
             
             try {
                 LOG.fine("Response EntityProvider is: " + writer.getClass().getName());
-                MediaType mt = computeFinalContentTypes(availableContentTypes, writer);
-                LOG.fine("Response content type is: " + mt.toString());
-                message.put(Message.CONTENT_TYPE, mt.toString());
-                writer.writeTo(responseObj, mt, null, out);
+                writer.writeTo(responseObj, targetType, invoked.getGenericReturnType(), 
+                               invoked.getAnnotations(), 
+                               responseType, 
+                               response.getMetadata(), 
+                               out);
+                
+                responseType = checkFinalContentType(responseType);
+                LOG.fine("Response content type is: " + responseType.toString());
+                message.put(Message.CONTENT_TYPE, responseType.toString());
+                
+                
             } catch (IOException e) {
                 e.printStackTrace();
                 message.put(Message.RESPONSE_CODE, 500);
@@ -115,10 +166,12 @@
                                           responseObj.getClass().getSimpleName());
             }        
             
+        } else {
+            message.put(Message.RESPONSE_CODE, 204);
         }
-
     }
     
+    
     private void writeResponseErrorMessage(OutputStream out, String errorString, 
                                            String parameter) {
         try {
@@ -132,25 +185,30 @@
         }
     }
     
-    private List<MediaType> computeAvailableContentTypes(Message message) {
-        Exchange exchange = message.getExchange();
+    @SuppressWarnings("unchecked")
+    private List<MediaType> computeAvailableContentTypes(Message message, Response response) {
         
-        List<MediaType> methodMimeTypes = exchange.get(OperationResourceInfo.class).getProduceTypes();
-        String acceptContentTypes = (String)exchange.get(Message.ACCEPT_CONTENT_TYPE);
+        Object contentType = 
+            response.getMetadata().getFirst(HttpHeaders.CONTENT_TYPE);
+        Exchange exchange = message.getExchange();
+        List<MediaType> produceTypes = null;
+        if (contentType != null) {
+            produceTypes = Collections.singletonList(MediaType.valueOf(contentType.toString()));
+        } else {
+            produceTypes = exchange.get(OperationResourceInfo.class).getProduceTypes();
+        }
+        List<MediaType> acceptContentTypes = 
+            (List<MediaType>)exchange.get(Message.ACCEPT_CONTENT_TYPE);
         
-        List<MediaType> acceptValues = JAXRSUtils.parseMediaTypes(acceptContentTypes);
+        return JAXRSUtils.intersectMimeTypes(acceptContentTypes, produceTypes, true);
         
-        return JAXRSUtils.intersectMimeTypes(methodMimeTypes, acceptValues);        
     }
     
-    private MediaType computeFinalContentTypes(List<MediaType> produceContentTypes, 
-                                               MessageBodyWriter provider) {
-        List<MediaType> providerMimeTypes = 
-            JAXRSUtils.getProduceTypes(provider.getClass().getAnnotation(ProduceMime.class));
-                
-        List<MediaType> list = 
-            JAXRSUtils.intersectMimeTypes(produceContentTypes, providerMimeTypes);
-      
-        return list.get(0);      
+    private MediaType checkFinalContentType(MediaType mt) {
+        if (mt.isWildcardType() && mt.isWildcardSubtype()) {
+            return MediaType.APPLICATION_OCTET_STREAM_TYPE;
+        } else {
+            return mt;
+        }
     }
 }

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/Messages.properties
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/Messages.properties?rev=673167&r1=673166&r2=673167&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/Messages.properties (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/Messages.properties Tue Jul  1 11:41:24 2008
@@ -19,6 +19,7 @@
 #
 #
 NO_OP_EXC =.No operation matching request path {0} is found, ContentType : {1}, Accept : {2}.
+NO_ROOT_EXC =.No root resource matching request path {0} is found.
 SERIALIZE_ERROR =.Error serializing the response, please check the server logs, response class : {0}.
 NO_MSG_WRITER =.No message body writer found for response class : {0}.
 NO_MSG_READER =.No message body reader found for request class : {0}.

Added: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java?rev=673167&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java (added)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java Tue Jul  1 11:41:24 2008
@@ -0,0 +1,197 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. 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.
+ */
+
+package org.apache.cxf.jaxrs.model;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Resource;
+import javax.ws.rs.core.Context;
+
+import org.apache.cxf.jaxrs.impl.tl.ThreadLocalProxy;
+import org.apache.cxf.jaxrs.utils.AnnotationUtils;
+import org.apache.cxf.jaxrs.utils.InjectionUtils;
+
+public abstract class AbstractResourceInfo {
+    
+    private boolean root;
+    private Class<?> resourceClass;
+    private Class<?> serviceClass;
+    
+    private List<Field> contextFields;
+    private List<Field> resourceFields;
+    private Map<Class<?>, Method> contextMethods;
+    private Map<Field, ThreadLocalProxy> fieldProxyMap;
+    private Map<Field, ThreadLocalProxy> resourceProxyMap;
+    private Map<Method, ThreadLocalProxy> setterProxyMap;
+    
+    protected AbstractResourceInfo(Class<?> resourceClass, Class<?> serviceClass, boolean isRoot) {
+        this.serviceClass = serviceClass;
+        this.resourceClass = resourceClass;
+        root = isRoot;
+        if (root) {
+            initContextFields();
+            initContextSetterMethods();
+        }
+    }
+    
+    public Class<?> getServiceClass() {
+        return serviceClass;
+    }
+    
+    private void initContextFields() {
+        if (resourceClass == null || !root) {
+            return;
+        }
+        
+        
+        for (Field f : getServiceClass().getDeclaredFields()) {
+            for (Annotation a : f.getAnnotations()) {
+                if (a.annotationType() == Context.class) {
+                    if (contextFields == null) {
+                        contextFields = new ArrayList<Field>();
+                    }
+                    contextFields.add(f);
+                    if (fieldProxyMap == null) {
+                        fieldProxyMap = new HashMap<Field, ThreadLocalProxy>();
+                    }
+                    fieldProxyMap.put(f, InjectionUtils.createThreadLocalProxy(f.getType()));
+                } else if (a.annotationType() == Resource.class) {
+                    if (resourceFields == null) {
+                        resourceFields = new ArrayList<Field>();
+                    }
+                    resourceFields.add(f);
+                    if (resourceProxyMap == null) {
+                        resourceProxyMap = new HashMap<Field, ThreadLocalProxy>();
+                    }
+                    resourceProxyMap.put(f, InjectionUtils.createThreadLocalProxy(f.getType()));
+                }
+            }
+        }
+    }
+    
+    private void initContextSetterMethods() {
+        
+        for (Method m : getServiceClass().getMethods()) {
+        
+            if (!m.getName().startsWith("set") || m.getParameterTypes().length != 1) {
+                continue;
+            }
+            for (Annotation a : m.getAnnotations()) {
+                if (a.annotationType() == Context.class) {
+                    checkContextMethod(m);
+                    break;
+                }
+            }
+        }
+    }
+    
+    private void checkContextMethod(Method m) {
+        Class<?> type = m.getParameterTypes()[0];
+        if (AnnotationUtils.isContextClass(type)
+            && m.getName().equals("set" + type.getSimpleName())) {        
+            addContextMethod(type, m);
+        }
+    }
+    
+    @SuppressWarnings("unchecked")
+    public Map<Class<?>, Method> getContextMethods() {
+        return contextMethods == null ? Collections.EMPTY_MAP 
+                                      : Collections.unmodifiableMap(contextMethods);
+    }
+    
+    private void addContextMethod(Class<?> contextClass, Method m) {
+        if (contextMethods == null) {
+            contextMethods = new HashMap<Class<?>, Method>();
+        }
+        contextMethods.put(contextClass, m);
+        if (setterProxyMap == null) {
+            setterProxyMap = new HashMap<Method, ThreadLocalProxy>();
+        }
+        setterProxyMap.put(m, 
+             InjectionUtils.createThreadLocalProxy(m.getParameterTypes()[0]));
+    }
+    
+    public boolean isRoot() {
+        return root;
+    }
+    
+    public Class<?> getResourceClass() {
+        return resourceClass;
+    }
+    
+    public List<Field> getContextFields() {
+        return getList(contextFields);
+    }
+    
+    public List<Field> getResourceFields() {
+        return getList(resourceFields);
+    }
+    
+    private static List<Field> getList(List<Field> fields) {
+        List<Field> ret;
+        if (fields != null) {
+            ret = Collections.unmodifiableList(fields);
+        } else {
+            ret = Collections.emptyList();
+        }
+        return ret;
+    }
+    
+    @SuppressWarnings("unchecked")
+    public ThreadLocalProxy getContextFieldProxy(Field f) {
+        return fieldProxyMap == null ? null
+               : fieldProxyMap.get(f);
+    }
+    
+    @SuppressWarnings("unchecked")
+    public ThreadLocalProxy getResourceFieldProxy(Field f) {
+        return resourceProxyMap == null ? null
+               : resourceProxyMap.get(f);
+    }
+    
+    @SuppressWarnings("unchecked")
+    public ThreadLocalProxy getContextSetterProxy(Method m) {
+        return setterProxyMap == null ? null : setterProxyMap.get(m);
+    }
+    
+    public abstract boolean isSingleton();
+    
+    public void clearThreadLocalProxies() {
+        clearProxies(fieldProxyMap);
+        clearProxies(resourceProxyMap);
+        clearProxies(setterProxyMap);
+    }
+    
+    private static void clearProxies(Map<?, ThreadLocalProxy> tlps) {
+        if (tlps == null) {
+            return;
+        }
+        for (ThreadLocalProxy tlp : tlps.values()) {
+            tlp.remove();
+        }
+    }
+}

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ClassResourceInfo.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ClassResourceInfo.java?rev=673167&r1=673166&r2=673167&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ClassResourceInfo.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ClassResourceInfo.java Tue Jul  1 11:41:24 2008
@@ -19,32 +19,32 @@
 
 package org.apache.cxf.jaxrs.model;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
+import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
-import javax.annotation.Resource;
 import javax.ws.rs.ConsumeMime;
+import javax.ws.rs.Encoded;
 import javax.ws.rs.Path;
 import javax.ws.rs.ProduceMime;
-import javax.ws.rs.core.Context;
 
-import org.apache.cxf.jaxrs.JAXRSUtils;
 import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
+import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
+import org.apache.cxf.jaxrs.utils.AnnotationUtils;
 
-public class ClassResourceInfo {
+public class ClassResourceInfo extends AbstractResourceInfo {
     
-    private boolean root;
-    private Class<?> resourceClass;
-    private Class<?> serviceClass;
     private URITemplate uriTemplate;
     private MethodDispatcher methodDispatcher;
     private ResourceProvider resourceProvider;
     private List<ClassResourceInfo> subClassResourceInfo = new ArrayList<ClassResourceInfo>();
-    private List<Field> httpContexts;
-    private List<Field> resources;
-
+   
+    private List<Field> paramFields;
+    private List<Method> paramMethods;
+    
     public ClassResourceInfo(Class<?> theResourceClass) {
         this(theResourceClass, false);
     }
@@ -58,23 +58,45 @@
     }
     
     public ClassResourceInfo(Class<?> theResourceClass, Class<?> theServiceClass, boolean theRoot) {
-        resourceClass = theResourceClass;
-        serviceClass = theServiceClass;
-        root = theRoot;
-        initHttpContexts();
-        initResources();
-    }
-
-    public boolean isRoot() {
-        return root;
+        super(theResourceClass, theServiceClass, theRoot);
+        if (theRoot) {
+            initParamFields();
+            initParamMethods();
+        }
     }
     
-    public Class<?> getResourceClass() {
-        return resourceClass;
+    private void initParamFields() {
+        if (getResourceClass() == null || !isRoot()) {
+            return;
+        }
+        
+        
+        for (Field f : getServiceClass().getDeclaredFields()) {
+            for (Annotation a : f.getAnnotations()) {
+                if (AnnotationUtils.isParamAnnotationClass(a.annotationType())) {
+                    if (paramFields == null) {
+                        paramFields = new ArrayList<Field>();
+                    }
+                    paramFields.add(f);
+                }
+            }
+        }
     }
     
-    public Class<?> getServiceClass() {
-        return serviceClass;
+    private void initParamMethods() {
+        
+        for (Method m : getServiceClass().getMethods()) {
+        
+            if (!m.getName().startsWith("set") || m.getParameterTypes().length != 1) {
+                continue;
+            }
+            for (Annotation a : m.getAnnotations()) {
+                if (AnnotationUtils.isParamAnnotationClass(a.annotationType())) {
+                    checkParamMethod(m, AnnotationUtils.getAnnotationValue(a));
+                    break;
+                }
+            }
+        }
     }
 
     public URITemplate getURITemplate() {
@@ -113,67 +135,50 @@
         resourceProvider = rp;
     }
     
-    private void initHttpContexts() {
-        if (resourceClass == null || !root) {
-            return;
-        }
-        httpContexts = new ArrayList<Field>();
-        Field[] fields = getServiceClass().getDeclaredFields();
-        
-        for (Field f : fields) {
-            Context context = f.getAnnotation(Context.class);
-            if (context != null) {
-                httpContexts.add(f);               
-            }
-        }
-    }
-
-    private void initResources() {
-        if (resourceClass == null || !root) {
-            return;
-        }
-        resources = new ArrayList<Field>();
-        Field[] fields = getServiceClass().getDeclaredFields();
-        
-        for (Field f : fields) {
-            Resource resource = f.getAnnotation(Resource.class);
-            if (resource != null) {
-                resources.add(f);               
-            }
-        }
-    }
-
     public ProduceMime getProduceMime() {
-        return (ProduceMime)JAXRSUtils.getClassAnnotation(getServiceClass(), ProduceMime.class);
+        return (ProduceMime)AnnotationUtils.getClassAnnotation(getServiceClass(), ProduceMime.class);
     }
     
     public ConsumeMime getConsumeMime() {
-        return (ConsumeMime)JAXRSUtils.getClassAnnotation(getServiceClass(), ConsumeMime.class);
+        return (ConsumeMime)AnnotationUtils.getClassAnnotation(getServiceClass(), ConsumeMime.class);
+    }
+    
+    public boolean isEncodedEnabled() {
+        return AnnotationUtils.getClassAnnotation(getServiceClass(), 
+                                                  Encoded.class) != null;
     }
     
     public Path getPath() {
-        return (Path)JAXRSUtils.getClassAnnotation(getServiceClass(), Path.class);
+        return (Path)AnnotationUtils.getClassAnnotation(getServiceClass(), Path.class);
     }
     
-    public List<Field> getHttpContexts() {
-        List<Field> ret;
-        if (httpContexts != null) {
-            ret = Collections.unmodifiableList(httpContexts);
-        } else {
-            ret = Collections.emptyList();
+    private void addParamMethod(Method m) {
+        if (paramMethods == null) {
+            paramMethods = new ArrayList<Method>();
         }
-        return ret;
+        paramMethods.add(m);
     }
     
-    public List<Field> getResources() {
-        List<Field> ret;
-        if (resources != null) {
-            ret = Collections.unmodifiableList(resources);
-        } else {
-            ret = Collections.emptyList();
-        }
-        return ret;
+    @SuppressWarnings("unchecked")
+    public List<Method> getParameterMethods() {
+        return paramMethods == null ? Collections.EMPTY_LIST 
+                                    : Collections.unmodifiableList(paramMethods);
     }
     
+    @SuppressWarnings("unchecked")
+    public List<Field> getParameterFields() {
+        return paramFields == null ? Collections.EMPTY_LIST 
+                                    : Collections.unmodifiableList(paramFields);
+    }
     
+    private void checkParamMethod(Method m, String value) {
+        if (m.getName().equalsIgnoreCase("set" + value)) {
+            addParamMethod(m);
+        }
+    }
+    
+    @Override
+    public boolean isSingleton() {
+        return resourceProvider instanceof SingletonResourceProvider;
+    }
 }

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/OperationResourceInfo.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/OperationResourceInfo.java?rev=673167&r1=673166&r2=673167&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/OperationResourceInfo.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/OperationResourceInfo.java Tue Jul  1 11:41:24 2008
@@ -26,18 +26,23 @@
 import javax.ws.rs.ProduceMime;
 import javax.ws.rs.core.MediaType;
 
-import org.apache.cxf.jaxrs.JAXRSUtils;
+import org.apache.cxf.jaxrs.utils.AnnotationUtils;
+import org.apache.cxf.jaxrs.utils.JAXRSUtils;
 
 public class OperationResourceInfo {
     private URITemplate uriTemplate;
     private ClassResourceInfo classResourceInfo;
-    private Method method;
+    private Method methodToInvoke;
+    private Method annotatedMethod;
     private String httpMethod;
-   
+    private List<MediaType> produceMimes;
+    private List<MediaType> consumeMimes;
 
     public OperationResourceInfo(Method m, ClassResourceInfo cri) {
-        method = m;
+        methodToInvoke = m;
+        annotatedMethod = m;
         classResourceInfo = cri;
+        checkMediaTypes();
     }
 
     public URITemplate getURITemplate() {
@@ -56,12 +61,12 @@
         classResourceInfo = c;
     }
 
-    public Method getMethod() {
-        return method;
+    public Method getMethodToInvoke() {
+        return methodToInvoke;
     }
 
-    public void setMethod(Method m) {
-        method = m;
+    public void setMethodToInvoke(Method m) {
+        methodToInvoke = m;
     }
 
     public String getHttpMethod() {
@@ -72,6 +77,15 @@
         httpMethod = m;
     }
     
+    public void setAnnotatedMethod(Method m) {
+        annotatedMethod = m;
+        checkMediaTypes();
+    }
+    
+    public Method getAnnotatedMethod() {
+        return annotatedMethod;
+    }
+    
     public boolean isSubResourceLocator() {
         return httpMethod == null ? true : false;
     }
@@ -79,25 +93,31 @@
     
     public List<MediaType> getProduceTypes() {
         
-        // this needs to be calculated on init
-        ProduceMime pm = 
-            (ProduceMime)JAXRSUtils.getMethodAnnotation(method, ProduceMime.class);
-        if (pm != null) {
-            return JAXRSUtils.getMediaTypes(pm.value());
-        }
-        
-        return JAXRSUtils.getProduceTypes(classResourceInfo.getProduceMime());
+        return produceMimes;
     }
     
     public List<MediaType> getConsumeTypes() {
         
-        // this needs to be calculated on init
-        ConsumeMime pm = 
-            (ConsumeMime)JAXRSUtils.getMethodAnnotation(method, ConsumeMime.class);
-        if (pm != null) {
-            return JAXRSUtils.getMediaTypes(pm.value());
+        return consumeMimes;
+    }
+    
+    private void checkMediaTypes() {
+        ConsumeMime cm = 
+            (ConsumeMime)AnnotationUtils.getMethodAnnotation(annotatedMethod, ConsumeMime.class);
+        if (cm != null) {
+            consumeMimes = JAXRSUtils.sortMediaTypes(JAXRSUtils.getMediaTypes(cm.value()));
+        } else if (classResourceInfo != null) {
+            consumeMimes = JAXRSUtils.sortMediaTypes(
+                               JAXRSUtils.getConsumeTypes(classResourceInfo.getConsumeMime()));
         }
         
-        return JAXRSUtils.getConsumeTypes(classResourceInfo.getConsumeMime());
+        ProduceMime pm = 
+            (ProduceMime)AnnotationUtils.getMethodAnnotation(annotatedMethod, ProduceMime.class);
+        if (pm != null) {
+            produceMimes = JAXRSUtils.sortMediaTypes(JAXRSUtils.getMediaTypes(pm.value()));
+        } else if (classResourceInfo != null) {
+            produceMimes = JAXRSUtils.sortMediaTypes(
+                               JAXRSUtils.getProduceTypes(classResourceInfo.getProduceMime()));
+        }
     }
 }

Added: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/OperationResourceInfoComparator.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/OperationResourceInfoComparator.java?rev=673167&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/OperationResourceInfoComparator.java (added)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/OperationResourceInfoComparator.java Tue Jul  1 11:41:24 2008
@@ -0,0 +1,72 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. 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.
+ */
+
+package org.apache.cxf.jaxrs.model;
+
+import java.util.Comparator;
+import java.util.List;
+
+import javax.ws.rs.core.MediaType;
+
+import org.apache.cxf.jaxrs.utils.JAXRSUtils;
+
+public class OperationResourceInfoComparator implements Comparator<OperationResourceInfo> {
+    
+    public int compare(OperationResourceInfo e1, OperationResourceInfo e2) {
+        
+        if (e1.getHttpMethod() != null && e2.getHttpMethod() == null
+            || e1.getHttpMethod() == null && e2.getHttpMethod() != null) {
+            // subresource method takes precedence over a subresource locator
+            return e1.getHttpMethod() != null ? -1 : 1;
+        }
+        
+        if (e1.getHttpMethod() == null && e2.getHttpMethod() == null) {
+            // with two subresource locators, those with more capturing groups win
+            int g1 = e1.getURITemplate().getNumberOfGroups();
+            int g2 = e2.getURITemplate().getNumberOfGroups();
+            // descending order 
+            return g1 < g2 ? 1 : g1 > g2 ? -1 : 0;
+        }
+        
+        List<MediaType> mimeType1 = e1.getConsumeTypes();
+        List<MediaType> mimeType2 = e2.getConsumeTypes();
+        
+        // TODO: we actually need to check all consume and produce types here ?
+        int result = JAXRSUtils.compareMediaTypes(mimeType1.get(0), 
+                                                  mimeType2.get(0));
+        if (result == 0) {
+            //use the media type of output data as the secondary key.
+            List<MediaType> mimeTypeP1 = e1.getProduceTypes();
+            List<MediaType> mimeTypeP2 = e2.getProduceTypes();
+            result =  JAXRSUtils.compareMediaTypes(mimeTypeP1.get(0), 
+                                                mimeTypeP2.get(0));
+        }
+        
+        if (result == 0 && e1.getHttpMethod() != null && e2.getHttpMethod() != null) {
+            // we're comparing two resource methods with matching http methods and produce/consume types
+            int g1 = e1.getURITemplate().getNumberOfGroups();
+            int g2 = e2.getURITemplate().getNumberOfGroups();
+            // ascending order 
+            return g1 < g2 ? -1 : g1 > g2 ? 1 : 0;  
+        }
+
+        return result;
+    }
+
+}

Added: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ProviderInfo.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ProviderInfo.java?rev=673167&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ProviderInfo.java (added)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ProviderInfo.java Tue Jul  1 11:41:24 2008
@@ -0,0 +1,39 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. 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.
+ */
+
+package org.apache.cxf.jaxrs.model;
+
+public class ProviderInfo<T> extends AbstractResourceInfo {
+
+    private T provider;
+    
+    public ProviderInfo(T provider) {
+        super(provider.getClass(), provider.getClass(), true);
+        this.provider = provider;
+    }
+    
+    @Override
+    public boolean isSingleton() {
+        return true;
+    }
+
+    public T getProvider() {
+        return provider;
+    }
+}

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ProviderInfo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ProviderInfo.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java?rev=673167&r1=673166&r2=673167&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/URITemplate.java Tue Jul  1 11:41:24 2008
@@ -51,9 +51,7 @@
 
     private final String template;
     private final String regexSuffix;
-    private final boolean endsWithSlash;
     private final List<String> templateVariables;
-    private final String templateRegex;
     private final Pattern templateRegexPattern;
 
     public URITemplate(String theTemplate) {
@@ -81,7 +79,7 @@
         templateVariables = Collections.unmodifiableList(names);
 
         int endPos = stringBuilder.length() - 1;
-        this.endsWithSlash = (endPos >= 0) ? stringBuilder.charAt(endPos) == '/' : false;
+        boolean endsWithSlash = (endPos >= 0) ? stringBuilder.charAt(endPos) == '/' : false;
         if (regexSuffix != null) {
             if (endsWithSlash) {
                 stringBuilder.deleteCharAt(endPos);
@@ -89,15 +87,17 @@
             stringBuilder.append(regexSuffix);
         }
 
-        templateRegex = stringBuilder.toString();
-        //System.out.println("----" + theTemplate + ": " + templateRegex);
-        templateRegexPattern = Pattern.compile(templateRegex);
+        templateRegexPattern = Pattern.compile(stringBuilder.toString());
     }
 
     public String getValue() {
         return template;
     }
     
+    public int getNumberOfGroups() {
+        return templateVariables.size();
+    }
+    
     private void copyURITemplateCharacters(String templateValue, int start, int end, StringBuilder b) {
         for (int i = start; i < end; i++) {
             char c = templateValue.charAt(i);
@@ -144,7 +144,7 @@
                                              Path path) {
         
         if (path == null) {
-            return new URITemplate("/", URITemplate.UNLIMITED_REGEX_SUFFIX);
+            return new URITemplate("/", URITemplate.LIMITED_REGEX_SUFFIX);
         }
         
         String pathValue = path.value();

Added: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java?rev=673167&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java (added)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java Tue Jul  1 11:41:24 2008
@@ -0,0 +1,182 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. 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.
+ */
+
+package org.apache.cxf.jaxrs.provider;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.util.Map;
+import java.util.WeakHashMap;
+import java.util.logging.Logger;
+
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.ext.ContextResolver;
+import javax.ws.rs.ext.MessageBodyReader;
+import javax.ws.rs.ext.MessageBodyWriter;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.common.util.PackageUtils;
+import org.apache.cxf.jaxrs.utils.AnnotationUtils;
+import org.apache.cxf.jaxrs.utils.InjectionUtils;
+
+public abstract class AbstractJAXBProvider 
+    implements MessageBodyReader<Object>, MessageBodyWriter<Object> {
+    
+    private static final Logger LOG = LogUtils.getL7dLogger(AbstractJAXBProvider.class);
+
+    private static final String CHARSET_PARAMETER = "charset"; 
+
+    private static Map<String, JAXBContext> packageContexts = new WeakHashMap<String, JAXBContext>();
+    private static Map<Class<?>, JAXBContext> classContexts = new WeakHashMap<Class<?>, JAXBContext>();
+    
+    @Context protected ContextResolver<JAXBContext> resolver;
+    
+    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] anns) {
+        return isSupported(type, genericType, anns)
+               || AnnotationUtils.getAnnotation(anns, XmlJavaTypeAdapter.class) != null;
+    }
+    
+    public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations) {
+        return isSupported(type, genericType, annotations);
+    }
+
+    public long getSize(Object o) {
+        return -1;
+    }
+
+    protected JAXBContext getJAXBContext(Class<?> type, Type genericType) throws JAXBException {
+        
+        if (resolver != null) {
+            JAXBContext context = resolver.getContext(type);
+            // it's up to the resolver to keep its contexts in a map
+            if (context != null) {
+                return context;
+            }
+        }
+        JAXBContext context = getPackageContext(type);
+        if (context == null && type != genericType) {
+            context = getPackageContext(InjectionUtils.getActualType(genericType));
+        }
+        
+        return context != null ? context : getClassContext(type);
+    }
+    
+    private JAXBContext getClassContext(Class<?> type) throws JAXBException {
+        synchronized (classContexts) {
+            JAXBContext context = classContexts.get(type);
+            if (context == null) {
+                context = JAXBContext.newInstance(type);
+                classContexts.put(type, context);
+            }
+            return context;
+        }
+    }
+    
+    private JAXBContext getPackageContext(Class<?> type) {
+        if (type == null) {
+            return null;
+        }
+        synchronized (packageContexts) {
+            String packageName = PackageUtils.getPackageName(type);
+            JAXBContext context = packageContexts.get(packageName);
+            if (context == null) {
+                try {
+                    context = JAXBContext.newInstance(packageName, type.getClassLoader());
+                    packageContexts.put(packageName, context);
+                    return context;
+                } catch (JAXBException ex) {
+                    LOG.warning("Error creating a JAXBContext using ObjectFactory : " 
+                                + ex.getMessage());
+                    return null;
+                }
+            }
+        }
+        return null;
+    }
+    
+    protected boolean isSupported(Class<?> type, Type genericType, Annotation[] annotations) {
+        
+        return type.getAnnotation(XmlRootElement.class) != null
+            || JAXBElement.class.isAssignableFrom(type)
+            || objectFactoryForClass(type)
+            || (type != genericType && objectFactoryForType(genericType));
+    
+    }
+    
+    private boolean objectFactoryForClass(Class<?> type) {
+        try {
+            return type.getClassLoader().loadClass(PackageUtils.getPackageName(type) 
+                                        + ".ObjectFactory") != null;
+        } catch (Exception ex) {
+            return false;
+        }
+    }
+    
+    private boolean objectFactoryForType(Type genericType) {
+        return objectFactoryForClass(InjectionUtils.getActualType(genericType));
+    }
+    
+    protected Marshaller createMarshaller(Object obj, Class<?> cls, Type genericType, MediaType m)
+        throws JAXBException {
+        
+        Class<?> objClazz = JAXBElement.class.isAssignableFrom(cls) 
+                            ? ((JAXBElement)obj).getDeclaredType() : cls;
+        JAXBContext context = getJAXBContext(objClazz, genericType);
+        Marshaller marshaller = context.createMarshaller();
+        String enc = m.getParameters().get(CHARSET_PARAMETER);
+        if (enc != null) {
+            marshaller.setProperty(Marshaller.JAXB_ENCODING, enc);
+        }
+        return marshaller;
+    }
+    
+    protected Class<?> getActualType(Class<?> type, Type genericType) {
+        Class<?> theType = null;
+        if (JAXBElement.class.isAssignableFrom(type)) {
+            theType = InjectionUtils.getActualType(genericType);
+        } else {
+            theType = type;
+        }
+        
+        return theType;
+    }
+    
+    @SuppressWarnings("unchecked")
+    protected Object checkAdapter(Object obj, Annotation[] anns) {
+        XmlJavaTypeAdapter typeAdapter = AnnotationUtils.getAnnotation(anns, XmlJavaTypeAdapter.class);
+        if (typeAdapter != null) {
+            try {
+                XmlAdapter xmlAdapter = typeAdapter.value().newInstance();
+                return xmlAdapter.marshal(obj);
+            } catch (Exception ex) {
+                LOG.warning("Problem using the XmlJavaTypeAdapter");
+                ex.printStackTrace();
+            }
+        }
+        return obj;
+    }
+}

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AtomEntryProvider.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AtomEntryProvider.java?rev=673167&r1=673166&r2=673167&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AtomEntryProvider.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AtomEntryProvider.java Tue Jul  1 11:41:24 2008
@@ -22,6 +22,8 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
 
 import javax.ws.rs.ConsumeMime;
 import javax.ws.rs.ProduceMime;
@@ -45,23 +47,16 @@
     private static final Abdera ATOM_ENGINE = new Abdera();
     private static final String JSON_TYPE = "application/json";
     
-    public Entry readFrom(Class<Entry> clazz, MediaType mt, 
-                          MultivaluedMap <String, String> headers, InputStream is)
-        throws IOException {
-        Document<Entry> doc = ATOM_ENGINE.getParser().parse(is);
-        return doc.getRoot();
+    public long getSize(Entry feed) {
+        return -1;
     }
 
-    public boolean isReadable(Class<?> type) {
-        return Entry.class.isAssignableFrom(type);
-    }
-    
-    public boolean isWriteable(Class<?> type) {
+    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations) {
         return Entry.class.isAssignableFrom(type);
     }
 
-    public void writeTo(Entry entry, MediaType mt, 
-                        MultivaluedMap<String, Object> headers, OutputStream os)
+    public void writeTo(Entry entry, Class<?> clazz, Type type, Annotation[] a, 
+                        MediaType mt, MultivaluedMap<String, Object> headers, OutputStream os) 
         throws IOException {
         if (JSON_TYPE.equals(mt.toString())) {
             Writer w = ATOM_ENGINE.getWriterFactory().getWriter("json");
@@ -69,9 +64,17 @@
         } else {
             entry.writeTo(os);
         }
+        
     }
- 
-    public long getSize(Entry entry) {
-        return -1;
+
+    public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations) {
+        return Entry.class.isAssignableFrom(type);
+    }
+
+    public Entry readFrom(Class<Entry> clazz, Type t, Annotation[] a, MediaType mt, 
+                          MultivaluedMap<String, String> headers, InputStream is) 
+        throws IOException {
+        Document<Entry> doc = ATOM_ENGINE.getParser().parse(is);
+        return doc.getRoot();
     }
 }