Issue 85: removed HttpMethod enum, as it is inherently non-extensible. Documented http://code.google.com/p/jclouds/wiki/NewService

git-svn-id: http://jclouds.googlecode.com/svn/trunk@1859 3d8758e0-26b5-11de-8745-db77d3ebf521
This commit is contained in:
adrian.f.cole 2009-08-22 23:19:30 +00:00
parent 1740912593
commit 93866572a0
20 changed files with 102 additions and 103 deletions

View File

@ -23,6 +23,7 @@
*/
package org.jclouds.aws.s3.handlers;
import javax.ws.rs.HttpMethod;
import javax.ws.rs.core.HttpHeaders;
import org.jclouds.aws.domain.AWSError;
@ -31,7 +32,6 @@ import org.jclouds.aws.s3.util.S3Utils;
import org.jclouds.aws.s3.xml.S3ParserFactory;
import org.jclouds.http.HttpCommand;
import org.jclouds.http.HttpException;
import org.jclouds.http.HttpMethod;
import org.jclouds.http.HttpResponse;
import org.jclouds.http.handlers.BackoffLimitedRetryHandler;
import org.jclouds.http.handlers.RedirectionRetryHandler;

View File

@ -27,10 +27,10 @@ import static org.testng.Assert.assertEquals;
import java.net.URI;
import javax.ws.rs.HttpMethod;
import javax.ws.rs.core.HttpHeaders;
import org.jclouds.aws.s3.reference.S3Constants;
import org.jclouds.http.HttpMethod;
import org.jclouds.http.HttpRequest;
import org.jclouds.util.DateService;
import org.testng.annotations.BeforeClass;

View File

@ -48,5 +48,5 @@ public interface HttpCommand extends EndpointCommand<URI, HttpRequest, HttpRespo
/**
* to allow redirects to work on methods that were HEAD
*/
HttpRequest setMethod(HttpMethod method);
HttpRequest setMethod(String method);
}

View File

@ -1,33 +0,0 @@
/**
*
* Copyright (C) 2009 Global Cloud Specialists, Inc. <info@globalcloudspecialists.com>
*
* ====================================================================
* 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.jclouds.http;
/**
* {@code HttpMethod} is an enumeration of HTTP methods used in {@link TransformingHttpCommand}
*
* @author Adrian Cole
*/
public enum HttpMethod {
DELETE, GET, HEAD, POST, PUT
}

View File

