/** * Copyright (c) 2009-2011 VMware, Inc. All Rights Reserved. * * 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 com.springsource.insight.plugin.springweb.rest; import java.net.URI; import java.net.URISyntaxException; import java.util.Collections; import java.util.EnumSet; import java.util.Map; import java.util.Set; import org.junit.Before; import org.mockito.Mockito; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RequestCallback; import org.springframework.web.client.ResponseExtractor; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestOperations; import com.springsource.insight.collection.test.OperationCollectionAspectTestSupport; import com.springsource.insight.intercept.operation.Operation; import com.springsource.insight.intercept.operation.OperationFields; import com.springsource.insight.util.ArrayUtil; import com.springsource.insight.util.StringUtil; /** * */ public abstract class RestOperationCollectionTestSupport extends OperationCollectionAspectTestSupport { protected TestRestOperations opsInstance; protected RestOperationCollectionTestSupport() { super(); } @Before @Override public void setUp() { super.setUp(); opsInstance = new TestRestOperations(); } protected String createTestURI(String testName) { return "http://37.77.34.7:7365/" + getClass().getSimpleName() + "/" + testName; } protected Operation assertRestOperationResult(Object ignored) { return assertRestOperation(); } protected Operation assertRestOperation() { return assertRestOperation(opsInstance); } protected Operation assertRestOperation(TestRestOperations restOps) { Operation op = getLastEntered(); assertNotNull("No operation collected", op); assertEquals("Mismatched type", RestOperationExternalResourceAnalyzer.TYPE, op.getType()); assertEquals("Mismatched method", restOps.getMethod(), op.get("method", String.class)); assertEquals("Mismatched URI", restOps.getUri(), op.get(OperationFields.URI, String.class)); assertRestLabel(op, restOps); return op; } protected void assertAspectMethod(TestRestOperations restOps) { RestOperationCollectionSupport aspectInstance = getRestOperationAspect(); String aspectMethod = aspectInstance.getMethod(); String restMethod = restOps.getMethod(); assertEquals("Mismatched declared aspect method", aspectMethod, restMethod); } protected String assertRestLabel(Operation op, TestRestOperations restOps) { RestOperationCollectionSupport aspectInstance = getRestOperationAspect(); String aspectMethod = aspectInstance.getMethod(); String restMethod = restOps.getMethod(); String actual = op.getLabel(); String expected = RestOperationCollectionSupport.createLabel(restMethod, restOps.getUri()); if (!aspectMethod.equalsIgnoreCase(restMethod)) { expected = RestIndirectOperationCollectionSupport.createIndirectLabel(aspectMethod, restMethod, expected); } assertEquals("Mismatched label", expected, actual); return actual; } protected RestOperationCollectionSupport getRestOperationAspect() { return (RestOperationCollectionSupport) getAspect(); } protected static class TestRestOperations implements RestOperations { private String method, uri; public TestRestOperations() { super(); } public String getMethod() { return method; } public String getUri() { return uri; } public <T> ResponseEntity<T> getForEntity(URI url, Class<T> responseType) throws RestClientException { return getForEntity(url.toString(), responseType, ArrayUtil.EMPTY_OBJECTS); // delegate on purpose to check cflowbelow behavior } public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables) throws RestClientException { return getForEntity(url, responseType, Collections.<String, Object>emptyMap()); // delegate on purpose to check cflowbelow behavior } public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException { T result = getForObject(url, responseType, uriVariables); // delegate on purpose to check cflowbelow behavior return new ResponseEntity<T>(result, HttpStatus.OK); } public <T> T getForObject(URI url, Class<T> responseType) throws RestClientException { return getForObject(url.toString(), responseType, ArrayUtil.EMPTY_OBJECTS); // delegate on purpose to check cflowbelow behavior } public <T> T getForObject(String url, Class<T> responseType, Object... uriVariables) throws RestClientException { return getForObject(url, responseType, Collections.<String, Object>emptyMap()); // delegate on purpose to check cflowbelow behavior } public <T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException { setState(HttpMethod.GET, url); return Mockito.mock(responseType); } public HttpHeaders headForHeaders(URI url) throws RestClientException { return headForHeaders(url.toString(), ArrayUtil.EMPTY_OBJECTS); // delegate on purpose to check cflowbelow behavior } public HttpHeaders headForHeaders(String url, Object... uriVariables) throws RestClientException { return headForHeaders(url, Collections.<String, Object>emptyMap()); // delegate on purpose to check cflowbelow behavior } public HttpHeaders headForHeaders(String url, Map<String, ?> uriVariables) throws RestClientException { setState(HttpMethod.HEAD, url); return new HttpHeaders(); } public URI postForLocation(URI url, Object request) throws RestClientException { return postForLocation(url.toString(), request, ArrayUtil.EMPTY_OBJECTS); // delegate on purpose to check cflowbelow behavior } public URI postForLocation(String url, Object request, Object... uriVariables) throws RestClientException { return postForLocation(url, request, Collections.<String, Object>emptyMap()); // delegate on purpose to check cflowbelow behavior } public URI postForLocation(String url, Object request, Map<String, ?> uriVariables) throws RestClientException { setState(HttpMethod.POST, url); try { return new URI(url); } catch (URISyntaxException e) { throw new RestClientException("Failed to convert " + url + ": " + e.getMessage(), e); } } public <T> ResponseEntity<T> postForEntity(URI url, Object request, Class<T> responseType) throws RestClientException { return postForEntity(url.toString(), request, responseType, ArrayUtil.EMPTY_OBJECTS); // delegate on purpose to check cflowbelow behavior); } public <T> ResponseEntity<T> postForEntity(String url, Object request, Class<T> responseType, Object... uriVariables) throws RestClientException { return postForEntity(url, request, responseType, Collections.<String, Object>emptyMap()); // delegate on purpose to check cflowbelow behavior); } public <T> ResponseEntity<T> postForEntity(String url, Object request, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException { T result = postForObject(url, request, responseType, uriVariables); return new ResponseEntity<T>(result, HttpStatus.OK); } public <T> T postForObject(URI url, Object request, Class<T> responseType) throws RestClientException { return postForObject(url.toString(), request, responseType, ArrayUtil.EMPTY_OBJECTS); // delegate on purpose to check cflowbelow behavior } public <T> T postForObject(String url, Object request, Class<T> responseType, Object... uriVariables) throws RestClientException { return postForObject(url, request, responseType, Collections.<String, Object>emptyMap()); // delegate on purpose to check cflowbelow behavior } public <T> T postForObject(String url, Object request, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException { setState(HttpMethod.POST, url); return Mockito.mock(responseType); } public void put(URI url, Object request) throws RestClientException { put(url.toString(), request, ArrayUtil.EMPTY_OBJECTS); // delegate on purpose to check cflowbelow behavior } public void put(String url, Object request, Object... uriVariables) throws RestClientException { put(url, request, Collections.<String, Object>emptyMap()); // delegate on purpose to check cflowbelow behavior } public void put(String url, Object request, Map<String, ?> uriVariables) throws RestClientException { setState(HttpMethod.PUT, url); } public void delete(URI url) throws RestClientException { delete(url.toString(), ArrayUtil.EMPTY_OBJECTS); // delegate on purpose to check cflowbelow behavior } public void delete(String url, Object... uriVariables) throws RestClientException { delete(url, Collections.<String, Object>emptyMap()); // delegate on purpose to check cflowbelow behavior } public void delete(String url, Map<String, ?> uriVariables) throws RestClientException { setState(HttpMethod.DELETE, url); } public Set<HttpMethod> optionsForAllow(URI url) throws RestClientException { return optionsForAllow(url.toString(), ArrayUtil.EMPTY_OBJECTS); // delegate on purpose to check cflowbelow behavior } public Set<HttpMethod> optionsForAllow(String url, Object... uriVariables) throws RestClientException { return optionsForAllow(url, Collections.<String, Object>emptyMap()); // delegate on purpose to check cflowbelow behavior } public Set<HttpMethod> optionsForAllow(String url, Map<String, ?> uriVariables) throws RestClientException { setState(HttpMethod.OPTIONS, url); return EnumSet.allOf(HttpMethod.class); } public <T> ResponseEntity<T> exchange(URI url, HttpMethod httpMethod, HttpEntity<?> requestEntity, Class<T> responseType) throws RestClientException { // delegate on purpose to check cflowbelow behavior return exchange(url.toString(), httpMethod, requestEntity, responseType, ArrayUtil.EMPTY_OBJECTS); } public <T> ResponseEntity<T> exchange(String url, HttpMethod httpMethod, HttpEntity<?> requestEntity, Class<T> responseType, Object... uriVariables) throws RestClientException { // delegate on purpose to check cflowbelow behavior return exchange(url.toString(), httpMethod, requestEntity, responseType, Collections.<String, Object>emptyMap()); } public <T> ResponseEntity<T> exchange(String url, HttpMethod httpMethod, HttpEntity<?> requestEntity, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException { setState(httpMethod, url); return new ResponseEntity<T>(HttpStatus.NOT_FOUND); } public <T> T execute(URI url, HttpMethod httpMethod, RequestCallback requestCallback, ResponseExtractor<T> responseExtractor) throws RestClientException { // delegate on purpose to check cflowbelow behavior return execute(url.toString(), httpMethod, requestCallback, responseExtractor, ArrayUtil.EMPTY_OBJECTS); } public <T> T execute(String url, HttpMethod httpMethod, RequestCallback requestCallback, ResponseExtractor<T> responseExtractor, Object... uriVariables) throws RestClientException { // delegate on purpose to check cflowbelow behavior return execute(url.toString(), httpMethod, requestCallback, responseExtractor, Collections.<String, Object>emptyMap()); } public <T> T execute(String url, HttpMethod httpMethod, RequestCallback requestCallback, ResponseExtractor<T> responseExtractor, Map<String, ?> uriVariables) throws RestClientException { setState(httpMethod, url); return null; } public <T> ResponseEntity<T> exchange(URI url, HttpMethod httpMethod, HttpEntity<?> requestEntity, ParameterizedTypeReference<T> responseType) throws RestClientException { // delegate on purpose to check cflowbelow behavior return exchange(url.toString(), httpMethod, requestEntity, responseType, ArrayUtil.EMPTY_OBJECTS); } public <T> ResponseEntity<T> exchange(String url, HttpMethod httpMethod, HttpEntity<?> requestEntity, ParameterizedTypeReference<T> responseType, Object... uriVariables) throws RestClientException { // delegate on purpose to check cflowbelow behavior return exchange(url, httpMethod, requestEntity, responseType, Collections.<String, Object>emptyMap()); } public <T> ResponseEntity<T> exchange(String url, HttpMethod httpMethod, HttpEntity<?> requestEntity, ParameterizedTypeReference<T> responseType, Map<String, ?> uriVariables) throws RestClientException { setState(httpMethod, url); return null; } private void setState(HttpMethod accessType, String location) { setState(accessType.name(), location); } private void setState(String accessType, String location) { assertFalse("No access type specified", StringUtil.isEmpty(accessType)); assertNull(accessType + ": Multiple access types: " + method, method); method = accessType; assertFalse("No location specified", StringUtil.isEmpty(location)); assertNull(location + ": Multiple locations: " + uri, uri); uri = location; } public <T> ResponseEntity<T> exchange(RequestEntity<?> requestEntity, Class<T> responseType) throws RestClientException { return null; } public <T> ResponseEntity<T> exchange(RequestEntity<?> requestEntity, ParameterizedTypeReference<T> responseType) { return null; } } }