/**
* 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.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.HEAD;
import javax.ws.rs.NameBinding;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.UriInfo;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.apache.cxf.jaxrs.utils.ResourceUtils;
import org.junit.After;
import org.junit.Assert;
import org.junit.Test;
public class ClassResourceInfoTest extends Assert {
@Path("/bar")
@Produces("test/bar")
@Consumes("test/foo")
public static class TestClass {
@Context UriInfo u;
@Context HttpHeaders h;
@Context HttpServletRequest req;
@Context HttpServletResponse res;
@Context ServletContext c;
int i;
@GET
public void getIt() {
}
}
static class TestClass1 extends TestClass {
@GET
public void getIt() {
}
}
static class TestClass2 extends TestClass1 {
@GET
public void getIt() {
}
@Path("/same")
public TestClass2 getThis() {
return this;
}
@Path("sub")
public TestClass3 getTestClass3() {
return new TestClass3();
}
}
@Produces("test/foo")
static class TestClassWithProduces extends TestClass1 {
@GET
public void getIt() {
}
@Path("/same")
public TestClassWithProduces getThis() {
return this;
}
@Path("sub")
public TestClass3 getTestClass3() {
return new TestClass3();
}
}
static class TestClass3 {
@Context HttpServletRequest req;
@Context HttpServletResponse res;
@Context ServletContext c;
@GET
public void getIt() {
}
@HEAD
public void head() {
}
}
@After
public void tearDown() {
AbstractResourceInfo.clearAllMaps();
}
@Test
public void testGetHttpContexts() {
ClassResourceInfo c = new ClassResourceInfo(TestClass.class, true);
List<Field> fields = c.getContextFields();
Set<Class<?>> clses = new HashSet<Class<?>>();
for (Field f : fields) {
clses.add(f.getType());
}
assertEquals("5 http context fields available", 5, clses.size());
assertTrue("Wrong fields selected",
clses.contains(HttpServletRequest.class)
&& clses.contains(HttpServletResponse.class)
&& clses.contains(ServletContext.class)
&& clses.contains(UriInfo.class)
&& clses.contains(HttpHeaders.class));
}
@Test
public void testGetPath() {
ClassResourceInfo c = new ClassResourceInfo(TestClass.class);
assertEquals("/bar", c.getPath().value());
c = new ClassResourceInfo(TestClass1.class);
assertEquals("/bar", c.getPath().value());
c = new ClassResourceInfo(TestClass2.class);
assertEquals("/bar", c.getPath().value());
}
@Test
public void testGetProduce() {
ClassResourceInfo c = new ClassResourceInfo(TestClass.class);
assertEquals("test/bar", c.getProduceMime().get(0).toString());
c = new ClassResourceInfo(TestClass1.class);
assertEquals("test/bar", c.getProduceMime().get(0).toString());
c = new ClassResourceInfo(TestClass2.class);
assertEquals("test/bar", c.getProduceMime().get(0).toString());
}
@Test
public void testGetConsume() {
ClassResourceInfo c = new ClassResourceInfo(TestClass.class);
assertEquals("test/foo", c.getConsumeMime().get(0).toString());
c = new ClassResourceInfo(TestClass1.class);
assertEquals("test/foo", c.getConsumeMime().get(0).toString());
c = new ClassResourceInfo(TestClass2.class);
assertEquals("test/foo", c.getConsumeMime().get(0).toString());
}
@Test
public void testGetSameSubresource() {
ClassResourceInfo c = new ClassResourceInfo(TestClass.class);
assertEquals("No subresources expected", 0, c.getSubResources().size());
assertNull(c.findResource(TestClass.class, TestClass.class));
ClassResourceInfo c1 = c.getSubResource(TestClass.class, TestClass.class);
assertNotNull(c1);
assertSame(c1, c.findResource(TestClass.class, TestClass.class));
assertSame(c1, c.getSubResource(TestClass.class, TestClass.class));
assertEquals("Single subresources expected", 1, c.getSubResources().size());
}
@Test
public void testGetSubresourceSubclass() {
ClassResourceInfo c = new ClassResourceInfo(TestClass.class);
assertEquals("No subresources expected", 0, c.getSubResources().size());
assertNull(c.findResource(TestClass.class, TestClass1.class));
ClassResourceInfo c1 = c.getSubResource(TestClass.class, TestClass1.class);
assertNotNull(c1);
assertSame(c1, c.findResource(TestClass.class, TestClass1.class));
assertNull(c.findResource(TestClass.class, TestClass2.class));
ClassResourceInfo c2 = c.getSubResource(TestClass.class, TestClass2.class);
assertNotNull(c2);
assertSame(c2, c.findResource(TestClass.class, TestClass2.class));
assertSame(c2, c.getSubResource(TestClass.class, TestClass2.class));
assertNotSame(c1, c2);
}
@Test
public void testAllowedMethods() {
ClassResourceInfo c = ResourceUtils.createClassResourceInfo(
TestClass3.class, TestClass3.class, false, false);
Set<String> methods = c.getAllowedMethods();
assertEquals(2, methods.size());
assertTrue(methods.contains("HEAD") && methods.contains("GET"));
}
@Test
public void testSubresourceInheritProduces() {
ClassResourceInfo c = ResourceUtils.createClassResourceInfo(
TestClass2.class, TestClass2.class, true, true);
assertEquals("test/bar", c.getProduceMime().get(0).toString());
ClassResourceInfo sub = c.getSubResource(TestClass2.class, TestClass3.class);
assertNotNull(sub);
assertEquals("test/bar", sub.getProduceMime().get(0).toString());
sub = c.getSubResource(TestClass2.class, TestClass2.class);
assertNotNull(sub);
assertEquals("test/bar", sub.getProduceMime().get(0).toString());
}
@Test
public void testSubresourceWithProduces() {
ClassResourceInfo parent = ResourceUtils.createClassResourceInfo(
TestClass2.class, TestClass2.class, true, true);
ClassResourceInfo c = ResourceUtils.createClassResourceInfo(
TestClassWithProduces.class, TestClassWithProduces.class, true, true);
c.setParent(parent);
assertEquals("test/foo", c.getProduceMime().get(0).toString());
}
@Test
public void testNameBindings() {
Application app = new TestApplication();
JAXRSServerFactoryBean bean = ResourceUtils.createApplication(app, true, true, false, null);
ClassResourceInfo cri = bean.getServiceFactory().getClassResourceInfo().get(0);
Set<String> names = cri.getNameBindings();
assertEquals(Collections.singleton(CustomNameBinding.class.getName()), names);
}
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(value = RetentionPolicy.RUNTIME)
@NameBinding
public @interface CustomNameBinding {
}
@CustomNameBinding
public class TestApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<Class<?>>();
classes.add(TestClass.class);
return classes;
}
}
}