/** * 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.utils; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.lang.reflect.Type; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.ws.rs.ApplicationPath; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.core.Application; import javax.ws.rs.core.UriInfo; import javax.xml.bind.annotation.XmlRootElement; import org.apache.cxf.BusFactory; import org.apache.cxf.jaxrs.Customer; import org.apache.cxf.jaxrs.JAXRSServerFactoryBean; import org.apache.cxf.jaxrs.model.ClassResourceInfo; import org.apache.cxf.jaxrs.model.OperationResourceInfo; import org.apache.cxf.jaxrs.model.Parameter; import org.apache.cxf.jaxrs.model.ParameterType; import org.apache.cxf.jaxrs.model.UserOperation; import org.apache.cxf.jaxrs.model.UserResource; import org.apache.cxf.jaxrs.resources.Book; import org.apache.cxf.jaxrs.resources.BookInterface; import org.apache.cxf.jaxrs.resources.Chapter; import org.junit.Assert; import org.junit.Test; public class ResourceUtilsTest extends Assert { @Test public void testFindResourceConstructor() { Constructor<?> c = ResourceUtils.findResourceConstructor(Customer.class, true); assertNotNull(c); assertEquals(2, c.getParameterTypes().length); assertEquals(UriInfo.class, c.getParameterTypes()[0]); assertEquals(String.class, c.getParameterTypes()[1]); } @Test public void testClassResourceInfoUserResource() throws Exception { UserResource ur = new UserResource(); ur.setName(HashMap.class.getName()); ur.setPath("/hashmap"); UserOperation op = new UserOperation(); op.setPath("/key/{id}"); op.setName("get"); op.setVerb("POST"); op.setParameters(Collections.singletonList(new Parameter(ParameterType.PATH, "id"))); ur.setOperations(Collections.singletonList(op)); Map<String, UserResource> resources = new HashMap<>(); resources.put(ur.getName(), ur); ClassResourceInfo cri = ResourceUtils.createClassResourceInfo(resources, ur, null, true, true, BusFactory.getDefaultBus()); assertNotNull(cri); assertEquals("/hashmap", cri.getURITemplate().getValue()); Method method = HashMap.class.getMethod("get", new Class[]{Object.class}); OperationResourceInfo ori = cri.getMethodDispatcher().getOperationResourceInfo(method); assertNotNull(ori); assertEquals("/key/{id}", ori.getURITemplate().getValue()); List<Parameter> params = ori.getParameters(); assertNotNull(params); Parameter p = params.get(0); assertEquals("id", p.getName()); } @Test public void testUserResourceFromFile() throws Exception { List<UserResource> list = ResourceUtils.getUserResources("classpath:/resources.xml"); assertNotNull(list); assertEquals(1, list.size()); UserResource resource = list.get(0); assertEquals("java.util.Map", resource.getName()); assertEquals("map", resource.getPath()); assertEquals("application/xml", resource.getProduces()); assertEquals("application/json", resource.getConsumes()); UserOperation oper = resource.getOperations().get(0); assertEquals("putAll", oper.getName()); assertEquals("/putAll", oper.getPath()); assertEquals("PUT", oper.getVerb()); assertEquals("application/json", oper.getProduces()); assertEquals("application/xml", oper.getConsumes()); Parameter p = oper.getParameters().get(0); assertEquals("map", p.getName()); assertEquals("emptyMap", p.getDefaultValue()); assertTrue(p.isEncoded()); assertEquals("REQUEST_BODY", p.getType().toString()); } @Test public void testGetAllJaxbClasses() { ClassResourceInfo cri1 = ResourceUtils.createClassResourceInfo(BookInterface.class, BookInterface.class, true, true); Map<Class<?>, Type> types = ResourceUtils.getAllRequestResponseTypes(Collections.singletonList(cri1), true) .getAllTypes(); assertEquals(2, types.size()); assertTrue(types.containsKey(Book.class)); assertTrue(types.containsKey(Chapter.class)); } @Test public void testGetAllJaxbClasses2() { ClassResourceInfo cri1 = ResourceUtils.createClassResourceInfo(IProductResource.class, IProductResource.class, true, true); Map<Class<?>, Type> types = ResourceUtils.getAllRequestResponseTypes(Collections.singletonList(cri1), true) .getAllTypes(); assertEquals(2, types.size()); assertTrue(types.containsKey(Book.class)); assertTrue(types.containsKey(Chapter.class)); } @Test public void testGetAllJaxbClassesComplexGenericType() { ClassResourceInfo cri1 = ResourceUtils.createClassResourceInfo(OrderResource.class, OrderResource.class, true, true); Map<Class<?>, Type> types = ResourceUtils.getAllRequestResponseTypes(Collections.singletonList(cri1), true) .getAllTypes(); assertEquals(2, types.size()); assertTrue(types.containsKey(OrderItemsDTO.class)); assertTrue(types.containsKey(OrderItemDTO.class)); } @Test public void testClassResourceInfoWithOverride() throws Exception { ClassResourceInfo cri = ResourceUtils.createClassResourceInfo(ExampleImpl.class, ExampleImpl.class, true, true); assertNotNull(cri); Method m = ExampleImpl.class.getMethod("get"); OperationResourceInfo ori = cri.getMethodDispatcher().getOperationResourceInfo(m); assertNotNull(ori); assertEquals("GET", ori.getHttpMethod()); } @Test public void shouldCreateApplicationWhichInheritsApplicationPath() throws Exception { JAXRSServerFactoryBean application = ResourceUtils.createApplication( new SuperApplication(), false, false, false, null); assertEquals("/base", application.getAddress()); } @Test public void shouldCreateApplicationWhichOverridesApplicationPath() throws Exception { JAXRSServerFactoryBean application = ResourceUtils.createApplication( new CustomApplication(), false, false, false, null); assertEquals("/custom", application.getAddress()); } public interface IProductResource { @Path("/parts") IPartsResource getParts(); } public interface IPartsResource { @Path("/{i}/") IPartsResource2 elementAt(@PathParam("i") String i); @Path("/parts") IPartsResource getParts(); @Path("/products") IProductResource getProducts(); @Path("chapter") Chapter get(); } public interface IPartsResource2 { @Path("/{i}/") IPartsResource elementAt(@PathParam("i") String i); @Path("/products") IProductResource getProducts(); @GET Book get(); } @Path("example") public interface Example { @GET Book get(); } public static class ExampleImpl implements Example { @Override public Book get() { return null; } } @XmlRootElement public static class OrderItem { } @XmlRootElement public static class OrderItemDTO<T> { } @XmlRootElement public static class OrderItemsDTO<E> { } public static class OrderResource { @GET public OrderItemsDTO<? extends OrderItemDTO<? extends OrderItem>> getOrders() { return null; } } @ApplicationPath("/base") private static class BaseApplication extends Application { } private static class SuperApplication extends BaseApplication { } @ApplicationPath("/custom") private static class CustomApplication extends BaseApplication { } }