/******************************************************************************* * 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.common.internal.registry.metadata; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import junit.framework.TestCase; public class ResourceMetadataCollectorTest extends TestCase { @Path("/myresource") public class MyResource { @GET @Consumes( {"abcd/efg, hijk/lmn", "opqr/stu"}) // testing permitted syntax from JAX-RS 1.1 E012 @Produces( {"abcd/efg, hijk/lmn", "opqr/stu"}) // testing permitted syntax from JAX-RS 1.1 E012 public String getString() { return "blahblah"; } } @Path("/myotherresource") @Consumes(MediaType.APPLICATION_XML) @Produces(MediaType.APPLICATION_JSON) public class MyResource2 { @GET public void getString() { } } @Path("superclassvalue") public static class SuperResource { } public static class MySubclassResource extends SuperResource { } @Path("interfacevalue") public static interface MyInterface { } public static class MyInterfaceImpl implements MyInterface { } public static class MySuperInterfaceImpl extends SuperResource implements MyInterface { } @Path("abstractclass") public static abstract class MyAbstractClass { } public static class MyBaseClass extends MyAbstractClass { } /** * Tests that @Path is inheritable. This may not follow the JAX-RS * specification so a warning will be issued. * * @throws Exception */ public void testPathInheritance() throws Exception { ClassMetadata classMetadata = ResourceMetadataCollector.collectMetadata(MySubclassResource.class); assertTrue(ResourceMetadataCollector.isResource(MySubclassResource.class)); assertFalse(ResourceMetadataCollector.isDynamicResource(MySubclassResource.class)); assertTrue(ResourceMetadataCollector.isStaticResource(MySubclassResource.class)); assertEquals("superclassvalue", classMetadata.getPath()); classMetadata = ResourceMetadataCollector.collectMetadata(MyInterfaceImpl.class); assertTrue(ResourceMetadataCollector.isResource(MyInterfaceImpl.class)); assertFalse(ResourceMetadataCollector.isDynamicResource(MyInterfaceImpl.class)); assertTrue(ResourceMetadataCollector.isStaticResource(MyInterfaceImpl.class)); assertEquals("interfacevalue", classMetadata.getPath()); // superclass will take precedence over interface classMetadata = ResourceMetadataCollector.collectMetadata(MySuperInterfaceImpl.class); assertTrue(ResourceMetadataCollector.isResource(MySuperInterfaceImpl.class)); assertFalse(ResourceMetadataCollector.isDynamicResource(MySuperInterfaceImpl.class)); assertTrue(ResourceMetadataCollector.isStaticResource(MySuperInterfaceImpl.class)); assertEquals("superclassvalue", classMetadata.getPath()); assertFalse(ResourceMetadataCollector.isResource(MyInterface.class)); assertFalse(ResourceMetadataCollector.isDynamicResource(MyInterface.class)); assertFalse(ResourceMetadataCollector.isStaticResource(MyInterface.class)); assertFalse(ResourceMetadataCollector.isResource(MyAbstractClass.class)); assertFalse(ResourceMetadataCollector.isDynamicResource(MyAbstractClass.class)); assertFalse(ResourceMetadataCollector.isStaticResource(MyAbstractClass.class)); assertTrue(ResourceMetadataCollector.isResource(MyBaseClass.class)); assertFalse(ResourceMetadataCollector.isDynamicResource(MyBaseClass.class)); assertTrue(ResourceMetadataCollector.isStaticResource(MyBaseClass.class)); } /** * JAX-RS 1.1 allows syntax such as: * * @Consumes( { "abcd/efg, hijk/lmn", "opqr/stu" }) * @throws Exception */ public void testConsumesAnnotationParsing() throws Exception { ClassMetadata classMetadata = ResourceMetadataCollector.collectMetadata(MyResource.class); Set<MediaType> mediaTypes = classMetadata.getResourceMethods().get(0).getConsumes(); assertEquals(3, mediaTypes.size()); HashSet<MediaType> values = new HashSet<MediaType>(3); for (Iterator<MediaType> it = mediaTypes.iterator(); it.hasNext();) { values.add((MediaType)it.next()); } HashSet<MediaType> expected = new HashSet<MediaType>(3); expected.add(new MediaType("abcd", "efg")); expected.add(new MediaType("hijk", "lmn")); // make sure whitespace is // ignored expected.add(new MediaType("opqr", "stu")); assertEquals(expected, values); } /** * JAX-RS 1.1 allows syntax such as: * * @Produces( { "abcd/efg, hijk/lmn", "opqr/stu" }) * @throws Exception */ public void testProducesAnnotationParsing() throws Exception { ClassMetadata classMetadata = ResourceMetadataCollector.collectMetadata(MyResource.class); Set<MediaType> mediaTypes = classMetadata.getResourceMethods().get(0).getProduces(); assertEquals(3, mediaTypes.size()); } /** * Tests that the classes inherited consumes annotation is found in * ResourceMetadataCollector. */ public void testConsumesAnnotationParsingForNoEntityArgument() throws Exception { ClassMetadata classMetadata = ResourceMetadataCollector.collectMetadata(MyResource2.class); Set<MediaType> mediaTypes = classMetadata.getResourceMethods().get(0).getConsumes(); assertEquals(mediaTypes.toString(), 1, mediaTypes.size()); assertTrue(mediaTypes.toString(), mediaTypes.contains(MediaType.APPLICATION_XML_TYPE)); } /** * Tests that the classes inherited produces annotation is found in * ResourceMetadataCollector. */ public void testProducesAnnotationParsingForNoReturnedEntity() throws Exception { ClassMetadata classMetadata = ResourceMetadataCollector.collectMetadata(MyResource2.class); Set<MediaType> mediaTypes = classMetadata.getResourceMethods().get(0).getProduces(); assertEquals(mediaTypes.toString(), 1, mediaTypes.size()); assertTrue(mediaTypes.toString(), mediaTypes.contains(MediaType.APPLICATION_JSON_TYPE)); } }