Return-Path: X-Original-To: apmail-cxf-commits-archive@www.apache.org Delivered-To: apmail-cxf-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 2A0AED446 for ; Fri, 7 Sep 2012 16:34:48 +0000 (UTC) Received: (qmail 79292 invoked by uid 500); 7 Sep 2012 16:34:48 -0000 Delivered-To: apmail-cxf-commits-archive@cxf.apache.org Received: (qmail 79253 invoked by uid 500); 7 Sep 2012 16:34:48 -0000 Mailing-List: contact commits-help@cxf.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cxf.apache.org Delivered-To: mailing list commits@cxf.apache.org Received: (qmail 79246 invoked by uid 99); 7 Sep 2012 16:34:48 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 07 Sep 2012 16:34:47 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 07 Sep 2012 16:34:42 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 85ACF2388980; Fri, 7 Sep 2012 16:33:57 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1382087 - in /cxf/trunk: rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/ rt/frontend/jaxrs/src/main/java/org... Date: Fri, 07 Sep 2012 16:33:56 -0000 To: commits@cxf.apache.org From: sergeyb@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20120907163357.85ACF2388980@eris.apache.org> Author: sergeyb Date: Fri Sep 7 16:33:56 2012 New Revision: 1382087 URL: http://svn.apache.org/viewvc?rev=1382087&view=rev Log: [CXF-4455] Initial support for new request filters Added: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ContainerRequestContextImpl.java (with props) cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ContainerResponseContextImpl.java (with props) cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer20.java (with props) cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java (with props) Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/MetadataMap.java cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java?rev=1382087&r1=1382086&r2=1382087&view=diff ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java (original) +++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java Fri Sep 7 16:33:56 2012 @@ -231,7 +231,13 @@ public class JAXRSInvoker extends Abstra contentType, acceptContentType, true); - + + if (!ori.getNameBindings().isEmpty() + && JAXRSUtils.runContainerFilters(ProviderFactory.getInstance(exchange.getInMessage()), + exchange.getInMessage(), + false, ori.getNameBindings())) { + return new MessageContentsList(exchange.get(Response.class)); + } exchange.put(OperationResourceInfo.class, subOri); msg.put(URITemplate.TEMPLATE_PARAMETERS, values); Added: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ContainerRequestContextImpl.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ContainerRequestContextImpl.java?rev=1382087&view=auto ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ContainerRequestContextImpl.java (added) +++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ContainerRequestContextImpl.java Fri Sep 7 16:33:56 2012 @@ -0,0 +1,220 @@ +/** + * 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; + +import java.io.InputStream; +import java.net.URI; +import java.util.Date; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.core.Cookie; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.core.Request; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.SecurityContext; +import javax.ws.rs.core.UriInfo; + +import org.apache.cxf.helpers.CastUtils; +import org.apache.cxf.message.Message; + +public class ContainerRequestContextImpl implements ContainerRequestContext { + + private static final String PROPERTY_KEY = "jaxrs.filter.properties"; + private static final String ENDPOINT_ADDRESS_PROPERTY = "org.apache.cxf.transport.endpoint.address"; + + private HttpHeaders h; + private Message m; + private Map props; + private boolean preMatch; + public ContainerRequestContextImpl(Message message, boolean preMatch) { + this.m = message; + this.props = CastUtils.cast((Map)message.get(PROPERTY_KEY)); + this.h = new HttpHeadersImpl(message); + this.preMatch = preMatch; + } + + @Override + public void abortWith(Response response) { + m.getExchange().put(Response.class, response); + } + + @Override + public List getAcceptableLanguages() { + return getHttpHeaders().getAcceptableLanguages(); + } + + @Override + public List getAcceptableMediaTypes() { + return getHttpHeaders().getAcceptableMediaTypes(); + } + + @Override + public Map getCookies() { + return getHttpHeaders().getCookies(); + } + + @Override + public Date getDate() { + return getHttpHeaders().getDate(); + } + + @Override + public InputStream getEntityStream() { + return m.get(InputStream.class); + } + + @Override + public String getHeaderString(String name) { + return getHttpHeaders().getHeaderString(name); + } + + @SuppressWarnings("unchecked") + @Override + public MultivaluedMap getHeaders() { + h = null; + return new MetadataMap( + (Map>)m.get(Message.PROTOCOL_HEADERS), false, true, true); + } + + @Override + public Locale getLanguage() { + return getHttpHeaders().getLanguage(); + } + + @Override + public int getLength() { + return getHttpHeaders().getLength(); + } + + @Override + public MediaType getMediaType() { + return getHttpHeaders().getMediaType(); + } + + @Override + public String getMethod() { + return (String)getProperty(Message.HTTP_REQUEST_METHOD); + } + + @Override + public Object getProperty(String name) { + return props == null ? null : props.get(name); + } + + @Override + public Enumeration getPropertyNames() { + final Iterator it = props.keySet().iterator(); + return new Enumeration() { + + @Override + public boolean hasMoreElements() { + return it.hasNext(); + } + + @Override + public String nextElement() { + return it.next(); + } + + }; + } + + @Override + public Request getRequest() { + return new RequestImpl(m); + } + + @Override + public SecurityContext getSecurityContext() { + return new SecurityContextImpl(m); + } + + @Override + public UriInfo getUriInfo() { + return new UriInfoImpl(m); + } + + @Override + public boolean hasEntity() { + return getEntityStream() != null; + } + + @Override + public void removeProperty(String name) { + if (props != null) { + props.remove(name); + } + } + + @Override + public void setEntityStream(InputStream is) { + m.put(InputStream.class, is); + } + + @Override + public void setMethod(String method) throws IllegalStateException { + m.put(Message.HTTP_REQUEST_METHOD, method); + + } + + @Override + public void setProperty(String name, Object value) { + if (props == null) { + props = new HashMap(); + m.put(PROPERTY_KEY, props); + } + props.put(name, value); + + } + + @Override + public void setRequestUri(URI requestUri) throws IllegalStateException { + if (!preMatch) { + throw new IllegalStateException(); + } + m.put(Message.REQUEST_URI, requestUri.toString()); + } + + @Override + public void setRequestUri(URI baseUri, URI requestUri) throws IllegalStateException { + setRequestUri(requestUri); + Object servletRequest = m.get("HTTP.REQUEST"); + if (servletRequest != null) { + ((javax.servlet.http.HttpServletRequest)servletRequest) + .setAttribute(ENDPOINT_ADDRESS_PROPERTY, baseUri.toString()); + } + } + + @Override + public void setSecurityContext(SecurityContext sc) { + m.put(SecurityContext.class, sc); + } + + private HttpHeaders getHttpHeaders() { + return h != null ? h : new HttpHeadersImpl(m); + } +} Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ContainerRequestContextImpl.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ContainerRequestContextImpl.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ContainerResponseContextImpl.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ContainerResponseContextImpl.java?rev=1382087&view=auto ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ContainerResponseContextImpl.java (added) +++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ContainerResponseContextImpl.java Fri Sep 7 16:33:56 2012 @@ -0,0 +1,209 @@ +/** + * 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; + +import java.io.OutputStream; +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; +import java.net.URI; +import java.util.Date; +import java.util.Locale; +import java.util.Map; +import java.util.Set; + +import javax.ws.rs.container.ContainerResponseContext; +import javax.ws.rs.core.EntityTag; +import javax.ws.rs.core.Link; +import javax.ws.rs.core.Link.Builder; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.core.NewCookie; +import javax.ws.rs.core.Response.StatusType; + +public class ContainerResponseContextImpl implements ContainerResponseContext { + + @Override + public Set getAllowedMethods() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Map getCookies() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Date getDate() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Object getEntity() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Annotation[] getEntityAnnotations() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Class getEntityClass() { + // TODO Auto-generated method stub + return null; + } + + @Override + public OutputStream getEntityStream() { + // TODO Auto-generated method stub + return null; + } + + @Override + public EntityTag getEntityTag() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Type getEntityType() { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getHeaderString(String arg0) { + // TODO Auto-generated method stub + return null; + } + + @Override + public MultivaluedMap getHeaders() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Locale getLanguage() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Date getLastModified() { + // TODO Auto-generated method stub + return null; + } + + @Override + public int getLength() { + // TODO Auto-generated method stub + return 0; + } + + @Override + public Link getLink(String arg0) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Builder getLinkBuilder(String arg0) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Set getLinks() { + // TODO Auto-generated method stub + return null; + } + + @Override + public URI getLocation() { + // TODO Auto-generated method stub + return null; + } + + @Override + public MediaType getMediaType() { + // TODO Auto-generated method stub + return null; + } + + @Override + public int getStatus() { + // TODO Auto-generated method stub + return 0; + } + + @Override + public StatusType getStatusInfo() { + // TODO Auto-generated method stub + return null; + } + + @Override + public MultivaluedMap getStringHeaders() { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean hasEntity() { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean hasLink(String arg0) { + // TODO Auto-generated method stub + return false; + } + + @Override + public void setEntity(Object arg0, Annotation[] arg1, MediaType arg2) { + // TODO Auto-generated method stub + + } + + @Override + public void setEntityStream(OutputStream arg0) { + // TODO Auto-generated method stub + + } + + @Override + public void setStatus(int arg0) { + // TODO Auto-generated method stub + + } + + @Override + public void setStatusInfo(StatusType arg0) { + // TODO Auto-generated method stub + + } + +} Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ContainerResponseContextImpl.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ContainerResponseContextImpl.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/MetadataMap.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/MetadataMap.java?rev=1382087&r1=1382086&r2=1382087&view=diff ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/MetadataMap.java (original) +++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/MetadataMap.java Fri Sep 7 16:33:56 2012 @@ -55,19 +55,30 @@ public class MetadataMap implement public MetadataMap(Map> store, boolean readOnly, boolean caseInsensitive) { - this.caseInsensitive = caseInsensitive; + this (store, true, readOnly, caseInsensitive); + + } + // TODO: Review the use of this constructor, + // refactor the code, copyStore and readOnly are duplicates + public MetadataMap(Map> store, boolean copyStore, + boolean readOnly, boolean caseInsensitive) { - this.m = new LinkedHashMap>(); - if (store != null) { - for (Map.Entry> entry : store.entrySet()) { - List values = new ArrayList(entry.getValue()); - m.put(entry.getKey(), readOnly - ? Collections.unmodifiableList(values) : values); + if (copyStore) { + this.m = new LinkedHashMap>(); + if (store != null) { + for (Map.Entry> entry : store.entrySet()) { + List values = new ArrayList(entry.getValue()); + m.put(entry.getKey(), readOnly + ? Collections.unmodifiableList(values) : values); + } } + if (readOnly) { + this.m = Collections.unmodifiableMap(m); + } + } else { + this.m = store; } - if (readOnly) { - this.m = Collections.unmodifiableMap(m); - } + this.caseInsensitive = caseInsensitive; } 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=1382087&r1=1382086&r2=1382087&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 Fri Sep 7 16:33:56 2012 @@ -85,6 +85,11 @@ public class JAXRSInInterceptor extends public void handleMessage(Message message) { + if (message.getExchange().get(OperationResourceInfo.class) != null) { + // it's a suspended invocation; + return; + } + try { processRequest(message); } catch (RuntimeException ex) { @@ -103,12 +108,9 @@ public class JAXRSInInterceptor extends private void processRequest(Message message) { - if (message.getExchange().get(OperationResourceInfo.class) != null) { - // it's a suspended invocation; - return; - } + ProviderFactory providerFactory = ProviderFactory.getInstance(message); - RequestPreprocessor rp = ProviderFactory.getInstance(message).getRequestPreprocessor(); + RequestPreprocessor rp = providerFactory.getRequestPreprocessor(); if (rp != null) { rp.preprocess(message, new UriInfoImpl(message, null)); if (message.getExchange().get(Response.class) != null) { @@ -116,6 +118,10 @@ public class JAXRSInInterceptor extends } } + if (JAXRSUtils.runContainerFilters(providerFactory, message, true, null)) { + return; + } + String requestContentType = (String)message.get(Message.CONTENT_TYPE); if (requestContentType == null) { requestContentType = "*/*"; @@ -157,13 +163,17 @@ public class JAXRSInInterceptor extends throw new WebApplicationException(resp); } + if (JAXRSUtils.runContainerFilters(providerFactory, message, false, null)) { + return; + } + message.getExchange().put(JAXRSUtils.ROOT_RESOURCE_CLASS, resource); String httpMethod = HttpUtils.getProtocolHeader(message, Message.HTTP_REQUEST_METHOD, "POST"); OperationResourceInfo ori = null; boolean operChecked = false; - List> shs = ProviderFactory.getInstance(message).getRequestHandlers(); + List> shs = providerFactory.getRequestHandlers(); for (ProviderInfo sh : shs) { if (ori == null && !operChecked) { try { @@ -201,6 +211,11 @@ public class JAXRSInInterceptor extends } } + if (!ori.getNameBindings().isEmpty() + && JAXRSUtils.runContainerFilters(providerFactory, message, false, ori.getNameBindings())) { + return; + } + if (LOG.isLoggable(Level.FINE)) { LOG.fine("Request path is: " + rawPath); LOG.fine("Request HTTP method is: " + httpMethod); @@ -209,8 +224,9 @@ public class JAXRSInInterceptor extends LOG.fine("Found operation: " + ori.getMethodToInvoke().getName()); } - setExchangeProperties(message, ori, values, resources.size()); - + + setExchangeProperties(message, ori, values, resources.size()); + //Process parameters try { List params = JAXRSUtils.processParameters(ori, values, message); Modified: 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=1382087&r1=1382086&r2=1382087&view=diff ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java (original) +++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java Fri Sep 7 16:33:56 2012 @@ -50,7 +50,7 @@ public abstract class AbstractResourceIn private Map, List> contextFields; private Map, Map, Method>> contextMethods; private Bus bus; - private boolean contextsAvailable = true; + private boolean contextsAvailable; protected AbstractResourceInfo(Bus bus) { this.bus = bus; Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java?rev=1382087&r1=1382086&r2=1382087&view=diff ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java (original) +++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java Fri Sep 7 16:33:56 2012 @@ -62,6 +62,8 @@ import javax.ws.rs.RedirectionException; import javax.ws.rs.ServerErrorException; import javax.ws.rs.ServiceUnavailableException; import javax.ws.rs.WebApplicationException; +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerRequestFilter; import javax.ws.rs.core.Application; import javax.ws.rs.core.Cookie; import javax.ws.rs.core.HttpHeaders; @@ -91,6 +93,7 @@ import org.apache.cxf.jaxrs.ext.MessageC import org.apache.cxf.jaxrs.ext.ProtocolHeaders; import org.apache.cxf.jaxrs.ext.ProtocolHeadersImpl; import org.apache.cxf.jaxrs.ext.multipart.MultipartBody; +import org.apache.cxf.jaxrs.impl.ContainerRequestContextImpl; import org.apache.cxf.jaxrs.impl.HttpHeadersImpl; import org.apache.cxf.jaxrs.impl.HttpServletResponseFilter; import org.apache.cxf.jaxrs.impl.MetadataMap; @@ -1333,4 +1336,23 @@ public final class JAXRSUtils { return XMLUtils.convertStringToQName(name, ""); } + public static boolean runContainerFilters(ProviderFactory pf, Message m, boolean preMatch, + List names) { + List> containerFilters = names == null + ? pf.getGlobalContainerRequestFilters(preMatch) : pf.getBoundContainerRequestFilters(names); + if (!containerFilters.isEmpty()) { + ContainerRequestContext context = new ContainerRequestContextImpl(m, true); + for (ProviderInfo filter : containerFilters) { + try { + filter.getProvider().filter(context); + } catch (IOException ex) { + throw new WebApplicationException(ex); + } + if (m.getExchange().get(Response.class) != null) { + return true; + } + } + } + return false; + } } Added: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer20.java URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer20.java?rev=1382087&view=auto ============================================================================== --- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer20.java (added) +++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer20.java Fri Sep 7 16:33:56 2012 @@ -0,0 +1,85 @@ +/** + * 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.systest.jaxrs; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerRequestFilter; + +import org.apache.cxf.Bus; +import org.apache.cxf.BusFactory; +import org.apache.cxf.jaxrs.JAXRSServerFactoryBean; +import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider; +import org.apache.cxf.testutil.common.AbstractBusTestServerBase; + +public class BookServer20 extends AbstractBusTestServerBase { + public static final String PORT = allocatePort(BookServer20.class); + + org.apache.cxf.endpoint.Server server; + + protected void run() { + Bus bus = BusFactory.getDefaultBus(); + setBus(bus); + JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean(); + sf.setBus(bus); + sf.setResourceClasses(BookStore.class); + + List providers = new ArrayList(); + + providers.add(new PreMatchContainerRequestFilter()); + sf.setProviders(providers); + sf.setResourceProvider(BookStore.class, + new SingletonResourceProvider(new BookStore(), true)); + sf.setAddress("http://localhost:" + PORT + "/"); + server = sf.create(); + BusFactory.setDefaultBus(null); + BusFactory.setThreadDefaultBus(null); + } + + public void tearDown() throws Exception { + server.stop(); + server.destroy(); + server = null; + } + + public static void main(String[] args) { + try { + BookServer20 s = new BookServer20(); + s.start(); + } catch (Exception ex) { + ex.printStackTrace(); + System.exit(-1); + } finally { + System.out.println("done!"); + } + } + + private static class PreMatchContainerRequestFilter implements ContainerRequestFilter { + + @Override + public void filter(ContainerRequestContext context) throws IOException { + context.getHeaders().add("BOOK", "123"); + } + + } +} Propchange: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer20.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer20.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java?rev=1382087&r1=1382086&r2=1382087&view=diff ============================================================================== --- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java (original) +++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java Fri Sep 7 16:33:56 2012 @@ -426,6 +426,12 @@ public class BookStore { } @GET + @Path("/bookheaders/simple/") + public Book getBookByHeaderSimple(@HeaderParam("BOOK") String header) throws Exception { + return doGetBook(header); + } + + @GET @Path("/bookheaders/") public Book getBookByHeader(@HeaderParam("BOOK") List ids) throws Exception { List types = httpHeaders.getAcceptableMediaTypes(); Added: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java?rev=1382087&view=auto ============================================================================== --- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java (added) +++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java Fri Sep 7 16:33:56 2012 @@ -0,0 +1,44 @@ +/** + * 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.systest.jaxrs; + +import org.apache.cxf.jaxrs.client.WebClient; +import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase; + +import org.junit.BeforeClass; +import org.junit.Test; + +public class JAXRS20ClientServerBookTest extends AbstractBusClientServerTestBase { + public static final String PORT = BookServer20.PORT; + + @BeforeClass + public static void startServers() throws Exception { + assertTrue("server did not launch correctly", + launchServer(BookServer20.class, true)); + } + + @Test + public void testGetBook() { + String address = "http://localhost:" + PORT + "/bookstore/bookheaders/simple"; + WebClient wc = WebClient.create(address); + Book book = wc.get(Book.class); + assertEquals(123L, book.getId()); + } +} Propchange: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java ------------------------------------------------------------------------------ svn:keywords = Rev Date