/**
* 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;
import java.util.List;
import java.util.Set;
import javax.ws.rs.core.MultivaluedMap;
import org.apache.cxf.jaxrs.impl.MetadataMap;
import org.apache.cxf.jaxrs.model.ClassResourceInfo;
import org.apache.cxf.jaxrs.model.MethodDispatcher;
import org.apache.cxf.jaxrs.model.OperationResourceInfo;
import org.apache.cxf.jaxrs.model.URITemplate;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class JAXRSServiceFactoryBeanTest extends Assert {
@Before
public void setUp() throws Exception {
}
@Test
public void testNoSubResources() throws Exception {
JAXRSServiceFactoryBean sf = new JAXRSServiceFactoryBean();
sf.setEnableStaticResolution(true);
sf.setResourceClasses(org.apache.cxf.jaxrs.resources.BookStoreNoSubResource.class);
sf.create();
List<ClassResourceInfo> resources = ((JAXRSServiceImpl)sf.getService()).getClassResourceInfos();
assertEquals(1, resources.size());
//Verify root ClassResourceInfo: BookStoreNoSubResource
ClassResourceInfo rootCri = resources.get(0);
assertNotNull(rootCri.getURITemplate());
URITemplate template = rootCri.getURITemplate();
MultivaluedMap<String, String> values = new MetadataMap<String, String>();
assertTrue(template.match("/bookstore/books/123", values));
assertFalse(rootCri.hasSubResources());
MethodDispatcher md = rootCri.getMethodDispatcher();
assertEquals(7, md.getOperationResourceInfos().size());
Set<OperationResourceInfo> ops = md.getOperationResourceInfos();
assertTrue("No operation found", verifyOp(ops, "getBook", "GET", false));
assertTrue("No operation found", verifyOp(ops, "getBookStoreInfo", "GET", false));
assertTrue("No operation found", verifyOp(ops, "getBooks", "GET", false));
assertTrue("No operation found", verifyOp(ops, "getBookJSON", "GET", false));
assertTrue("No operation found", verifyOp(ops, "addBook", "POST", false));
assertTrue("No operation found", verifyOp(ops, "updateBook", "PUT", false));
assertTrue("No operation found", verifyOp(ops, "deleteBook", "DELETE", false));
}
@Test
public void testSubresourcesOnlyDynamicResolution() throws Exception {
JAXRSServiceFactoryBean sf = new JAXRSServiceFactoryBean();
sf.setResourceClasses(org.apache.cxf.jaxrs.resources.BookStoreSubresourcesOnly.class);
sf.create();
List<ClassResourceInfo> resources = ((JAXRSServiceImpl)sf.getService()).getClassResourceInfos();
assertEquals(1, resources.size());
}
@Test
public void testSubResources() throws Exception {
JAXRSServiceFactoryBean sf = new JAXRSServiceFactoryBean();
sf.setEnableStaticResolution(true);
sf.setResourceClasses(org.apache.cxf.jaxrs.resources.BookStore.class);
sf.create();
List<ClassResourceInfo> resources = ((JAXRSServiceImpl)sf.getService()).getClassResourceInfos();
assertEquals(1, resources.size());
//Verify root ClassResourceInfo: BookStore
ClassResourceInfo rootCri = resources.get(0);
assertNotNull(rootCri.getURITemplate());
URITemplate template = rootCri.getURITemplate();
MultivaluedMap<String, String> values = new MetadataMap<String, String>();
assertTrue(template.match("/bookstore/books/123", values));
assertTrue(rootCri.hasSubResources());
MethodDispatcher md = rootCri.getMethodDispatcher();
assertEquals(7, md.getOperationResourceInfos().size());
for (OperationResourceInfo ori : md.getOperationResourceInfos()) {
if ("getDescription".equals(ori.getMethodToInvoke().getName())) {
assertEquals("GET", ori.getHttpMethod());
assertEquals("/path", ori.getURITemplate().getValue());
assertEquals("text/bar", ori.getProduceTypes().get(0).toString());
assertEquals("text/foo", ori.getConsumeTypes().get(0).toString());
assertFalse(ori.isSubResourceLocator());
} else if ("getAuthor".equals(ori.getMethodToInvoke().getName())) {
assertEquals("GET", ori.getHttpMethod());
assertEquals("/path2", ori.getURITemplate().getValue());
assertEquals("text/bar2", ori.getProduceTypes().get(0).toString());
assertEquals("text/foo2", ori.getConsumeTypes().get(0).toString());
assertFalse(ori.isSubResourceLocator());
} else if ("getBook".equals(ori.getMethodToInvoke().getName())) {
assertNull(ori.getHttpMethod());
assertNotNull(ori.getURITemplate());
assertTrue(ori.isSubResourceLocator());
} else if ("getNewBook".equals(ori.getMethodToInvoke().getName())) {
assertNull(ori.getHttpMethod());
assertNotNull(ori.getURITemplate());
assertTrue(ori.isSubResourceLocator());
} else if ("addBook".equals(ori.getMethodToInvoke().getName())) {
assertEquals("POST", ori.getHttpMethod());
assertNotNull(ori.getURITemplate());
assertFalse(ori.isSubResourceLocator());
} else if ("updateBook".equals(ori.getMethodToInvoke().getName())) {
assertEquals("PUT", ori.getHttpMethod());
assertNotNull(ori.getURITemplate());
assertFalse(ori.isSubResourceLocator());
} else if ("deleteBook".equals(ori.getMethodToInvoke().getName())) {
assertEquals("DELETE", ori.getHttpMethod());
assertNotNull(ori.getURITemplate());
assertFalse(ori.isSubResourceLocator());
} else {
fail("unexpected OperationResourceInfo" + ori.getMethodToInvoke().getName());
}
}
// Verify sub-resource ClassResourceInfo: Book
assertEquals(1, rootCri.getSubResources().size());
ClassResourceInfo subCri = rootCri.getSubResources().iterator().next();
assertNull(subCri.getURITemplate());
assertEquals(org.apache.cxf.jaxrs.resources.Book.class, subCri.getResourceClass());
MethodDispatcher subMd = subCri.getMethodDispatcher();
assertEquals(2, subMd.getOperationResourceInfos().size());
//getChapter method
OperationResourceInfo subOri = subMd.getOperationResourceInfos().iterator().next();
assertEquals("GET", subOri.getHttpMethod());
assertNotNull(subOri.getURITemplate());
//getState method
OperationResourceInfo subOri2 = subMd.getOperationResourceInfos().iterator().next();
assertEquals("GET", subOri2.getHttpMethod());
assertNotNull(subOri2.getURITemplate());
}
private boolean verifyOp(Set<OperationResourceInfo> ops,
String opName,
String httpMethod,
boolean isSubresource) {
for (OperationResourceInfo ori : ops) {
if (opName.equals(ori.getMethodToInvoke().getName())) {
assertEquals(httpMethod, ori.getHttpMethod());
assertNotNull(ori.getURITemplate());
assertEquals(isSubresource, ori.isSubResourceLocator());
return true;
}
}
return false;
}
}