/** * Copyright 2008 - 2009 Pro-Netics S.P.A. * * Licensed 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 it.pronetics.madstore.server.jaxrs.atom.resolver; import java.net.URL; import java.util.HashMap; import java.util.Map; import javax.ws.rs.GET; import javax.ws.rs.Path; import junit.framework.TestCase; public class ResourceResolverTest extends TestCase { public void testResolveResourceIdWithParameters() throws Exception { String baseUri = "http://example.com:8080/context"; String resourceName = "resource"; String[] resourceParams = {"key1", "key2"}; ResourceResolver resolver = new ResourceResolver(new HashMap<String, Class>()); String id = resolver.resolveResourceIdFor(baseUri, resourceName, resourceParams); assertEquals("tag:example.com:resource:key1:key2", id); } public void testResolveResourceIdWithNoParameters() throws Exception { String baseUri = "http://example.com:8080/context"; String resourceName = "resource"; ResourceResolver resolver = new ResourceResolver(new HashMap<String, Class>()); String id = resolver.resolveResourceIdFor(baseUri, resourceName); assertEquals("tag:example.com:resource", id); } public void testResolveResourceUriWithSimpleResource() throws Exception { String basePath = "http://example.com/"; Class resourceClass = TestSimpleResource.class; String resourceName = "resource"; Map<String, Class> resourceClasses = new HashMap(); resourceClasses.put(resourceName, resourceClass); ResourceResolver resolver = new ResourceResolver(resourceClasses); URL url = resolver.resolveResourceUriFor(resourceName, basePath, "me"); assertNotNull(url); assertEquals("http://example.com/test/me", url.toString()); } public void testResolveResourceUriWithMultipleResources() throws Exception { String basePath = "http://example.com/"; Class resourceClass = TestMultiResource.class; String resourceName1 = "resource1"; String resourceName2 = "resource2"; Map<String, Class> resourceClasses = new HashMap(); resourceClasses.put(resourceName1, resourceClass); resourceClasses.put(resourceName2, resourceClass); ResourceResolver resolver = new ResourceResolver(resourceClasses); URL url = resolver.resolveResourceUriFor(resourceName1, basePath, "me"); assertNotNull(url); assertEquals("http://example.com/test1/me", url.toString()); url = resolver.resolveResourceUriFor(resourceName2, basePath, "me"); assertNotNull(url); assertEquals("http://example.com/test2/me", url.toString()); } public void testResolveResourceUriWithMultipleLocatorsAndSubResource() throws Exception { String basePath = "http://example.com/"; Class resourceClass = TestSubResource.class; String resourceName = "resource"; Map<String, Class> resourceClasses = new HashMap(); resourceClasses.put(resourceName, resourceClass); ResourceResolver resolver = new ResourceResolver(resourceClasses); URL url = resolver.resolveResourceUriFor(resourceName, basePath, "me"); assertNotNull(url); assertEquals("http://example.com/locator0/locator1/test/me", url.toString()); } public void testResolveResourceUriWithLocatorAndMultipleSubResources() throws Exception { String basePath = "http://example.com/"; Class resourceClass1 = TestFirstSubResource.class; Class resourceClass2 = TestSecondSubResource.class; String resourceName1 = "resource1"; String resourceName2 = "resource2"; Map<String, Class> resourceClasses = new HashMap(); resourceClasses.put(resourceName1, resourceClass1); resourceClasses.put(resourceName2, resourceClass2); ResourceResolver resolver = new ResourceResolver(resourceClasses); URL url = resolver.resolveResourceUriFor(resourceName1, basePath, "me"); assertNotNull(url); assertEquals("http://example.com/multiLocator/test1/me", url.toString()); url = resolver.resolveResourceUriFor(resourceName2, basePath, "me"); assertNotNull(url); assertEquals("http://example.com/multiLocator/test2/me", url.toString()); } public void testResolveResourceUriForLocator() throws Exception { String basePath = "http://example.com/"; Class resourceClass = TestMultipleSubResourcesLocator.class; String locatorName = "locator"; Map<String, Class> resourceClasses = new HashMap(); resourceClasses.put(locatorName, resourceClass); ResourceResolver resolver = new ResourceResolver(resourceClasses); URL url = resolver.resolveResourceUriFor(locatorName, basePath); assertNotNull(url); assertEquals("http://example.com/multiLocator", url.toString()); } @Path("/") private static class TestSimpleResource { @GET @ResourceUriFor(resource = "resource") @Path("/test/{param}") public Object getResource() { return null; } } @Path("/") private static class TestMultiResource { @GET @ResourceUriFor(resource = "resource1") @Path("/test1/{param}") public Object getResource1() { return null; } @GET @ResourceUriFor(resource = "resource2") @Path("/test2/{param}") public Object getResource2() { return null; } } @Path("/") private static class TestSubResourceLocator0 { @ResourceUriFor(resource = "locator0", subResources = {"locator1"}) @Path("/locator0") public Object getResource() { return new TestSubResourceLocator1(); } } private static class TestSubResourceLocator1 { @ResourceUriFor(resource = "locator1", subResources = {"resource"}, locator = TestSubResourceLocator0.class) @Path("/locator1") public Object getResource() { return new TestSubResource(); } } private static class TestSubResource { @GET @ResourceUriFor(resource = "resource", locator = TestSubResourceLocator1.class) @Path("/test/{param}") public Object getResource() { return null; } } @Path("/") private static class TestMultipleSubResourcesLocator { @ResourceUriFor(resource = "locator", subResources = {"resource1", "resource2"}) @Path("/multiLocator") public Object getResource() { if (System.currentTimeMillis() % 2 == 0) { return new TestFirstSubResource(); } else { return new TestSecondSubResource(); } } } private static class TestFirstSubResource { @GET @ResourceUriFor(resource = "resource1", locator = TestMultipleSubResourcesLocator.class) @Path("/test1/{param}") public Object getResource() { return null; } } private static class TestSecondSubResource { @GET @ResourceUriFor(resource = "resource2", locator = TestMultipleSubResourcesLocator.class) @Path("/test2/{param}") public Object getResource() { return null; } } }