You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wink.apache.org by bl...@apache.org on 2009/09/27 01:37:53 UTC
svn commit: r819229 - in /incubator/wink/trunk/wink-server/src:
main/java/org/apache/wink/server/handlers/
main/java/org/apache/wink/server/internal/
main/java/org/apache/wink/server/internal/handlers/
test/java/org/apache/wink/server/internal/handlers...
Author: bluk
Date: Sat Sep 26 23:37:52 2009
New Revision: 819229
URL: http://svn.apache.org/viewvc?rev=819229&view=rev
Log:
Make MediaTypeMapperFactory public
See [WINK-206]
Added:
incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/handlers/MediaTypeMapperFactory.java (with props)
incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/handlers/MediaTypeMappingRecord.java (with props)
incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/handlers/MediaTypeMapping2Test.java (with props)
incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/handlers/MediaTypeMappingTest.java (with props)
incubator/wink/trunk/wink-server/src/test/resources/org/apache/wink/server/internal/handlers/MediaTypeMapping2Test.properties (with props)
incubator/wink/trunk/wink-server/src/test/resources/org/apache/wink/server/internal/handlers/MediaTypeMappingTest.properties (with props)
Modified:
incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/DeploymentConfiguration.java
incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/MediaTypeMapper.java
incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/handlers/ServerMessageContext.java
Added: incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/handlers/MediaTypeMapperFactory.java
URL: http://svn.apache.org/viewvc/incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/handlers/MediaTypeMapperFactory.java?rev=819229&view=auto
==============================================================================
--- incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/handlers/MediaTypeMapperFactory.java (added)
+++ incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/handlers/MediaTypeMapperFactory.java Sat Sep 26 23:37:52 2009
@@ -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.wink.server.handlers;
+
+import java.util.List;
+
+/**
+ * <p>
+ * MediaTypeMapperFactory is responsible to provide media type mappings from an
+ * application's response media type to a preferred media type. The use case is
+ * when certain user agents do not know how to handle a specific response media
+ * type (such as an application/*+xml) and must use another media type (such as
+ * text/xml).
+ * <p>
+ * The user should extend this class and override the relevant methods.
+ * <p>
+ * The sub-classes MUST have the public default constructor.
+ */
+public abstract class MediaTypeMapperFactory {
+
+ /**
+ * Returns a list of media type mappings that will be called to map response
+ * media types to preferred media types.
+ *
+ * @return set of media type mapping records
+ */
+ public abstract List<? extends MediaTypeMappingRecord> getMediaTypeMappings();
+}
Propchange: incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/handlers/MediaTypeMapperFactory.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/handlers/MediaTypeMappingRecord.java
URL: http://svn.apache.org/viewvc/incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/handlers/MediaTypeMappingRecord.java?rev=819229&view=auto
==============================================================================
--- incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/handlers/MediaTypeMappingRecord.java (added)
+++ incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/handlers/MediaTypeMappingRecord.java Sat Sep 26 23:37:52 2009
@@ -0,0 +1,40 @@
+/*
+ * 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.wink.server.handlers;
+
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+
+/**
+ * MediaTypeMappingRecords can map response media types to a different response
+ * media type if necessary.
+ */
+public interface MediaTypeMappingRecord {
+
+ /**
+ * Maps response media types to a different response media type if
+ * necessary. If the match does not apply, return null.
+ *
+ * @param requestHeaders the current request headers
+ * @param responseMediaType the response media type
+ * @return the media type to use instead
+ */
+ MediaType match(HttpHeaders requestHeaders, MediaType responseMediaType);
+
+}
Propchange: incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/handlers/MediaTypeMappingRecord.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/DeploymentConfiguration.java
URL: http://svn.apache.org/viewvc/incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/DeploymentConfiguration.java?rev=819229&r1=819228&r2=819229&view=diff
==============================================================================
--- incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/DeploymentConfiguration.java (original)
+++ incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/DeploymentConfiguration.java Sat Sep 26 23:37:52 2009
@@ -35,7 +35,6 @@
import javax.servlet.ServletContext;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Application;
-import javax.ws.rs.core.MediaType;
import org.apache.wink.common.internal.application.ApplicationValidator;
import org.apache.wink.common.internal.i18n.Messages;
@@ -44,9 +43,9 @@
import org.apache.wink.common.internal.registry.InjectableFactory;
import org.apache.wink.common.internal.registry.ProvidersRegistry;
import org.apache.wink.common.internal.utils.FileLoader;
-import org.apache.wink.common.internal.utils.MediaTypeUtils;
import org.apache.wink.server.handlers.Handler;
import org.apache.wink.server.handlers.HandlersFactory;
+import org.apache.wink.server.handlers.MediaTypeMapperFactory;
import org.apache.wink.server.handlers.RequestHandler;
import org.apache.wink.server.handlers.RequestHandlersChain;
import org.apache.wink.server.handlers.ResponseHandler;
@@ -79,17 +78,19 @@
*/
public class DeploymentConfiguration {
- private static final Logger logger =
- LoggerFactory
- .getLogger(DeploymentConfiguration.class);
- private static final String ALTERNATIVE_SHORTCUTS =
- "META-INF/wink-alternate-shortcuts.properties";
- private static final String HTTP_METHOD_OVERRIDE_HEADERS_PROP =
- "wink.httpMethodOverrideHeaders";
- private static final String HANDLERS_FACTORY_CLASS_PROP =
- "wink.handlersFactoryClass";
- private static final String VALIDATE_LOCATION_HEADER =
- "wink.validateLocationHeader";
+ private static final Logger logger =
+ LoggerFactory
+ .getLogger(DeploymentConfiguration.class);
+ private static final String ALTERNATIVE_SHORTCUTS =
+ "META-INF/wink-alternate-shortcuts.properties";
+ private static final String HTTP_METHOD_OVERRIDE_HEADERS_PROP =
+ "wink.httpMethodOverrideHeaders";
+ private static final String HANDLERS_FACTORY_CLASS_PROP =
+ "wink.handlersFactoryClass";
+ private static final String MEDIATYPE_MAPPER_FACTORY_CLASS_PROP =
+ "wink.mediaTypeMapperFactoryClass";
+ private static final String VALIDATE_LOCATION_HEADER =
+ "wink.validateLocationHeader";
// handler chains
private RequestHandlersChain requestHandlersChain;
private ResponseHandlersChain responseHandlersChain;
@@ -317,16 +318,33 @@
* Initializes the MediaTypeMapper. Override it to provide a custom
* MediaTypeMapper.
*/
+ @SuppressWarnings("unchecked")
protected void initMediaTypeMapper() {
if (mediaTypeMapper == null) {
mediaTypeMapper = new MediaTypeMapper();
- mediaTypeMapper.addMapping("Mozilla/",
- MediaType.APPLICATION_ATOM_XML,
- MediaType.TEXT_XML);
- mediaTypeMapper.addMapping("Mozilla/",
- MediaTypeUtils.ATOM_SERVICE_DOCUMENT,
- MediaType.TEXT_XML);
- mediaTypeMapper.addMapping("Mozilla/", MediaTypeUtils.OPENSEARCH, MediaType.TEXT_XML);
+
+ String mediaTypeMapperFactoryClassName =
+ properties.getProperty(MEDIATYPE_MAPPER_FACTORY_CLASS_PROP);
+ if (mediaTypeMapperFactoryClassName != null) {
+ try {
+ logger.debug("MediaTypeMappingFactory Class is: {}",
+ mediaTypeMapperFactoryClassName);
+ Class<MediaTypeMapperFactory> handlerFactoryClass =
+ (Class<MediaTypeMapperFactory>)Class
+ .forName(mediaTypeMapperFactoryClassName);
+ MediaTypeMapperFactory handlersFactory = handlerFactoryClass.newInstance();
+ mediaTypeMapper.addMappings(handlersFactory.getMediaTypeMappings());
+ } catch (ClassNotFoundException e) {
+ logger.error(Messages
+ .getMessage("isNotAClass", mediaTypeMapperFactoryClassName), e);
+ } catch (InstantiationException e) {
+ logger.error(Messages.getMessage("classInstantiationException",
+ mediaTypeMapperFactoryClassName), e);
+ } catch (IllegalAccessException e) {
+ logger.error(Messages.getMessage("classIllegalAccess",
+ mediaTypeMapperFactoryClassName), e);
+ }
+ }
}
}
Modified: incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/MediaTypeMapper.java
URL: http://svn.apache.org/viewvc/incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/MediaTypeMapper.java?rev=819229&r1=819228&r2=819229&view=diff
==============================================================================
--- incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/MediaTypeMapper.java (original)
+++ incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/MediaTypeMapper.java Sat Sep 26 23:37:52 2009
@@ -22,14 +22,13 @@
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
+import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
+import org.apache.wink.server.handlers.MediaTypeMappingRecord;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.apache.wink.common.internal.i18n.Messages;
-import org.apache.wink.common.internal.utils.MediaTypeUtils;
/**
* Allows to map response media types to other media types based on user agent.
@@ -37,59 +36,17 @@
*/
public final class MediaTypeMapper {
- private static final Logger logger = LoggerFactory.getLogger(MediaTypeMapper.class);
+ private static final Logger logger = LoggerFactory.getLogger(MediaTypeMapper.class);
- private interface MappingRecord {
+ private List<MediaTypeMappingRecord> mappings = new ArrayList<MediaTypeMappingRecord>();
- boolean match(String userAgent, MediaType responseMediaType);
-
- MediaType getReplacement();
-
- }
-
- private static class AgentStartsWith implements MappingRecord {
-
- private String userAgentStartsWith;
- private MediaType responseType;
- private MediaType replacementType;
-
- public AgentStartsWith(String userAgentStartsWith,
- String responseType,
- String replacementType) {
- if (userAgentStartsWith == null)
- throw new NullPointerException();
- this.userAgentStartsWith = userAgentStartsWith;
- this.responseType = MediaType.valueOf(responseType);
- this.replacementType = MediaType.valueOf(replacementType);
- }
-
- public boolean match(String userAgent, MediaType responseMediaType) {
- return userAgent.startsWith(userAgentStartsWith) && MediaTypeUtils
- .equalsIgnoreParameters(responseMediaType, responseType);
- }
-
- public MediaType getReplacement() {
- return replacementType;
- }
- }
-
- private List<MappingRecord> mappings = new ArrayList<MappingRecord>();
-
- public void setMappings(List<Map<String, String>> mappings) {
- for (Map<String, String> record : mappings) {
- String userAgent = record.get("userAgentStartsWith"); //$NON-NLS-1$
- String resultMimeType = record.get("resultMediaType"); //$NON-NLS-1$
- String typeToSend = record.get("typeToSend"); //$NON-NLS-1$
- addMapping(userAgent, resultMimeType, typeToSend);
- }
- }
-
- public void addMapping(String userAgent, String resultMimeType, String typeToSend) {
- if (userAgent == null || resultMimeType == null || typeToSend == null) {
- logger.warn(Messages.getMessage("mediaTypeMapperIncompleteRecord"), userAgent);
+ public void addMappings(List<? extends MediaTypeMappingRecord> records) {
+ if (records == null) {
+ logger.debug("No media type mapping records to add");
return;
}
- this.mappings.add(new AgentStartsWith(userAgent, resultMimeType, typeToSend));
+ logger.debug("Media type mapping records to add: {}", records);
+ this.mappings.addAll(records);
}
/**
@@ -100,14 +57,19 @@
* @param userAgent User-Agent header; null is allowed
* @return responseMediaType parameter or some non-null value
*/
- public MediaType mapOutputMediaType(MediaType responseMediaType, String userAgent) {
- if (userAgent != null) {
- for (MappingRecord mappingRecord : mappings) {
- if (mappingRecord.match(userAgent, responseMediaType)) {
- return mappingRecord.getReplacement();
- }
+ public MediaType mapOutputMediaType(MediaType responseMediaType, HttpHeaders requestHeaders) {
+ for (MediaTypeMappingRecord mappingRecord : mappings) {
+ logger.debug("Attempting to map media type using mapping record: {}", mappingRecord);
+ MediaType replacement = mappingRecord.match(requestHeaders, responseMediaType);
+ if (replacement != null) {
+ logger.debug("Mapped user media type to: {} using mapping record: {}",
+ replacement,
+ mappingRecord);
+ return replacement;
}
}
+ logger.debug("Did not find a mapping record so returning original response media type: {}",
+ responseMediaType);
return responseMediaType; // returning the same
}
Modified: incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/handlers/ServerMessageContext.java
URL: http://svn.apache.org/viewvc/incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/handlers/ServerMessageContext.java?rev=819229&r1=819228&r2=819229&view=diff
==============================================================================
--- incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/handlers/ServerMessageContext.java (original)
+++ incubator/wink/trunk/wink-server/src/main/java/org/apache/wink/server/internal/handlers/ServerMessageContext.java Sat Sep 26 23:37:52 2009
@@ -41,6 +41,7 @@
import org.apache.wink.common.internal.contexts.ProvidersImpl;
import org.apache.wink.common.internal.registry.ProvidersRegistry;
import org.apache.wink.common.internal.runtime.AbstractRuntimeContext;
+import org.apache.wink.common.internal.runtime.RuntimeContextTLS;
import org.apache.wink.server.handlers.MessageContext;
import org.apache.wink.server.internal.DeploymentConfiguration;
import org.apache.wink.server.internal.MediaTypeMapper;
@@ -231,9 +232,8 @@
}
private MediaType getRealResponseMimeType(String responseMimeType) {
- String userAgent = servletRequest.getHeader(HttpHeaders.USER_AGENT);
return mediaTypeMapper.mapOutputMediaType(MediaType.valueOf(responseMimeType),
- userAgent);
+ getHttpHeaders());
}
}
}
Added: incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/handlers/MediaTypeMapping2Test.java
URL: http://svn.apache.org/viewvc/incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/handlers/MediaTypeMapping2Test.java?rev=819229&view=auto
==============================================================================
--- incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/handlers/MediaTypeMapping2Test.java (added)
+++ incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/handlers/MediaTypeMapping2Test.java Sat Sep 26 23:37:52 2009
@@ -0,0 +1,128 @@
+/*
+ * 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.wink.server.internal.handlers;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import org.apache.wink.common.internal.utils.MediaTypeUtils;
+import org.apache.wink.server.handlers.MediaTypeMapperFactory;
+import org.apache.wink.server.handlers.MediaTypeMappingRecord;
+import org.apache.wink.server.internal.servlet.MockServletInvocationTest;
+import org.apache.wink.test.mock.MockRequestConstructor;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+
+public class MediaTypeMapping2Test extends MockServletInvocationTest {
+
+ @Path("/resource1")
+ public static class Resource {
+
+ @GET
+ public Response get() {
+ return Response.ok("Hello world!").type("custom/type").build();
+ }
+ }
+
+ private static class AgentStartsWith implements MediaTypeMappingRecord {
+
+ private String userAgentStartsWith;
+ private MediaType responseType;
+ private MediaType replacementType;
+
+ public AgentStartsWith(String userAgentStartsWith,
+ String responseType,
+ String replacementType) {
+ if (userAgentStartsWith == null)
+ throw new NullPointerException();
+ this.userAgentStartsWith = userAgentStartsWith;
+ this.responseType = MediaType.valueOf(responseType);
+ this.replacementType = MediaType.valueOf(replacementType);
+ }
+
+ public MediaType match(HttpHeaders requestHeaders, MediaType responseMediaType) {
+ if (!MediaTypeUtils.equalsIgnoreParameters(responseMediaType, responseType)) {
+ return null;
+ }
+ String userAgent = requestHeaders.getRequestHeaders().getFirst(HttpHeaders.USER_AGENT);
+ if (userAgent != null && userAgent.startsWith(userAgentStartsWith)) {
+ return replacementType;
+ }
+ return null;
+ }
+ }
+
+ public static class UserMediaTypeMapperFactory extends MediaTypeMapperFactory {
+
+ @Override
+ public List<? extends MediaTypeMappingRecord> getMediaTypeMappings() {
+ List<MediaTypeMappingRecord> records = new ArrayList<MediaTypeMappingRecord>();
+ records.add(new AgentStartsWith("Agent123/", "custom/type", MediaType.TEXT_XML));
+ records.add(new MediaTypeMappingRecord() {
+
+ public MediaType match(HttpHeaders requestHeaders, MediaType responseMediaType) {
+ return MediaType.valueOf("my/type");
+ }
+ });
+ return records;
+ }
+
+ }
+
+ @Override
+ protected Class<?>[] getClasses() {
+ return new Class<?>[] {Resource.class};
+ }
+
+ public void testMediaTypeMapping() throws Exception {
+ MockHttpServletRequest mockRequest =
+ MockRequestConstructor.constructMockRequest("GET", "/resource1", MediaType.WILDCARD);
+ MockHttpServletResponse response = invoke(mockRequest);
+ assertEquals(200, response.getStatus());
+ assertEquals("Hello world!", response.getContentAsString());
+ assertEquals("my/type", response.getContentType());
+
+ mockRequest =
+ MockRequestConstructor.constructMockRequest("GET", "/resource1", MediaType.WILDCARD);
+ mockRequest.addHeader(HttpHeaders.USER_AGENT, "Agent123/abcd");
+ response = invoke(mockRequest);
+ assertEquals(200, response.getStatus());
+ assertEquals("Hello world!", response.getContentAsString());
+ assertEquals(MediaType.TEXT_XML, response.getContentType());
+
+ mockRequest =
+ MockRequestConstructor.constructMockRequest("GET", "/resource1", MediaType.WILDCARD);
+ mockRequest.addHeader(HttpHeaders.USER_AGENT, "Agent123abcd");
+ response = invoke(mockRequest);
+ assertEquals(200, response.getStatus());
+ assertEquals("Hello world!", response.getContentAsString());
+ assertEquals("my/type", response.getContentType());
+ }
+
+ @Override
+ protected String getPropertiesFile() {
+ return getClass().getName().replaceAll("\\.", "/") + ".properties";
+ }
+}
Propchange: incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/handlers/MediaTypeMapping2Test.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/handlers/MediaTypeMappingTest.java
URL: http://svn.apache.org/viewvc/incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/handlers/MediaTypeMappingTest.java?rev=819229&view=auto
==============================================================================
--- incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/handlers/MediaTypeMappingTest.java (added)
+++ incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/handlers/MediaTypeMappingTest.java Sat Sep 26 23:37:52 2009
@@ -0,0 +1,122 @@
+/*
+ * 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.wink.server.internal.handlers;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import org.apache.wink.common.internal.utils.MediaTypeUtils;
+import org.apache.wink.server.handlers.MediaTypeMapperFactory;
+import org.apache.wink.server.handlers.MediaTypeMappingRecord;
+import org.apache.wink.server.internal.servlet.MockServletInvocationTest;
+import org.apache.wink.test.mock.MockRequestConstructor;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+
+public class MediaTypeMappingTest extends MockServletInvocationTest {
+
+ @Path("/resource1")
+ public static class Resource {
+
+ @GET
+ public Response get() {
+ return Response.ok("Hello world!").type("custom/type").build();
+ }
+ }
+
+ private static class AgentStartsWith implements MediaTypeMappingRecord {
+
+ private String userAgentStartsWith;
+ private MediaType responseType;
+ private MediaType replacementType;
+
+ public AgentStartsWith(String userAgentStartsWith,
+ String responseType,
+ String replacementType) {
+ if (userAgentStartsWith == null)
+ throw new NullPointerException();
+ this.userAgentStartsWith = userAgentStartsWith;
+ this.responseType = MediaType.valueOf(responseType);
+ this.replacementType = MediaType.valueOf(replacementType);
+ }
+
+ public MediaType match(HttpHeaders requestHeaders, MediaType responseMediaType) {
+ if (!MediaTypeUtils.equalsIgnoreParameters(responseMediaType, responseType)) {
+ return null;
+ }
+ String userAgent = requestHeaders.getRequestHeaders().getFirst(HttpHeaders.USER_AGENT);
+ if (userAgent != null && userAgent.startsWith(userAgentStartsWith)) {
+ return replacementType;
+ }
+ return null;
+ }
+ }
+
+ public static class UserMediaTypeMapperFactory extends MediaTypeMapperFactory {
+
+ @Override
+ public List<? extends MediaTypeMappingRecord> getMediaTypeMappings() {
+ List<MediaTypeMappingRecord> records = new ArrayList<MediaTypeMappingRecord>();
+ records.add(new AgentStartsWith("Agent123/", "custom/type", MediaType.TEXT_XML));
+ return records;
+ }
+
+ }
+
+ @Override
+ protected Class<?>[] getClasses() {
+ return new Class<?>[] {Resource.class};
+ }
+
+ public void testMediaTypeMapping() throws Exception {
+ MockHttpServletRequest mockRequest =
+ MockRequestConstructor.constructMockRequest("GET", "/resource1", MediaType.WILDCARD);
+ MockHttpServletResponse response = invoke(mockRequest);
+ assertEquals(200, response.getStatus());
+ assertEquals("Hello world!", response.getContentAsString());
+ assertEquals("custom/type", response.getContentType());
+
+ mockRequest =
+ MockRequestConstructor.constructMockRequest("GET", "/resource1", MediaType.WILDCARD);
+ mockRequest.addHeader(HttpHeaders.USER_AGENT, "Agent123/abcd");
+ response = invoke(mockRequest);
+ assertEquals(200, response.getStatus());
+ assertEquals("Hello world!", response.getContentAsString());
+ assertEquals(MediaType.TEXT_XML, response.getContentType());
+
+ mockRequest =
+ MockRequestConstructor.constructMockRequest("GET", "/resource1", MediaType.WILDCARD);
+ mockRequest.addHeader(HttpHeaders.USER_AGENT, "Agent123abcd");
+ response = invoke(mockRequest);
+ assertEquals(200, response.getStatus());
+ assertEquals("Hello world!", response.getContentAsString());
+ assertEquals("custom/type", response.getContentType());
+ }
+
+ @Override
+ protected String getPropertiesFile() {
+ return getClass().getName().replaceAll("\\.", "/") + ".properties";
+ }
+}
Propchange: incubator/wink/trunk/wink-server/src/test/java/org/apache/wink/server/internal/handlers/MediaTypeMappingTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/wink/trunk/wink-server/src/test/resources/org/apache/wink/server/internal/handlers/MediaTypeMapping2Test.properties
URL: http://svn.apache.org/viewvc/incubator/wink/trunk/wink-server/src/test/resources/org/apache/wink/server/internal/handlers/MediaTypeMapping2Test.properties?rev=819229&view=auto
==============================================================================
--- incubator/wink/trunk/wink-server/src/test/resources/org/apache/wink/server/internal/handlers/MediaTypeMapping2Test.properties (added)
+++ incubator/wink/trunk/wink-server/src/test/resources/org/apache/wink/server/internal/handlers/MediaTypeMapping2Test.properties Sat Sep 26 23:37:52 2009
@@ -0,0 +1,19 @@
+###############################################################################
+# 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.
+###############################################################################
+wink.mediaTypeMapperFactoryClass=org.apache.wink.server.internal.handlers.MediaTypeMapping2Test$UserMediaTypeMapperFactory
\ No newline at end of file
Propchange: incubator/wink/trunk/wink-server/src/test/resources/org/apache/wink/server/internal/handlers/MediaTypeMapping2Test.properties
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/wink/trunk/wink-server/src/test/resources/org/apache/wink/server/internal/handlers/MediaTypeMappingTest.properties
URL: http://svn.apache.org/viewvc/incubator/wink/trunk/wink-server/src/test/resources/org/apache/wink/server/internal/handlers/MediaTypeMappingTest.properties?rev=819229&view=auto
==============================================================================
--- incubator/wink/trunk/wink-server/src/test/resources/org/apache/wink/server/internal/handlers/MediaTypeMappingTest.properties (added)
+++ incubator/wink/trunk/wink-server/src/test/resources/org/apache/wink/server/internal/handlers/MediaTypeMappingTest.properties Sat Sep 26 23:37:52 2009
@@ -0,0 +1,19 @@
+###############################################################################
+# 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.
+###############################################################################
+wink.mediaTypeMapperFactoryClass=org.apache.wink.server.internal.handlers.MediaTypeMappingTest$UserMediaTypeMapperFactory
\ No newline at end of file
Propchange: incubator/wink/trunk/wink-server/src/test/resources/org/apache/wink/server/internal/handlers/MediaTypeMappingTest.properties
------------------------------------------------------------------------------
svn:eol-style = native