@ -43,7 +43,7 @@ public class HttpRequest extends HttpMessage implements Request<URI> {
private List<HttpRequestFilter> requestFilters = Lists.newArrayList();
private final HttpMethod method;
private final String method;
private final URI endpoint;
private Object entity;
@ -54,7 +54,7 @@ public class HttpRequest extends HttpMessage implements Request<URI> {
* @param method
* If the request is HEAD, this may change to GET due to redirects
*/
public HttpRequest(HttpMethod method, URI endPoint) {
public HttpRequest(String method, URI endPoint) {
this.method = checkNotNull(method, "method");
this.endpoint = checkNotNull(endPoint, "endPoint");
}
@ -66,7 +66,7 @@ public class HttpRequest extends HttpMessage implements Request<URI> {
* @param method
* If the request is HEAD, this may change to GET due to redirects
*/
public HttpRequest(HttpMethod method, URI endPoint, Multimap<String, String> headers) {
public HttpRequest(String method, URI endPoint, Multimap<String, String> headers) {
this(method, endPoint);
setHeaders(checkNotNull(headers, "headers"));
}
@ -78,7 +78,7 @@ public class HttpRequest extends HttpMessage implements Request<URI> {
* @param method
* If the request is HEAD, this may change to GET due to redirects
*/
public HttpRequest(HttpMethod method, URI endPoint, Multimap<String, String> headers,
public HttpRequest(String method, URI endPoint, Multimap<String, String> headers,
@Nullable Object entity) {
this(method, endPoint);
setHeaders(checkNotNull(headers, "headers"));
@ -101,7 +101,11 @@ public class HttpRequest extends HttpMessage implements Request<URI> {
return sb.toString();
}
public HttpMethod getMethod() {
/**
* We cannot return an enum, as per specification custom methods are allowed. Enums are not extensible.
* @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.1.1
*/
public String getMethod() {
return method;
}

View File

@ -122,7 +122,7 @@ public class TransformingHttpCommandImpl<T> implements TransformingHttpCommand<T
*
* @param method
*/
public HttpRequest setMethod(HttpMethod method) {
public HttpRequest setMethod(String method) {
request = new HttpRequest(method, request.getEndpoint(), request.getHeaders());
return request;
}

View File

@ -43,7 +43,6 @@ import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.UriBuilder;
import org.jboss.resteasy.util.IsHttpMethod;
import org.jclouds.http.HttpMethod;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.HttpRequestFilter;
import org.jclouds.http.HttpResponse;
@ -209,7 +208,7 @@ public class JaxrsAnnotationProcessor {
private HttpRequestOptionsBinder optionsBinder;
public HttpRequest createRequest(URI endpoint, Method method, Object[] args) {
HttpMethod httpMethod = getHttpMethodOrConstantOrThrowException(method);
String httpMethod = getHttpMethodOrConstantOrThrowException(method);
UriBuilder builder = addHostPrefixIfPresent(endpoint, method, args);
builder.path(declaring);
@ -370,14 +369,14 @@ public class JaxrsAnnotationProcessor {
constants.put(key, value);
}
public HttpMethod getHttpMethodOrConstantOrThrowException(Method method) {
public String getHttpMethodOrConstantOrThrowException(Method method) {
Set<String> httpMethods = IsHttpMethod.getHttpMethods(method);
if (httpMethods == null || httpMethods.size() != 1) {
throw new IllegalStateException(
"You must use at least one, but no more than one http method or pathparam annotation on: "
+ method.toString());
}
return HttpMethod.valueOf(httpMethods.iterator().next());
return httpMethods.iterator().next();
}
public void addHostHeaderIfAnnotatedWithVirtualHost(Multimap<String, String> headers,
@ -390,44 +389,42 @@ public class JaxrsAnnotationProcessor {
public HttpRequest buildEntityIfPostOrPutRequest(Method method, Object[] args,
HttpRequest request) {
switch (request.getMethod()) {
case POST:
case PUT:
MapEntityBinder mapBinder = getMapEntityBinderOrNull(method, args);
Map<String, String> mapParams = buildPostParams(method, args);
// MapEntityBinder is only useful if there are parameters. We guard here in case the
// MapEntityBinder is also an EntityBinder. If so, it can be used with or without
// parameters.
if (mapBinder != null) {
mapBinder.addEntityToRequest(mapParams, request);
break;
OUTER: if (request.getMethod().toUpperCase().equals("POST")
|| request.getMethod().toUpperCase().equals("PUT")) {
MapEntityBinder mapBinder = getMapEntityBinderOrNull(method, args);
Map<String, String> mapParams = buildPostParams(method, args);
// MapEntityBinder is only useful if there are parameters. We guard here in case the
// MapEntityBinder is also an EntityBinder. If so, it can be used with or without
// parameters.
if (mapBinder != null) {
mapBinder.addEntityToRequest(mapParams, request);
break OUTER;
}
HttpRequestOptions options = findOptionsIn(method, args);
if (options != null) {
optionsBinder.addEntityToRequest(options, request);
}
if (request.getEntity() == null) {
Map<Integer, Set<Annotation>> indexToEntityAnnotation = getIndexToEntityAnnotation(method);
if (indexToEntityAnnotation.size() == 1) {
Entry<Integer, Set<Annotation>> entry = indexToEntityAnnotation.entrySet()
.iterator().next();
EntityParam entityAnnotation = (EntityParam) entry.getValue().iterator().next();
Object entity = args[entry.getKey()];
EntityBinder binder = injector.getInstance(entityAnnotation.value());
binder.addEntityToRequest(entity, request);
} else if (indexToEntityAnnotation.size() > 1) {
throw new IllegalStateException("cannot have multiple @Entity annotations on "
+ method);
} else {
request.getHeaders().replaceValues(HttpHeaders.CONTENT_LENGTH,
Lists.newArrayList("0"));
}
HttpRequestOptions options = findOptionsIn(method, args);
if (options != null) {
optionsBinder.addEntityToRequest(options, request);
}
if (request.getEntity() == null) {
Map<Integer, Set<Annotation>> indexToEntityAnnotation = getIndexToEntityAnnotation(method);
if (indexToEntityAnnotation.size() == 1) {
Entry<Integer, Set<Annotation>> entry = indexToEntityAnnotation.entrySet()
.iterator().next();
EntityParam entityAnnotation = (EntityParam) entry.getValue().iterator().next();
Object entity = args[entry.getKey()];
EntityBinder binder = injector.getInstance(entityAnnotation.value());
binder.addEntityToRequest(entity, request);
} else if (indexToEntityAnnotation.size() > 1) {
throw new IllegalStateException("cannot have multiple @Entity annotations on "
+ method);
} else {
request.getHeaders().replaceValues(HttpHeaders.CONTENT_LENGTH,
Lists.newArrayList("0"));
}
}
break;
}
}
return request;
}

View File

@ -34,7 +34,6 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.jclouds.http.HttpCommand;
import org.jclouds.http.HttpMethod;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.HttpResponse;
import org.jclouds.http.TransformingHttpCommandExecutorServiceImpl;
@ -137,7 +136,7 @@ public class BackoffLimitedRetryHandlerTest {
assertEquals(response.getContent().read(), -1);
}
private final HttpRequest request = new HttpRequest(HttpMethod.HEAD, END_POINT);
private final HttpRequest request = new HttpRequest("HEAD", END_POINT);
private HttpCommand createCommand() {
HttpCommand command = new TransformingHttpCommandImpl<String>(executorService, request,

View File

@ -27,6 +27,10 @@ import static com.google.common.base.Preconditions.checkNotNull;
import static org.testng.Assert.assertEquals;
import java.io.UnsupportedEncodingException;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.URLEncoder;
@ -37,6 +41,7 @@ import java.util.concurrent.Future;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.HttpMethod;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
@ -45,7 +50,6 @@ import javax.ws.rs.PathParam;
import org.jclouds.concurrent.WithinThreadExecutorService;
import org.jclouds.concurrent.config.ExecutorServiceModule;
import org.jclouds.http.HttpException;
import org.jclouds.http.HttpMethod;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.HttpRequestFilter;
import org.jclouds.http.HttpResponse;
@ -80,6 +84,28 @@ import com.google.inject.name.Names;
@Test(groups = "unit", testName = "jaxrs.JaxrsUtilTest")
public class JaxrsAnnotationProcessorTest {
@Target( { ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@javax.ws.rs.HttpMethod("FOO")
public @interface FOO {
}
public class TestCustomMethod {
@FOO
public void foo() {
}
}
public void testCustomMethod() throws SecurityException, NoSuchMethodException {
Method method = TestCustomMethod.class.getMethod("foo");
URI endpoint = URI.create("http://localhost");
HttpRequest httpMethod = factory.create(TestCustomMethod.class).createRequest(endpoint,
method, new Object[] {});
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
assertEquals(httpMethod.getEndpoint().getPath(), "");
assertEquals(httpMethod.getMethod(), "FOO");
}
public class TestPost {
@POST
public void post(@EntityParam String content) {

View File

@ -40,10 +40,10 @@ import java.util.Date;
import java.util.List;
import java.util.concurrent.ExecutorService;
import javax.ws.rs.HttpMethod;
import javax.ws.rs.core.HttpHeaders;
import org.apache.commons.io.IOUtils;
import org.jclouds.http.HttpMethod;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.HttpResponse;
import org.jclouds.http.handlers.DelegatingErrorHandler;

View File

@ -23,7 +23,7 @@
*/
package org.jclouds.rackspace.cloudservers.domain;
import org.jclouds.http.HttpMethod;
import javax.ws.rs.HttpMethod;
/**
*

View File

@ -27,9 +27,9 @@ import static org.jclouds.rackspace.cloudservers.options.CreateServerOptions.Bui
import static org.jclouds.rackspace.cloudservers.options.CreateServerOptions.Builder.withMetadata;
import static org.jclouds.rackspace.cloudservers.options.CreateServerOptions.Builder.withSharedIpGroup;
import static org.jclouds.rackspace.cloudservers.options.CreateSharedIpGroupOptions.Builder.withServer;
import static org.jclouds.rackspace.cloudservers.options.RebuildServerOptions.Builder.withImage;
import static org.jclouds.rackspace.cloudservers.options.ListOptions.Builder.changesSince;
import static org.jclouds.rackspace.cloudservers.options.ListOptions.Builder.withDetails;
import static org.jclouds.rackspace.cloudservers.options.RebuildServerOptions.Builder.withImage;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
@ -39,12 +39,12 @@ import java.net.URI;
import java.net.UnknownHostException;
import java.util.Collections;
import javax.ws.rs.HttpMethod;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import org.jclouds.concurrent.WithinThreadExecutorService;
import org.jclouds.concurrent.config.ExecutorServiceModule;
import org.jclouds.http.HttpMethod;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule;
import org.jclouds.http.functions.ReturnFalseOn404;

View File

@ -28,10 +28,10 @@ import static org.testng.Assert.assertEquals;
import java.io.File;
import java.net.URI;
import org.jclouds.http.HttpMethod;
import javax.ws.rs.HttpMethod;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.config.ParserModule;
import org.jclouds.rackspace.cloudservers.binders.ChangeAdminPassBinder;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;

View File

@ -28,10 +28,10 @@ import static org.testng.Assert.assertEquals;
import java.io.File;
import java.net.URI;
import org.jclouds.http.HttpMethod;
import javax.ws.rs.HttpMethod;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.config.ParserModule;
import org.jclouds.rackspace.cloudservers.binders.ChangeServerNameBinder;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;

View File

@ -28,10 +28,10 @@ import static org.testng.Assert.assertEquals;
import java.io.File;
import java.net.URI;
import org.jclouds.http.HttpMethod;
import javax.ws.rs.HttpMethod;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.config.ParserModule;
import org.jclouds.rackspace.cloudservers.binders.CreateImageBinder;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;

View File

@ -28,10 +28,10 @@ import static org.testng.Assert.assertEquals;
import java.io.File;
import java.net.URI;
import org.jclouds.http.HttpMethod;
import javax.ws.rs.HttpMethod;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.config.ParserModule;
import org.jclouds.rackspace.cloudservers.binders.RebootTypeBinder;
import org.jclouds.rackspace.cloudservers.domain.RebootType;
import org.testng.annotations.Test;

View File

@ -23,13 +23,17 @@
*/
package org.jclouds.rackspace.cloudservers.options;
import static org.jclouds.rackspace.cloudservers.options.CreateServerOptions.Builder.withFile;
import static org.jclouds.rackspace.cloudservers.options.CreateServerOptions.Builder.withSharedIp;
import static org.jclouds.rackspace.cloudservers.options.CreateServerOptions.Builder.withSharedIpGroup;
import static org.testng.Assert.assertEquals;
import java.net.InetAddress;
import java.net.URI;
import java.net.UnknownHostException;
import org.jclouds.http.HttpMethod;
import javax.ws.rs.HttpMethod;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.config.ParserModule;
import org.testng.annotations.Test;
@ -37,7 +41,6 @@ import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
import com.google.inject.Guice;
import com.google.inject.Injector;
import static org.jclouds.rackspace.cloudservers.options.CreateServerOptions.Builder.*;
/**
* Tests behavior of {@code ParseFlavorFromGsonResponse}

View File

@ -28,7 +28,8 @@ import static org.testng.Assert.assertEquals;
import java.net.URI;
import org.jclouds.http.HttpMethod;
import javax.ws.rs.HttpMethod;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.config.ParserModule;
import org.testng.annotations.Test;

View File

@ -29,7 +29,8 @@ import static org.testng.Assert.assertEquals;
import java.net.URI;
import java.util.HashMap;
import org.jclouds.http.HttpMethod;
import javax.ws.rs.HttpMethod;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.config.ParserModule;
import org.testng.annotations.Test;

View File

@ -29,9 +29,10 @@ import java.lang.reflect.Method;
import java.net.URI;
import java.util.Collections;
import javax.ws.rs.HttpMethod;
import org.jclouds.concurrent.WithinThreadExecutorService;
import org.jclouds.concurrent.config.ExecutorServiceModule;
import org.jclouds.http.HttpMethod;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule;
import org.jclouds.rackspace.functions.ParseAuthenticationResponseFromHeaders;