mirror of https://github.com/apache/jclouds.git
Issue 76: added FormParam support
git-svn-id: http://jclouds.googlecode.com/svn/trunk@2233 3d8758e0-26b5-11de-8745-db77d3ebf521
This commit is contained in:
parent
8fab264dd4
commit
7f3e658953
|
@ -29,6 +29,8 @@ import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.ws.rs.core.HttpHeaders;
|
||||||
|
|
||||||
import org.jclouds.command.Request;
|
import org.jclouds.command.Request;
|
||||||
|
|
||||||
import com.google.common.collect.Multimap;
|
import com.google.common.collect.Multimap;
|
||||||
|
@ -107,6 +109,10 @@ public class HttpRequest extends HttpMessage implements Request<URI> {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setEntity(Object content) {
|
public void setEntity(Object content) {
|
||||||
|
if (content instanceof String
|
||||||
|
&& this.getFirstHeaderOrNull(HttpHeaders.CONTENT_LENGTH) == null) {
|
||||||
|
getHeaders().put(HttpHeaders.CONTENT_LENGTH, content.toString().getBytes().length + "");
|
||||||
|
}
|
||||||
this.entity = content;
|
this.entity = content;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ package org.jclouds.http.options;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
import com.google.common.collect.HashMultimap;
|
import com.google.common.collect.LinkedHashMultimap;
|
||||||
import com.google.common.collect.Multimap;
|
import com.google.common.collect.Multimap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -36,9 +36,10 @@ import com.google.common.collect.Multimap;
|
||||||
*/
|
*/
|
||||||
public class BaseHttpRequestOptions implements HttpRequestOptions {
|
public class BaseHttpRequestOptions implements HttpRequestOptions {
|
||||||
|
|
||||||
protected Multimap<String, String> matrixParameters = HashMultimap.create();
|
protected Multimap<String, String> matrixParameters = LinkedHashMultimap.create();
|
||||||
protected Multimap<String, String> queryParameters = HashMultimap.create();
|
protected Multimap<String, String> formParameters = LinkedHashMultimap.create();
|
||||||
protected Multimap<String, String> headers = HashMultimap.create();
|
protected Multimap<String, String> queryParameters = LinkedHashMultimap.create();
|
||||||
|
protected Multimap<String, String> headers = LinkedHashMultimap.create();
|
||||||
protected String entity;
|
protected String entity;
|
||||||
protected String pathSuffix;
|
protected String pathSuffix;
|
||||||
|
|
||||||
|
@ -56,6 +57,11 @@ public class BaseHttpRequestOptions implements HttpRequestOptions {
|
||||||
return (values != null && values.size() >= 1) ? values.iterator().next() : null;
|
return (values != null && values.size() >= 1) ? values.iterator().next() : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected String getFirstFormOrNull(String string) {
|
||||||
|
Collection<String> values = formParameters.get(string);
|
||||||
|
return (values != null && values.size() >= 1) ? values.iterator().next() : null;
|
||||||
|
}
|
||||||
|
|
||||||
protected String getFirstHeaderOrNull(String string) {
|
protected String getFirstHeaderOrNull(String string) {
|
||||||
Collection<String> values = headers.get(string);
|
Collection<String> values = headers.get(string);
|
||||||
return (values != null && values.size() >= 1) ? values.iterator().next() : null;
|
return (values != null && values.size() >= 1) ? values.iterator().next() : null;
|
||||||
|
@ -91,4 +97,8 @@ public class BaseHttpRequestOptions implements HttpRequestOptions {
|
||||||
return pathSuffix;
|
return pathSuffix;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Multimap<String, String> buildFormParameters() {
|
||||||
|
return formParameters;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -43,10 +43,17 @@ public interface HttpRequestOptions {
|
||||||
/**
|
/**
|
||||||
* Builds query parameters representing options.
|
* Builds query parameters representing options.
|
||||||
*
|
*
|
||||||
* @return multimap that may contain query parameters.
|
* @return map that may contain query parameters.
|
||||||
*/
|
*/
|
||||||
Multimap<String, String> buildQueryParameters();
|
Multimap<String, String> buildQueryParameters();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds form parameters representing options.
|
||||||
|
*
|
||||||
|
* @return map that may contain query parameters.
|
||||||
|
*/
|
||||||
|
Multimap<String, String> buildFormParameters();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Builds matrix parameters representing options.
|
* Builds matrix parameters representing options.
|
||||||
*
|
*
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.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.rest.annotations;
|
||||||
|
|
||||||
|
import static java.lang.annotation.ElementType.METHOD;
|
||||||
|
import static java.lang.annotation.ElementType.TYPE;
|
||||||
|
import static java.lang.annotation.RetentionPolicy.RUNTIME;
|
||||||
|
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
import javax.ws.rs.FormParam;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Designates that a url encoded form will be added to the request.
|
||||||
|
*
|
||||||
|
* @see FormParam
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Target( { TYPE, METHOD })
|
||||||
|
@Retention(RUNTIME)
|
||||||
|
public @interface FormParams {
|
||||||
|
|
||||||
|
public static final String NULL = "FORM_NULL";
|
||||||
|
|
||||||
|
String[] keys();
|
||||||
|
|
||||||
|
String[] values() default NULL;
|
||||||
|
}
|
|
@ -25,11 +25,15 @@ package org.jclouds.rest.internal;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
import javax.ws.rs.core.UriBuilder;
|
import javax.ws.rs.core.UriBuilder;
|
||||||
|
|
||||||
import org.jclouds.http.HttpRequest;
|
import org.jclouds.http.HttpRequest;
|
||||||
|
|
||||||
|
import com.google.inject.internal.Nullable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a request generated from annotations
|
* Represents a request generated from annotations
|
||||||
*
|
*
|
||||||
|
@ -72,11 +76,12 @@ public class GeneratedHttpRequest<T> extends HttpRequest {
|
||||||
replacePath(builder.build().getPath());
|
replacePath(builder.build().getPath());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void replaceQueryParam(String name, Object... values) {
|
public void addQueryParam(String name, String... values) {
|
||||||
UriBuilder builder = UriBuilder.fromUri(getEndpoint());
|
setEndpoint(RestAnnotationProcessor.addQueryParam(getEndpoint(), name, values));
|
||||||
builder.replaceQueryParam(name, values);
|
}
|
||||||
URI newEndpoint = processor.replaceQuery(getEndpoint(), builder.build().getQuery());
|
|
||||||
setEndpoint(newEndpoint);
|
public void replaceQuery(String query, @Nullable Comparator<Entry<String, String>> sorter) {
|
||||||
|
setEndpoint(RestAnnotationProcessor.replaceQuery(getEndpoint(), query, sorter));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void replacePath(String path) {
|
public void replacePath(String path) {
|
||||||
|
@ -84,4 +89,8 @@ public class GeneratedHttpRequest<T> extends HttpRequest {
|
||||||
builder.replacePath(path);
|
builder.replacePath(path);
|
||||||
setEndpoint(builder.build());
|
setEndpoint(builder.build());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addFormParam(String name, String... values) {
|
||||||
|
this.setEntity(RestAnnotationProcessor.addFormParam(getEntity().toString(), name, values));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,18 +28,20 @@ import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static com.google.common.base.Preconditions.checkState;
|
import static com.google.common.base.Preconditions.checkState;
|
||||||
|
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.UnsupportedEncodingException;
|
|
||||||
import java.lang.annotation.Annotation;
|
import java.lang.annotation.Annotation;
|
||||||
|
import java.lang.reflect.Array;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.SortedSet;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.concurrent.Future;
|
import java.util.concurrent.Future;
|
||||||
|
|
||||||
|
@ -48,12 +50,14 @@ import javax.inject.Inject;
|
||||||
import javax.inject.Named;
|
import javax.inject.Named;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
import javax.ws.rs.Consumes;
|
import javax.ws.rs.Consumes;
|
||||||
|
import javax.ws.rs.FormParam;
|
||||||
import javax.ws.rs.HeaderParam;
|
import javax.ws.rs.HeaderParam;
|
||||||
import javax.ws.rs.MatrixParam;
|
import javax.ws.rs.MatrixParam;
|
||||||
import javax.ws.rs.PathParam;
|
import javax.ws.rs.PathParam;
|
||||||
import javax.ws.rs.Produces;
|
import javax.ws.rs.Produces;
|
||||||
import javax.ws.rs.QueryParam;
|
import javax.ws.rs.QueryParam;
|
||||||
import javax.ws.rs.core.HttpHeaders;
|
import javax.ws.rs.core.HttpHeaders;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
import javax.ws.rs.core.UriBuilder;
|
import javax.ws.rs.core.UriBuilder;
|
||||||
import javax.ws.rs.core.UriBuilderException;
|
import javax.ws.rs.core.UriBuilderException;
|
||||||
|
|
||||||
|
@ -75,6 +79,7 @@ import org.jclouds.rest.InvocationContext;
|
||||||
import org.jclouds.rest.annotations.BinderParam;
|
import org.jclouds.rest.annotations.BinderParam;
|
||||||
import org.jclouds.rest.annotations.Endpoint;
|
import org.jclouds.rest.annotations.Endpoint;
|
||||||
import org.jclouds.rest.annotations.ExceptionParser;
|
import org.jclouds.rest.annotations.ExceptionParser;
|
||||||
|
import org.jclouds.rest.annotations.FormParams;
|
||||||
import org.jclouds.rest.annotations.Headers;
|
import org.jclouds.rest.annotations.Headers;
|
||||||
import org.jclouds.rest.annotations.HostPrefixParam;
|
import org.jclouds.rest.annotations.HostPrefixParam;
|
||||||
import org.jclouds.rest.annotations.MapBinder;
|
import org.jclouds.rest.annotations.MapBinder;
|
||||||
|
@ -88,12 +93,15 @@ import org.jclouds.rest.annotations.ResponseParser;
|
||||||
import org.jclouds.rest.annotations.SkipEncoding;
|
import org.jclouds.rest.annotations.SkipEncoding;
|
||||||
import org.jclouds.rest.annotations.VirtualHost;
|
import org.jclouds.rest.annotations.VirtualHost;
|
||||||
import org.jclouds.rest.annotations.XMLResponseParser;
|
import org.jclouds.rest.annotations.XMLResponseParser;
|
||||||
|
import org.jclouds.util.Utils;
|
||||||
|
|
||||||
import com.google.common.annotations.VisibleForTesting;
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
import com.google.common.base.Predicate;
|
import com.google.common.base.Predicate;
|
||||||
import com.google.common.collect.Collections2;
|
import com.google.common.collect.Collections2;
|
||||||
import com.google.common.collect.HashMultimap;
|
import com.google.common.collect.LinkedHashMultimap;
|
||||||
|
import com.google.common.collect.LinkedListMultimap;
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.MapMaker;
|
import com.google.common.collect.MapMaker;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
import com.google.common.collect.Multimap;
|
import com.google.common.collect.Multimap;
|
||||||
|
@ -101,7 +109,7 @@ import com.google.common.collect.Sets;
|
||||||
import com.google.inject.Injector;
|
import com.google.inject.Injector;
|
||||||
import com.google.inject.Key;
|
import com.google.inject.Key;
|
||||||
import com.google.inject.TypeLiteral;
|
import com.google.inject.TypeLiteral;
|
||||||
import com.google.inject.internal.Lists;
|
import com.google.inject.internal.Nullable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests behavior of JaxrsUtil
|
* Tests behavior of JaxrsUtil
|
||||||
|
@ -121,6 +129,7 @@ public class RestAnnotationProcessor<T> {
|
||||||
private final Map<Method, Map<Integer, Set<Annotation>>> methodToIndexOfParamToHostPrefixParamAnnotations = createMethodToIndexOfParamToAnnotation(HostPrefixParam.class);
|
private final Map<Method, Map<Integer, Set<Annotation>>> methodToIndexOfParamToHostPrefixParamAnnotations = createMethodToIndexOfParamToAnnotation(HostPrefixParam.class);
|
||||||
private final Map<Method, Map<Integer, Set<Annotation>>> methodToindexOfParamToEndpointAnnotations = createMethodToIndexOfParamToAnnotation(Endpoint.class);
|
private final Map<Method, Map<Integer, Set<Annotation>>> methodToindexOfParamToEndpointAnnotations = createMethodToIndexOfParamToAnnotation(Endpoint.class);
|
||||||
private final Map<Method, Map<Integer, Set<Annotation>>> methodToindexOfParamToMatrixParamAnnotations = createMethodToIndexOfParamToAnnotation(MatrixParam.class);
|
private final Map<Method, Map<Integer, Set<Annotation>>> methodToindexOfParamToMatrixParamAnnotations = createMethodToIndexOfParamToAnnotation(MatrixParam.class);
|
||||||
|
private final Map<Method, Map<Integer, Set<Annotation>>> methodToindexOfParamToFormParamAnnotations = createMethodToIndexOfParamToAnnotation(FormParam.class);
|
||||||
private final Map<Method, Map<Integer, Set<Annotation>>> methodToindexOfParamToQueryParamAnnotations = createMethodToIndexOfParamToAnnotation(QueryParam.class);
|
private final Map<Method, Map<Integer, Set<Annotation>>> methodToindexOfParamToQueryParamAnnotations = createMethodToIndexOfParamToAnnotation(QueryParam.class);
|
||||||
private final Map<Method, Map<Integer, Set<Annotation>>> methodToindexOfParamToPathParamAnnotations = createMethodToIndexOfParamToAnnotation(PathParam.class);
|
private final Map<Method, Map<Integer, Set<Annotation>>> methodToindexOfParamToPathParamAnnotations = createMethodToIndexOfParamToAnnotation(PathParam.class);
|
||||||
private final Map<Method, Map<Integer, Set<Annotation>>> methodToindexOfParamToPostParamAnnotations = createMethodToIndexOfParamToAnnotation(MapEntityParam.class);
|
private final Map<Method, Map<Integer, Set<Annotation>>> methodToindexOfParamToPostParamAnnotations = createMethodToIndexOfParamToAnnotation(MapEntityParam.class);
|
||||||
|
@ -183,6 +192,8 @@ public class RestAnnotationProcessor<T> {
|
||||||
|
|
||||||
private final ParseSax.Factory parserFactory;
|
private final ParseSax.Factory parserFactory;
|
||||||
|
|
||||||
|
private char[] skips;
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public Function<HttpResponse, ?> createResponseParser(Method method,
|
public Function<HttpResponse, ?> createResponseParser(Method method,
|
||||||
GeneratedHttpRequest<T> request) {
|
GeneratedHttpRequest<T> request) {
|
||||||
|
@ -217,9 +228,9 @@ public class RestAnnotationProcessor<T> {
|
||||||
this.parserFactory = parserFactory;
|
this.parserFactory = parserFactory;
|
||||||
seedCache(declaring);
|
seedCache(declaring);
|
||||||
if (declaring.isAnnotationPresent(SkipEncoding.class)) {
|
if (declaring.isAnnotationPresent(SkipEncoding.class)) {
|
||||||
skipEncode = declaring.getAnnotation(SkipEncoding.class).value();
|
skips = declaring.getAnnotation(SkipEncoding.class).value();
|
||||||
} else {
|
} else {
|
||||||
skipEncode = new char[] {};
|
skips = new char[] {};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -237,6 +248,7 @@ public class RestAnnotationProcessor<T> {
|
||||||
methodToIndexOfParamToHeaderParamAnnotations.get(method).get(index);
|
methodToIndexOfParamToHeaderParamAnnotations.get(method).get(index);
|
||||||
methodToIndexOfParamToHostPrefixParamAnnotations.get(method).get(index);
|
methodToIndexOfParamToHostPrefixParamAnnotations.get(method).get(index);
|
||||||
methodToindexOfParamToMatrixParamAnnotations.get(method).get(index);
|
methodToindexOfParamToMatrixParamAnnotations.get(method).get(index);
|
||||||
|
methodToindexOfParamToFormParamAnnotations.get(method).get(index);
|
||||||
methodToindexOfParamToQueryParamAnnotations.get(method).get(index);
|
methodToindexOfParamToQueryParamAnnotations.get(method).get(index);
|
||||||
methodToindexOfParamToEndpointAnnotations.get(method).get(index);
|
methodToindexOfParamToEndpointAnnotations.get(method).get(index);
|
||||||
methodToindexOfParamToPathParamAnnotations.get(method).get(index);
|
methodToindexOfParamToPathParamAnnotations.get(method).get(index);
|
||||||
|
@ -297,7 +309,6 @@ public class RestAnnotationProcessor<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
final Injector injector;
|
final Injector injector;
|
||||||
final char[] skipEncode;
|
|
||||||
|
|
||||||
public GeneratedHttpRequest<T> createRequest(Method method, Object... args) {
|
public GeneratedHttpRequest<T> createRequest(Method method, Object... args) {
|
||||||
URI endpoint = getEndpointFor(method, args);
|
URI endpoint = getEndpointFor(method, args);
|
||||||
|
@ -309,9 +320,11 @@ public class RestAnnotationProcessor<T> {
|
||||||
builder.path(method);
|
builder.path(method);
|
||||||
|
|
||||||
Multimap<String, String> tokenValues = encodeValues(getPathParamKeyValues(method, args),
|
Multimap<String, String> tokenValues = encodeValues(getPathParamKeyValues(method, args),
|
||||||
skipEncode);
|
skips);
|
||||||
|
|
||||||
|
Multimap<String, String> formParams = addFormParams(tokenValues.entries(), method, args);
|
||||||
|
Multimap<String, String> queryParams = addQueryParams(tokenValues.entries(), method, args);
|
||||||
|
|
||||||
addQueryParams(builder, tokenValues.entries(), method, args);
|
|
||||||
addMatrixParams(builder, tokenValues.entries(), method, args);
|
addMatrixParams(builder, tokenValues.entries(), method, args);
|
||||||
|
|
||||||
Multimap<String, String> headers = buildHeaders(tokenValues.entries(), method, args);
|
Multimap<String, String> headers = buildHeaders(tokenValues.entries(), method, args);
|
||||||
|
@ -323,22 +336,26 @@ public class RestAnnotationProcessor<T> {
|
||||||
for (Entry<String, String> header : options.buildRequestHeaders().entries()) {
|
for (Entry<String, String> header : options.buildRequestHeaders().entries()) {
|
||||||
headers.put(header.getKey(), replaceTokens(header.getValue(), tokenValues.entries()));
|
headers.put(header.getKey(), replaceTokens(header.getValue(), tokenValues.entries()));
|
||||||
}
|
}
|
||||||
for (Entry<String, String> query : options.buildQueryParameters().entries()) {
|
|
||||||
builder.queryParam(query.getKey(), replaceTokens(query.getValue(), tokenValues
|
|
||||||
.entries()));
|
|
||||||
}
|
|
||||||
for (Entry<String, String> matrix : options.buildMatrixParameters().entries()) {
|
for (Entry<String, String> matrix : options.buildMatrixParameters().entries()) {
|
||||||
builder.matrixParam(matrix.getKey(), replaceTokens(matrix.getValue(), tokenValues
|
builder.matrixParam(matrix.getKey(), replaceTokens(matrix.getValue(), tokenValues
|
||||||
.entries()));
|
.entries()));
|
||||||
}
|
}
|
||||||
|
for (Entry<String, String> query : options.buildQueryParameters().entries()) {
|
||||||
|
queryParams.put(query.getKey(), replaceTokens(query.getValue(), tokenValues.entries()));
|
||||||
|
}
|
||||||
|
for (Entry<String, String> form : options.buildFormParameters().entries()) {
|
||||||
|
formParams.put(form.getKey(), replaceTokens(form.getValue(), tokenValues.entries()));
|
||||||
|
}
|
||||||
|
|
||||||
String pathSuffix = options.buildPathSuffix();
|
String pathSuffix = options.buildPathSuffix();
|
||||||
if (pathSuffix != null) {
|
if (pathSuffix != null) {
|
||||||
builder.path(pathSuffix);
|
builder.path(pathSuffix);
|
||||||
}
|
}
|
||||||
stringEntity = options.buildStringEntity();
|
stringEntity = options.buildStringEntity();
|
||||||
if (stringEntity != null) {
|
}
|
||||||
headers.put(HttpHeaders.CONTENT_LENGTH, stringEntity.getBytes().length + "");
|
|
||||||
}
|
if (queryParams.size() > 0) {
|
||||||
|
builder.replaceQuery(makeQueryLine(queryParams, null, skips));
|
||||||
}
|
}
|
||||||
|
|
||||||
URI endPoint;
|
URI endPoint;
|
||||||
|
@ -350,14 +367,21 @@ public class RestAnnotationProcessor<T> {
|
||||||
throw new IllegalStateException(e);
|
throw new IllegalStateException(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
endPoint = replaceQuery(endPoint, endPoint.getQuery());
|
|
||||||
|
|
||||||
GeneratedHttpRequest<T> request = new GeneratedHttpRequest<T>(httpMethod, endPoint, this,
|
GeneratedHttpRequest<T> request = new GeneratedHttpRequest<T>(httpMethod, endPoint, this,
|
||||||
declaring, method, args);
|
declaring, method, args);
|
||||||
addHostHeaderIfAnnotatedWithVirtualHost(headers, request.getEndpoint().getHost(), method);
|
addHostHeaderIfAnnotatedWithVirtualHost(headers, request.getEndpoint().getHost(), method);
|
||||||
addFiltersIfAnnotated(method, request);
|
addFiltersIfAnnotated(method, request);
|
||||||
|
|
||||||
|
if (formParams.size() > 0) {
|
||||||
|
if (headers.get(HttpHeaders.CONTENT_TYPE) != null)
|
||||||
|
headers.put(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED);
|
||||||
|
request.setEntity(makeQueryLine(formParams, null, skips));
|
||||||
|
}
|
||||||
|
|
||||||
if (stringEntity != null) {
|
if (stringEntity != null) {
|
||||||
request.setEntity(stringEntity);
|
request.setEntity(stringEntity);
|
||||||
|
if (headers.get(HttpHeaders.CONTENT_LENGTH) != null)
|
||||||
|
headers.put(HttpHeaders.CONTENT_LENGTH, stringEntity.getBytes().length + "");
|
||||||
if (headers.get(HttpHeaders.CONTENT_TYPE) != null)
|
if (headers.get(HttpHeaders.CONTENT_TYPE) != null)
|
||||||
headers.put(HttpHeaders.CONTENT_TYPE, "application/unknown");
|
headers.put(HttpHeaders.CONTENT_TYPE, "application/unknown");
|
||||||
}
|
}
|
||||||
|
@ -366,18 +390,61 @@ public class RestAnnotationProcessor<T> {
|
||||||
return request;
|
return request;
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
public static URI replaceQuery(URI in, String newQuery,
|
||||||
URI replaceQuery(URI endPoint, String query) {
|
@Nullable Comparator<Entry<String, String>> sorter, char... skips) {
|
||||||
return replaceQuery(endPoint, query, skipEncode);
|
UriBuilder builder = UriBuilder.fromUri(in);
|
||||||
|
builder.replaceQuery(makeQueryLine(parseQueryToMap(newQuery), sorter, skips));
|
||||||
|
return builder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
public static URI addQueryParam(URI in, String key, String[] values, char... skips) {
|
||||||
static URI replaceQuery(URI endPoint, String query, char... skipEncode) {
|
UriBuilder builder = UriBuilder.fromUri(in);
|
||||||
UriBuilder qbuilder = UriBuilder.fromUri(endPoint);
|
Multimap<String, String> map = parseQueryToMap(in.getQuery());
|
||||||
String unencodedQuery = query == null ? null : unEncode(query, skipEncode);
|
map.putAll(key, Arrays.asList(values));
|
||||||
qbuilder.replaceQuery(unencodedQuery);
|
builder.replaceQuery(makeQueryLine(map, null, skips));
|
||||||
endPoint = qbuilder.build();
|
return builder.build();
|
||||||
return endPoint;
|
}
|
||||||
|
|
||||||
|
public static String addFormParam(String in, String key, String[] values, char... skips) {
|
||||||
|
Multimap<String, String> map = parseQueryToMap(in);
|
||||||
|
map.putAll(key, Arrays.asList(values));
|
||||||
|
return makeQueryLine(map, null, skips);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Multimap<String, String> parseQueryToMap(String in) {
|
||||||
|
Multimap<String, String> map = LinkedListMultimap.create();
|
||||||
|
String[] parts = Utils.urlDecode(in).split("&");
|
||||||
|
for (int partIndex = 0; partIndex < parts.length; partIndex++) {
|
||||||
|
String[] keyValue = parts[partIndex].split("=");
|
||||||
|
map.put(keyValue[0], keyValue.length == 2 ? keyValue[1] : null);
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SortedSet<Entry<String, String>> sortEntries(
|
||||||
|
Collection<Map.Entry<String, String>> in, Comparator<Map.Entry<String, String>> sorter) {
|
||||||
|
SortedSet<Entry<String, String>> entries = Sets.newTreeSet(sorter);
|
||||||
|
entries.addAll(in);
|
||||||
|
return entries;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String makeQueryLine(Multimap<String, String> params,
|
||||||
|
@Nullable Comparator<Map.Entry<String, String>> sorter, char... skips) {
|
||||||
|
|
||||||
|
Iterator<Map.Entry<String, String>> pairs = ((sorter == null) ? params.entries()
|
||||||
|
: sortEntries(params.entries(), sorter)).iterator();
|
||||||
|
StringBuilder formBuilder = new StringBuilder();
|
||||||
|
while (pairs.hasNext()) {
|
||||||
|
Map.Entry<String, String> pair = pairs.next();
|
||||||
|
formBuilder.append(Utils.urlEncode(pair.getKey(), skips));
|
||||||
|
if (pair.getValue() != null && !pair.getValue().equals("")) {
|
||||||
|
formBuilder.append("=");
|
||||||
|
formBuilder.append(Utils.urlEncode(pair.getValue(), skips));
|
||||||
|
}
|
||||||
|
if (pairs.hasNext())
|
||||||
|
formBuilder.append("&");
|
||||||
|
}
|
||||||
|
return formBuilder.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addMatrixParams(UriBuilder builder, Collection<Entry<String, String>> tokenValues,
|
private void addMatrixParams(UriBuilder builder, Collection<Entry<String, String>> tokenValues,
|
||||||
|
@ -397,30 +464,64 @@ public class RestAnnotationProcessor<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addQueryParams(UriBuilder builder, Collection<Entry<String, String>> tokenValues,
|
private Multimap<String, String> addFormParams(Collection<Entry<String, String>> tokenValues,
|
||||||
Method method, Object... args) {
|
Method method, Object... args) {
|
||||||
|
Multimap<String, String> formMap = LinkedListMultimap.create();
|
||||||
|
if (declaring.isAnnotationPresent(FormParams.class)) {
|
||||||
|
FormParams form = declaring.getAnnotation(FormParams.class);
|
||||||
|
addForm(formMap, form, tokenValues);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (method.isAnnotationPresent(FormParams.class)) {
|
||||||
|
FormParams form = method.getAnnotation(FormParams.class);
|
||||||
|
addForm(formMap, form, tokenValues);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Entry<String, String> form : getFormParamKeyValues(method, args).entries()) {
|
||||||
|
formMap.put(form.getKey(), replaceTokens(form.getValue(), tokenValues));
|
||||||
|
}
|
||||||
|
return formMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Multimap<String, String> addQueryParams(Collection<Entry<String, String>> tokenValues,
|
||||||
|
Method method, Object... args) {
|
||||||
|
Multimap<String, String> queryMap = LinkedListMultimap.create();
|
||||||
if (declaring.isAnnotationPresent(QueryParams.class)) {
|
if (declaring.isAnnotationPresent(QueryParams.class)) {
|
||||||
QueryParams query = declaring.getAnnotation(QueryParams.class);
|
QueryParams query = declaring.getAnnotation(QueryParams.class);
|
||||||
addQuery(builder, query, tokenValues);
|
addQuery(queryMap, query, tokenValues);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (method.isAnnotationPresent(QueryParams.class)) {
|
if (method.isAnnotationPresent(QueryParams.class)) {
|
||||||
QueryParams query = method.getAnnotation(QueryParams.class);
|
QueryParams query = method.getAnnotation(QueryParams.class);
|
||||||
addQuery(builder, query, tokenValues);
|
addQuery(queryMap, query, tokenValues);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Entry<String, String> query : getQueryParamKeyValues(method, args).entries()) {
|
for (Entry<String, String> query : getQueryParamKeyValues(method, args).entries()) {
|
||||||
builder.queryParam(query.getKey(), replaceTokens(query.getValue(), tokenValues));
|
queryMap.put(query.getKey(), replaceTokens(query.getValue(), tokenValues));
|
||||||
|
}
|
||||||
|
return queryMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addForm(Multimap<String, String> formParams, FormParams form,
|
||||||
|
Collection<Entry<String, String>> tokenValues) {
|
||||||
|
for (int i = 0; i < form.keys().length; i++) {
|
||||||
|
if (form.values()[i].equals(FormParams.NULL)) {
|
||||||
|
formParams.removeAll(form.keys()[i]);
|
||||||
|
formParams.put(form.keys()[i], null);
|
||||||
|
} else {
|
||||||
|
formParams.put(form.keys()[i], replaceTokens(form.values()[i], tokenValues));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addQuery(UriBuilder builder, QueryParams query,
|
private void addQuery(Multimap<String, String> queryParams, QueryParams query,
|
||||||
Collection<Entry<String, String>> tokenValues) {
|
Collection<Entry<String, String>> tokenValues) {
|
||||||
for (int i = 0; i < query.keys().length; i++) {
|
for (int i = 0; i < query.keys().length; i++) {
|
||||||
if (query.values()[i].equals(QueryParams.NULL)) {
|
if (query.values()[i].equals(QueryParams.NULL)) {
|
||||||
builder.replaceQuery(query.keys()[i]);
|
queryParams.removeAll(query.keys()[i]);
|
||||||
|
queryParams.put(query.keys()[i], null);
|
||||||
} else {
|
} else {
|
||||||
builder.queryParam(query.keys()[i], replaceTokens(query.values()[i], tokenValues));
|
queryParams.put(query.keys()[i], replaceTokens(query.values()[i], tokenValues));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -583,7 +684,7 @@ public class RestAnnotationProcessor<T> {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Multimap<String, String> constants = HashMultimap.create();
|
private Multimap<String, String> constants = LinkedHashMultimap.create();
|
||||||
|
|
||||||
public boolean isHttpMethod(Method method) {
|
public boolean isHttpMethod(Method method) {
|
||||||
return IsHttpMethod.getHttpMethods(method) != null;
|
return IsHttpMethod.getHttpMethods(method) != null;
|
||||||
|
@ -629,25 +730,45 @@ public class RestAnnotationProcessor<T> {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Entry<Integer, Set<Annotation>> entry : Maps.filterValues(
|
OUTER: for (Entry<Integer, Set<Annotation>> entry : Maps.filterValues(
|
||||||
methodToIndexOfParamToDecoratorParamAnnotation.get(request.getJavaMethod()),
|
methodToIndexOfParamToDecoratorParamAnnotation.get(request.getJavaMethod()),
|
||||||
new Predicate<Set<Annotation>>() {
|
new Predicate<Set<Annotation>>() {
|
||||||
public boolean apply(Set<Annotation> input) {
|
public boolean apply(Set<Annotation> input) {
|
||||||
return input.size() >= 1;
|
return input.size() >= 1;
|
||||||
}
|
}
|
||||||
}).entrySet()) {
|
}).entrySet()) {
|
||||||
|
boolean shouldBreak = false;
|
||||||
BinderParam entityAnnotation = (BinderParam) entry.getValue().iterator().next();
|
BinderParam entityAnnotation = (BinderParam) entry.getValue().iterator().next();
|
||||||
Binder binder = injector.getInstance(entityAnnotation.value());
|
Binder binder = injector.getInstance(entityAnnotation.value());
|
||||||
Object input = request.getArgs()[entry.getKey()];
|
if (request.getArgs().length != 0) {
|
||||||
if (input.getClass().isArray()) {
|
Object input;
|
||||||
Object[] entityArray = (Object[]) input;
|
Class<?> parameterType = request.getJavaMethod().getParameterTypes()[entry.getKey()];
|
||||||
input = entityArray.length > 0 ? entityArray[0] : null;
|
Class<? extends Object> argType = request.getArgs()[entry.getKey()].getClass();
|
||||||
}
|
if (!argType.isArray() && request.getJavaMethod().isVarArgs()
|
||||||
Object oldEntity = request.getEntity();
|
&& parameterType.isArray()) {
|
||||||
binder.bindToRequest(request, input);
|
int arrayLength = request.getArgs().length
|
||||||
if (oldEntity != null && !oldEntity.equals(request.getEntity())) {
|
- request.getJavaMethod().getParameterTypes().length + 1;
|
||||||
throw new IllegalStateException(String.format(
|
if (arrayLength == 0)
|
||||||
"binder %s replaced the previous entity on request: %s", binder, request));
|
break OUTER;
|
||||||
|
input = (Object[]) Array.newInstance(request.getArgs()[entry.getKey()].getClass(),
|
||||||
|
arrayLength);
|
||||||
|
System.arraycopy(request.getArgs(), entry.getKey(), input, 0, arrayLength);
|
||||||
|
shouldBreak = true;
|
||||||
|
} else if (argType.isArray() && request.getJavaMethod().isVarArgs()
|
||||||
|
&& parameterType.isArray()) {
|
||||||
|
input = request.getArgs()[entry.getKey()];
|
||||||
|
} else {
|
||||||
|
input = request.getArgs()[entry.getKey()];
|
||||||
|
if (input.getClass().isArray()) {
|
||||||
|
Object[] entityArray = (Object[]) input;
|
||||||
|
input = entityArray.length > 0 ? entityArray[0] : null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (input != null) {
|
||||||
|
binder.bindToRequest(request, input);
|
||||||
|
}
|
||||||
|
if (shouldBreak)
|
||||||
|
break OUTER;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (request.getMethod().equals("PUT") && request.getEntity() == null) {
|
if (request.getMethod().equals("PUT") && request.getEntity() == null) {
|
||||||
|
@ -702,7 +823,7 @@ public class RestAnnotationProcessor<T> {
|
||||||
|
|
||||||
public Multimap<String, String> buildHeaders(Collection<Entry<String, String>> tokenValues,
|
public Multimap<String, String> buildHeaders(Collection<Entry<String, String>> tokenValues,
|
||||||
Method method, final Object... args) {
|
Method method, final Object... args) {
|
||||||
Multimap<String, String> headers = HashMultimap.create();
|
Multimap<String, String> headers = LinkedHashMultimap.create();
|
||||||
addHeaderIfAnnotationPresentOnMethod(headers, method, tokenValues);
|
addHeaderIfAnnotationPresentOnMethod(headers, method, tokenValues);
|
||||||
Map<Integer, Set<Annotation>> indexToHeaderParam = methodToIndexOfParamToHeaderParamAnnotations
|
Map<Integer, Set<Annotation>> indexToHeaderParam = methodToIndexOfParamToHeaderParamAnnotations
|
||||||
.get(method);
|
.get(method);
|
||||||
|
@ -770,7 +891,7 @@ public class RestAnnotationProcessor<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
private Map<String, String> convertUnsafe(Multimap<String, String> in) {
|
private Map<String, String> convertUnsafe(Multimap<String, String> in) {
|
||||||
Map<String, String> out = Maps.newHashMap();
|
Map<String, String> out = Maps.newLinkedHashMap();
|
||||||
for (Entry<String, String> entry : in.entries()) {
|
for (Entry<String, String> entry : in.entries()) {
|
||||||
out.put(entry.getKey(), entry.getValue());
|
out.put(entry.getKey(), entry.getValue());
|
||||||
}
|
}
|
||||||
|
@ -778,7 +899,7 @@ public class RestAnnotationProcessor<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
private Multimap<String, String> getPathParamKeyValues(Method method, Object... args) {
|
private Multimap<String, String> getPathParamKeyValues(Method method, Object... args) {
|
||||||
Multimap<String, String> pathParamValues = HashMultimap.create();
|
Multimap<String, String> pathParamValues = LinkedHashMultimap.create();
|
||||||
pathParamValues.putAll(constants);
|
pathParamValues.putAll(constants);
|
||||||
Map<Integer, Set<Annotation>> indexToPathParam = methodToindexOfParamToPathParamAnnotations
|
Map<Integer, Set<Annotation>> indexToPathParam = methodToindexOfParamToPathParamAnnotations
|
||||||
.get(method);
|
.get(method);
|
||||||
|
@ -811,58 +932,45 @@ public class RestAnnotationProcessor<T> {
|
||||||
return pathParamValues;
|
return pathParamValues;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Multimap<String, String> encodeValues(Multimap<String, String> unencoded,
|
private Multimap<String, String> encodeValues(Multimap<String, String> unencoded, char... skips) {
|
||||||
final char... skipEncode) {
|
Multimap<String, String> encoded = LinkedHashMultimap.create();
|
||||||
Multimap<String, String> encoded = HashMultimap.create();
|
|
||||||
for (Entry<String, String> entry : unencoded.entries()) {
|
for (Entry<String, String> entry : unencoded.entries()) {
|
||||||
try {
|
encoded.put(entry.getKey(), Utils.urlEncode(entry.getValue(), skips));
|
||||||
String value = URLEncoder.encode(entry.getValue(), "UTF-8");
|
|
||||||
// Web browsers do not always handle '+' characters well, use the well-supported
|
|
||||||
// '%20' instead.
|
|
||||||
value = value.replaceAll("\\+", "%20");
|
|
||||||
if (skipEncode.length > 0) {
|
|
||||||
value = unEncode(value, skipEncode);
|
|
||||||
}
|
|
||||||
encoded.put(entry.getKey(), value);
|
|
||||||
} catch (UnsupportedEncodingException e) {
|
|
||||||
throw new RuntimeException("jclouds only supports UTF-8", e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return encoded;
|
return encoded;
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
|
||||||
static String unEncode(String value, final char... skipEncode) {
|
|
||||||
for (char c : skipEncode) {
|
|
||||||
String toSkip = Character.toString(c);
|
|
||||||
try {
|
|
||||||
String encodedValueToSkip = URLEncoder.encode(toSkip, "UTF-8");
|
|
||||||
value = value.replaceAll(encodedValueToSkip, toSkip);
|
|
||||||
} catch (UnsupportedEncodingException e) {
|
|
||||||
throw new RuntimeException("jclouds only supports UTF-8", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Multimap<String, String> getMatrixParamKeyValues(Method method, Object... args) {
|
private Multimap<String, String> getMatrixParamKeyValues(Method method, Object... args) {
|
||||||
Multimap<String, String> queryParamValues = HashMultimap.create();
|
Multimap<String, String> matrixParamValues = LinkedHashMultimap.create();
|
||||||
queryParamValues.putAll(constants);
|
matrixParamValues.putAll(constants);
|
||||||
Map<Integer, Set<Annotation>> indexToMatrixParam = methodToindexOfParamToMatrixParamAnnotations
|
Map<Integer, Set<Annotation>> indexToMatrixParam = methodToindexOfParamToMatrixParamAnnotations
|
||||||
.get(method);
|
.get(method);
|
||||||
for (Entry<Integer, Set<Annotation>> entry : indexToMatrixParam.entrySet()) {
|
for (Entry<Integer, Set<Annotation>> entry : indexToMatrixParam.entrySet()) {
|
||||||
for (Annotation key : entry.getValue()) {
|
for (Annotation key : entry.getValue()) {
|
||||||
String paramKey = ((MatrixParam) key).value();
|
String paramKey = ((MatrixParam) key).value();
|
||||||
String paramValue = args[entry.getKey()].toString();
|
String paramValue = args[entry.getKey()].toString();
|
||||||
queryParamValues.put(paramKey, paramValue);
|
matrixParamValues.put(paramKey, paramValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return queryParamValues;
|
return matrixParamValues;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Multimap<String, String> getFormParamKeyValues(Method method, Object... args) {
|
||||||
|
Multimap<String, String> formParamValues = LinkedHashMultimap.create();
|
||||||
|
Map<Integer, Set<Annotation>> indexToFormParam = methodToindexOfParamToFormParamAnnotations
|
||||||
|
.get(method);
|
||||||
|
for (Entry<Integer, Set<Annotation>> entry : indexToFormParam.entrySet()) {
|
||||||
|
for (Annotation key : entry.getValue()) {
|
||||||
|
String paramKey = ((FormParam) key).value();
|
||||||
|
String paramValue = args[entry.getKey()].toString();
|
||||||
|
formParamValues.put(paramKey, paramValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return formParamValues;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Multimap<String, String> getQueryParamKeyValues(Method method, Object... args) {
|
private Multimap<String, String> getQueryParamKeyValues(Method method, Object... args) {
|
||||||
Multimap<String, String> queryParamValues = HashMultimap.create();
|
Multimap<String, String> queryParamValues = LinkedHashMultimap.create();
|
||||||
queryParamValues.putAll(constants);
|
|
||||||
Map<Integer, Set<Annotation>> indexToQueryParam = methodToindexOfParamToQueryParamAnnotations
|
Map<Integer, Set<Annotation>> indexToQueryParam = methodToindexOfParamToQueryParamAnnotations
|
||||||
.get(method);
|
.get(method);
|
||||||
for (Entry<Integer, Set<Annotation>> entry : indexToQueryParam.entrySet()) {
|
for (Entry<Integer, Set<Annotation>> entry : indexToQueryParam.entrySet()) {
|
||||||
|
|
|
@ -72,8 +72,8 @@ public class RestClientProxy<T> implements InvocationHandler {
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@Inject
|
@Inject
|
||||||
public RestClientProxy(Injector injector, Factory factory,
|
public RestClientProxy(Injector injector, Factory factory, RestAnnotationProcessor<T> util,
|
||||||
RestAnnotationProcessor<T> util, TypeLiteral<T> typeLiteral) {
|
TypeLiteral<T> typeLiteral) {
|
||||||
this.injector = injector;
|
this.injector = injector;
|
||||||
this.util = util;
|
this.util = util;
|
||||||
this.declaring = (Class<T>) typeLiteral.getRawType();
|
this.declaring = (Class<T>) typeLiteral.getRawType();
|
||||||
|
|
|
@ -36,6 +36,8 @@ public interface SshClient {
|
||||||
|
|
||||||
interface Factory {
|
interface Factory {
|
||||||
SshClient create(InetSocketAddress socket, String username, String password);
|
SshClient create(InetSocketAddress socket, String username, String password);
|
||||||
|
|
||||||
|
SshClient create(InetSocketAddress socket, String username, byte[] privateKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
InputStream get(String path);
|
InputStream get(String path);
|
||||||
|
|
|
@ -150,6 +150,10 @@ public class DateService {
|
||||||
return iso8601SecondsDateTimeFormatter.print(dateTime);
|
return iso8601SecondsDateTimeFormatter.print(dateTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final String iso8601SecondsDateFormat() {
|
||||||
|
return iso8601SecondsDateFormat(new DateTime());
|
||||||
|
}
|
||||||
|
|
||||||
public final String iso8601DateFormat(Date date) {
|
public final String iso8601DateFormat(Date date) {
|
||||||
return iso8601DateFormat(new DateTime(date));
|
return iso8601DateFormat(new DateTime(date));
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,9 @@ import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
|
import java.net.URLDecoder;
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
@ -39,8 +41,10 @@ import org.apache.commons.io.IOUtils;
|
||||||
import org.jclouds.http.HttpResponse;
|
import org.jclouds.http.HttpResponse;
|
||||||
import org.jclouds.logging.Logger;
|
import org.jclouds.logging.Logger;
|
||||||
|
|
||||||
|
import com.google.common.base.Function;
|
||||||
import com.google.common.base.Supplier;
|
import com.google.common.base.Supplier;
|
||||||
import com.google.common.collect.ComputationException;
|
import com.google.common.collect.ComputationException;
|
||||||
|
import com.google.common.collect.MapMaker;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* // TODO: Adrian: Document this!
|
* // TODO: Adrian: Document this!
|
||||||
|
@ -50,7 +54,8 @@ import com.google.common.collect.ComputationException;
|
||||||
public class Utils {
|
public class Utils {
|
||||||
public static final String UTF8_ENCODING = "UTF-8";
|
public static final String UTF8_ENCODING = "UTF-8";
|
||||||
|
|
||||||
public static boolean enventuallyTrue(Supplier<Boolean> assertion, long inconsistencyMillis) throws InterruptedException {
|
public static boolean enventuallyTrue(Supplier<Boolean> assertion, long inconsistencyMillis)
|
||||||
|
throws InterruptedException {
|
||||||
|
|
||||||
for (int i = 0; i < 30; i++) {
|
for (int i = 0; i < 30; i++) {
|
||||||
if (!assertion.get()) {
|
if (!assertion.get()) {
|
||||||
|
@ -66,9 +71,36 @@ public class Utils {
|
||||||
@Resource
|
@Resource
|
||||||
protected static Logger logger = Logger.NULL;
|
protected static Logger logger = Logger.NULL;
|
||||||
|
|
||||||
public static String urlEncode(String in) {
|
/**
|
||||||
|
* Web browsers do not always handle '+' characters well, use the well-supported '%20' instead.
|
||||||
|
*/
|
||||||
|
public static String urlEncode(String in, char... skipEncode) {
|
||||||
try {
|
try {
|
||||||
return URLEncoder.encode(in, "UTF-8");
|
String returnVal = URLEncoder.encode(in, "UTF-8").replaceAll("\\+", "%20").replaceAll(
|
||||||
|
"\\*", "%2A").replaceAll("%7E", "~");
|
||||||
|
for (char c : skipEncode) {
|
||||||
|
returnVal = returnVal.replaceAll(plainToEncodedChars.get(c+""), c + "");
|
||||||
|
}
|
||||||
|
return returnVal;
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
throw new IllegalStateException("Bad encoding on input: " + in, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static Map<String, String> plainToEncodedChars = new MapMaker()
|
||||||
|
.makeComputingMap(new Function<String, String>() {
|
||||||
|
public String apply(String plain) {
|
||||||
|
try {
|
||||||
|
return URLEncoder.encode(plain, "UTF-8");
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
throw new IllegalStateException("Bad encoding on input: " + plain, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
public static String urlDecode(String in) {
|
||||||
|
try {
|
||||||
|
return URLDecoder.decode(in, "UTF-8");
|
||||||
} catch (UnsupportedEncodingException e) {
|
} catch (UnsupportedEncodingException e) {
|
||||||
throw new IllegalStateException("Bad encoding on input: " + in, e);
|
throw new IllegalStateException("Bad encoding on input: " + in, e);
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,9 @@ package org.jclouds.rest.internal;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static org.testng.Assert.assertEquals;
|
import static org.testng.Assert.assertEquals;
|
||||||
|
import static org.testng.Assert.assertNull;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
import java.lang.annotation.ElementType;
|
import java.lang.annotation.ElementType;
|
||||||
|
@ -55,12 +57,14 @@ import javax.ws.rs.Produces;
|
||||||
import javax.ws.rs.QueryParam;
|
import javax.ws.rs.QueryParam;
|
||||||
import javax.ws.rs.core.MediaType;
|
import javax.ws.rs.core.MediaType;
|
||||||
|
|
||||||
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.jclouds.concurrent.WithinThreadExecutorService;
|
import org.jclouds.concurrent.WithinThreadExecutorService;
|
||||||
import org.jclouds.concurrent.config.ExecutorServiceModule;
|
import org.jclouds.concurrent.config.ExecutorServiceModule;
|
||||||
import org.jclouds.http.HttpException;
|
import org.jclouds.http.HttpException;
|
||||||
import org.jclouds.http.HttpRequest;
|
import org.jclouds.http.HttpRequest;
|
||||||
import org.jclouds.http.HttpRequestFilter;
|
import org.jclouds.http.HttpRequestFilter;
|
||||||
import org.jclouds.http.HttpResponse;
|
import org.jclouds.http.HttpResponse;
|
||||||
|
import org.jclouds.http.HttpUtils;
|
||||||
import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule;
|
import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule;
|
||||||
import org.jclouds.http.functions.ParseURIFromListOrLocationHeaderIf20x;
|
import org.jclouds.http.functions.ParseURIFromListOrLocationHeaderIf20x;
|
||||||
import org.jclouds.http.functions.ReturnInputStream;
|
import org.jclouds.http.functions.ReturnInputStream;
|
||||||
|
@ -75,6 +79,7 @@ import org.jclouds.logging.Logger.LoggerFactory;
|
||||||
import org.jclouds.rest.InvocationContext;
|
import org.jclouds.rest.InvocationContext;
|
||||||
import org.jclouds.rest.annotations.BinderParam;
|
import org.jclouds.rest.annotations.BinderParam;
|
||||||
import org.jclouds.rest.annotations.Endpoint;
|
import org.jclouds.rest.annotations.Endpoint;
|
||||||
|
import org.jclouds.rest.annotations.FormParams;
|
||||||
import org.jclouds.rest.annotations.Headers;
|
import org.jclouds.rest.annotations.Headers;
|
||||||
import org.jclouds.rest.annotations.HostPrefixParam;
|
import org.jclouds.rest.annotations.HostPrefixParam;
|
||||||
import org.jclouds.rest.annotations.MapBinder;
|
import org.jclouds.rest.annotations.MapBinder;
|
||||||
|
@ -100,9 +105,9 @@ import org.testng.annotations.DataProvider;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
import com.google.common.collect.HashMultimap;
|
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.common.collect.ImmutableMultimap;
|
import com.google.common.collect.ImmutableMultimap;
|
||||||
|
import com.google.common.collect.LinkedHashMultimap;
|
||||||
import com.google.common.collect.Multimap;
|
import com.google.common.collect.Multimap;
|
||||||
import com.google.inject.AbstractModule;
|
import com.google.inject.AbstractModule;
|
||||||
import com.google.inject.Guice;
|
import com.google.inject.Guice;
|
||||||
|
@ -161,13 +166,14 @@ public class RestAnnotationProcessorTest {
|
||||||
|
|
||||||
URI start = URI
|
URI start = URI
|
||||||
.create("http://services.nirvanix.com/ws/Metadata/SetMetadata.ashx?output=json&path=adriancole-blobstore.testObjectOperations&metadata=chef%3Asushi&metadata=foo%3Abar&sessionToken=775ef26e-0740-4707-ad92-afe9814bc436");
|
.create("http://services.nirvanix.com/ws/Metadata/SetMetadata.ashx?output=json&path=adriancole-blobstore.testObjectOperations&metadata=chef%3Asushi&metadata=foo%3Abar&sessionToken=775ef26e-0740-4707-ad92-afe9814bc436");
|
||||||
URI value = RestAnnotationProcessor.replaceQuery(start, start.getQuery(), '/', ':');
|
URI value = RestAnnotationProcessor.replaceQuery(start, start.getQuery(), null, '/', ':');
|
||||||
assertEquals(value, expects);
|
assertEquals(value, expects);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testQuery() throws SecurityException, NoSuchMethodException {
|
public void testQuery() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = TestQuery.class.getMethod("foo");
|
Method method = TestQuery.class.getMethod("foo");
|
||||||
HttpRequest httpMethod = factory(TestQuery.class).createRequest(method, new Object[] {});
|
GeneratedHttpRequest<?> httpMethod = factory(TestQuery.class).createRequest(method,
|
||||||
|
new Object[] {});
|
||||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "");
|
assertEquals(httpMethod.getEndpoint().getPath(), "");
|
||||||
assertEquals(httpMethod.getEndpoint().getQuery(), "x-ms-version=2009-07-17&x-ms-rubbish=bin");
|
assertEquals(httpMethod.getEndpoint().getQuery(), "x-ms-version=2009-07-17&x-ms-rubbish=bin");
|
||||||
|
@ -176,7 +182,8 @@ public class RestAnnotationProcessorTest {
|
||||||
|
|
||||||
public void testQuery2() throws SecurityException, NoSuchMethodException {
|
public void testQuery2() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = TestQuery.class.getMethod("foo2");
|
Method method = TestQuery.class.getMethod("foo2");
|
||||||
HttpRequest httpMethod = factory(TestQuery.class).createRequest(method, new Object[] {});
|
GeneratedHttpRequest<?> httpMethod = factory(TestQuery.class).createRequest(method,
|
||||||
|
new Object[] {});
|
||||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "");
|
assertEquals(httpMethod.getEndpoint().getPath(), "");
|
||||||
assertEquals(httpMethod.getEndpoint().getQuery(),
|
assertEquals(httpMethod.getEndpoint().getQuery(),
|
||||||
|
@ -186,7 +193,7 @@ public class RestAnnotationProcessorTest {
|
||||||
|
|
||||||
public void testQuery3() throws SecurityException, NoSuchMethodException {
|
public void testQuery3() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = TestQuery.class.getMethod("foo3", String.class);
|
Method method = TestQuery.class.getMethod("foo3", String.class);
|
||||||
HttpRequest httpMethod = factory(TestQuery.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestQuery.class).createRequest(method,
|
||||||
new Object[] { "wonder" });
|
new Object[] { "wonder" });
|
||||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "");
|
assertEquals(httpMethod.getEndpoint().getPath(), "");
|
||||||
|
@ -217,11 +224,11 @@ public class RestAnnotationProcessorTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void verifyTestPostOptions(Method method) {
|
private void verifyTestPostOptions(Method method) {
|
||||||
HttpRequest httpMethod = factory(TestEntityParamVarargs.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestEntityParamVarargs.class).createRequest(
|
||||||
new Object[] { new HttpRequestOptions() {
|
method, new Object[] { new HttpRequestOptions() {
|
||||||
|
|
||||||
public Multimap<String, String> buildMatrixParameters() {
|
public Multimap<String, String> buildMatrixParameters() {
|
||||||
return HashMultimap.create();
|
return LinkedHashMultimap.create();
|
||||||
}
|
}
|
||||||
|
|
||||||
public String buildPathSuffix() {
|
public String buildPathSuffix() {
|
||||||
|
@ -229,11 +236,15 @@ public class RestAnnotationProcessorTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Multimap<String, String> buildQueryParameters() {
|
public Multimap<String, String> buildQueryParameters() {
|
||||||
return HashMultimap.create();
|
return LinkedHashMultimap.create();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Multimap<String, String> buildFormParameters() {
|
||||||
|
return LinkedHashMultimap.create();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Multimap<String, String> buildRequestHeaders() {
|
public Multimap<String, String> buildRequestHeaders() {
|
||||||
return HashMultimap.create();
|
return LinkedHashMultimap.create();
|
||||||
}
|
}
|
||||||
|
|
||||||
public String buildStringEntity() {
|
public String buildStringEntity() {
|
||||||
|
@ -261,7 +272,7 @@ public class RestAnnotationProcessorTest {
|
||||||
|
|
||||||
public void testCustomMethod() throws SecurityException, NoSuchMethodException {
|
public void testCustomMethod() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = TestCustomMethod.class.getMethod("foo");
|
Method method = TestCustomMethod.class.getMethod("foo");
|
||||||
HttpRequest httpMethod = factory(TestCustomMethod.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestCustomMethod.class).createRequest(method,
|
||||||
new Object[] {});
|
new Object[] {});
|
||||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "");
|
assertEquals(httpMethod.getEndpoint().getPath(), "");
|
||||||
|
@ -281,7 +292,8 @@ public class RestAnnotationProcessorTest {
|
||||||
|
|
||||||
public void testOverriddenMethod() throws SecurityException, NoSuchMethodException {
|
public void testOverriddenMethod() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = TestOverridden.class.getMethod("foo");
|
Method method = TestOverridden.class.getMethod("foo");
|
||||||
HttpRequest httpMethod = factory(TestOverridden.class).createRequest(method, new Object[] {});
|
GeneratedHttpRequest<?> httpMethod = factory(TestOverridden.class).createRequest(method,
|
||||||
|
new Object[] {});
|
||||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "");
|
assertEquals(httpMethod.getEndpoint().getPath(), "");
|
||||||
assertEquals(httpMethod.getMethod(), "POST");
|
assertEquals(httpMethod.getMethod(), "POST");
|
||||||
|
@ -302,8 +314,8 @@ public class RestAnnotationProcessorTest {
|
||||||
|
|
||||||
public void testOverriddenEndpointMethod() throws SecurityException, NoSuchMethodException {
|
public void testOverriddenEndpointMethod() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = TestOverriddenEndpoint.class.getMethod("foo");
|
Method method = TestOverriddenEndpoint.class.getMethod("foo");
|
||||||
HttpRequest httpMethod = factory(TestOverriddenEndpoint.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestOverriddenEndpoint.class).createRequest(
|
||||||
new Object[] {});
|
method, new Object[] {});
|
||||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||||
assertEquals(httpMethod.getEndpoint().getPort(), 8081);
|
assertEquals(httpMethod.getEndpoint().getPort(), 8081);
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "");
|
assertEquals(httpMethod.getEndpoint().getPath(), "");
|
||||||
|
@ -312,8 +324,8 @@ public class RestAnnotationProcessorTest {
|
||||||
|
|
||||||
public void testOverriddenEndpointParameter() throws SecurityException, NoSuchMethodException {
|
public void testOverriddenEndpointParameter() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = TestOverriddenEndpoint.class.getMethod("foo", URI.class);
|
Method method = TestOverriddenEndpoint.class.getMethod("foo", URI.class);
|
||||||
HttpRequest httpMethod = factory(TestOverriddenEndpoint.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestOverriddenEndpoint.class).createRequest(
|
||||||
new Object[] { URI.create("http://wowsa:8001") });
|
method, new Object[] { URI.create("http://wowsa:8001") });
|
||||||
assertEquals(httpMethod.getEndpoint().getHost(), "wowsa");
|
assertEquals(httpMethod.getEndpoint().getHost(), "wowsa");
|
||||||
assertEquals(httpMethod.getEndpoint().getPort(), 8001);
|
assertEquals(httpMethod.getEndpoint().getPort(), 8001);
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "");
|
assertEquals(httpMethod.getEndpoint().getPath(), "");
|
||||||
|
@ -345,7 +357,7 @@ public class RestAnnotationProcessorTest {
|
||||||
|
|
||||||
public void testCreatePostRequest() throws SecurityException, NoSuchMethodException {
|
public void testCreatePostRequest() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = TestPost.class.getMethod("post", String.class);
|
Method method = TestPost.class.getMethod("post", String.class);
|
||||||
HttpRequest httpMethod = factory(TestPost.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestPost.class).createRequest(method,
|
||||||
new Object[] { "data" });
|
new Object[] { "data" });
|
||||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "");
|
assertEquals(httpMethod.getEndpoint().getPath(), "");
|
||||||
|
@ -360,7 +372,7 @@ public class RestAnnotationProcessorTest {
|
||||||
|
|
||||||
public void testCreatePostJsonRequest() throws SecurityException, NoSuchMethodException {
|
public void testCreatePostJsonRequest() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = TestPost.class.getMethod("postAsJson", String.class);
|
Method method = TestPost.class.getMethod("postAsJson", String.class);
|
||||||
HttpRequest httpMethod = factory(TestPost.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestPost.class).createRequest(method,
|
||||||
new Object[] { "data" });
|
new Object[] { "data" });
|
||||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "");
|
assertEquals(httpMethod.getEndpoint().getPath(), "");
|
||||||
|
@ -375,7 +387,7 @@ public class RestAnnotationProcessorTest {
|
||||||
|
|
||||||
public void testCreatePostWithPathRequest() throws SecurityException, NoSuchMethodException {
|
public void testCreatePostWithPathRequest() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = TestPost.class.getMethod("postWithPath", String.class, MapBinder.class);
|
Method method = TestPost.class.getMethod("postWithPath", String.class, MapBinder.class);
|
||||||
HttpRequest httpMethod = factory(TestPost.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestPost.class).createRequest(method,
|
||||||
new Object[] { "data", new org.jclouds.rest.MapBinder() {
|
new Object[] { "data", new org.jclouds.rest.MapBinder() {
|
||||||
public void bindToRequest(HttpRequest request, Map<String, String> postParams) {
|
public void bindToRequest(HttpRequest request, Map<String, String> postParams) {
|
||||||
request.setEntity(postParams.get("fooble"));
|
request.setEntity(postParams.get("fooble"));
|
||||||
|
@ -388,13 +400,13 @@ public class RestAnnotationProcessorTest {
|
||||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "/data");
|
assertEquals(httpMethod.getEndpoint().getPath(), "/data");
|
||||||
assertEquals(httpMethod.getMethod(), HttpMethod.POST);
|
assertEquals(httpMethod.getMethod(), HttpMethod.POST);
|
||||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
assertEquals(httpMethod.getHeaders().size(), 1);
|
||||||
assertEquals(httpMethod.getEntity(), "data");
|
assertEquals(httpMethod.getEntity(), "data");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testCreatePostWithMethodBinder() throws SecurityException, NoSuchMethodException {
|
public void testCreatePostWithMethodBinder() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = TestPost.class.getMethod("postWithMethodBinder", String.class);
|
Method method = TestPost.class.getMethod("postWithMethodBinder", String.class);
|
||||||
HttpRequest httpMethod = factory(TestPost.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestPost.class).createRequest(method,
|
||||||
new Object[] { "data", });
|
new Object[] { "data", });
|
||||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "/data");
|
assertEquals(httpMethod.getEndpoint().getPath(), "/data");
|
||||||
|
@ -434,7 +446,7 @@ public class RestAnnotationProcessorTest {
|
||||||
|
|
||||||
public void testCreatePutWithMethodBinder() throws SecurityException, NoSuchMethodException {
|
public void testCreatePutWithMethodBinder() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = TestPut.class.getMethod("putWithMethodBinder", String.class);
|
Method method = TestPut.class.getMethod("putWithMethodBinder", String.class);
|
||||||
HttpRequest httpMethod = factory(TestPut.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestPut.class).createRequest(method,
|
||||||
new Object[] { "data", });
|
new Object[] { "data", });
|
||||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "/data");
|
assertEquals(httpMethod.getEndpoint().getPath(), "/data");
|
||||||
|
@ -450,7 +462,7 @@ public class RestAnnotationProcessorTest {
|
||||||
|
|
||||||
public void testCreatePutWithMethodProduces() throws SecurityException, NoSuchMethodException {
|
public void testCreatePutWithMethodProduces() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = TestPut.class.getMethod("putWithMethodBinderProduces", String.class);
|
Method method = TestPut.class.getMethod("putWithMethodBinderProduces", String.class);
|
||||||
HttpRequest httpMethod = factory(TestPut.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestPut.class).createRequest(method,
|
||||||
new Object[] { "data", });
|
new Object[] { "data", });
|
||||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "/data");
|
assertEquals(httpMethod.getEndpoint().getPath(), "/data");
|
||||||
|
@ -465,7 +477,7 @@ public class RestAnnotationProcessorTest {
|
||||||
|
|
||||||
public void testCreatePutWithMethodConsumes() throws SecurityException, NoSuchMethodException {
|
public void testCreatePutWithMethodConsumes() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = TestPut.class.getMethod("putWithMethodBinderConsumes", String.class);
|
Method method = TestPut.class.getMethod("putWithMethodBinderConsumes", String.class);
|
||||||
HttpRequest httpMethod = factory(TestPut.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestPut.class).createRequest(method,
|
||||||
new Object[] { "data", });
|
new Object[] { "data", });
|
||||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "/data");
|
assertEquals(httpMethod.getEndpoint().getPath(), "/data");
|
||||||
|
@ -509,7 +521,7 @@ public class RestAnnotationProcessorTest {
|
||||||
@Test
|
@Test
|
||||||
public void testRequestFilter() throws SecurityException, NoSuchMethodException {
|
public void testRequestFilter() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = TestRequestFilter.class.getMethod("get");
|
Method method = TestRequestFilter.class.getMethod("get");
|
||||||
HttpRequest httpMethod = factory(TestRequestFilter.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestRequestFilter.class).createRequest(method,
|
||||||
new Object[] {});
|
new Object[] {});
|
||||||
assertEquals(httpMethod.getFilters().size(), 2);
|
assertEquals(httpMethod.getFilters().size(), 2);
|
||||||
assertEquals(httpMethod.getFilters().get(0).getClass(), TestRequestFilter1.class);
|
assertEquals(httpMethod.getFilters().get(0).getClass(), TestRequestFilter1.class);
|
||||||
|
@ -518,7 +530,7 @@ public class RestAnnotationProcessorTest {
|
||||||
|
|
||||||
public void testRequestFilterOverride() throws SecurityException, NoSuchMethodException {
|
public void testRequestFilterOverride() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = TestRequestFilter.class.getMethod("getOverride");
|
Method method = TestRequestFilter.class.getMethod("getOverride");
|
||||||
HttpRequest httpMethod = factory(TestRequestFilter.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestRequestFilter.class).createRequest(method,
|
||||||
new Object[] {});
|
new Object[] {});
|
||||||
assertEquals(httpMethod.getFilters().size(), 1);
|
assertEquals(httpMethod.getFilters().size(), 1);
|
||||||
assertEquals(httpMethod.getFilters().get(0).getClass(), TestRequestFilter2.class);
|
assertEquals(httpMethod.getFilters().get(0).getClass(), TestRequestFilter2.class);
|
||||||
|
@ -536,7 +548,7 @@ public class RestAnnotationProcessorTest {
|
||||||
@Test
|
@Test
|
||||||
public void testSkipEncoding() throws SecurityException, NoSuchMethodException {
|
public void testSkipEncoding() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = TestEncoding.class.getMethod("twoPaths", String.class, String.class);
|
Method method = TestEncoding.class.getMethod("twoPaths", String.class, String.class);
|
||||||
HttpRequest httpMethod = factory(TestEncoding.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestEncoding.class).createRequest(method,
|
||||||
new Object[] { "1", "localhost" });
|
new Object[] { "1", "localhost" });
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "/1/localhost");
|
assertEquals(httpMethod.getEndpoint().getPath(), "/1/localhost");
|
||||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||||
|
@ -546,7 +558,7 @@ public class RestAnnotationProcessorTest {
|
||||||
@Test
|
@Test
|
||||||
public void testEncodingPath() throws SecurityException, NoSuchMethodException {
|
public void testEncodingPath() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = TestEncoding.class.getMethod("twoPaths", String.class, String.class);
|
Method method = TestEncoding.class.getMethod("twoPaths", String.class, String.class);
|
||||||
HttpRequest httpMethod = factory(TestEncoding.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestEncoding.class).createRequest(method,
|
||||||
new Object[] { "/", "localhost" });
|
new Object[] { "/", "localhost" });
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "///localhost");
|
assertEquals(httpMethod.getEndpoint().getPath(), "///localhost");
|
||||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||||
|
@ -566,14 +578,15 @@ public class RestAnnotationProcessorTest {
|
||||||
public void twoPaths(@PathParam("path1") String path, @PathParam("path2") String path2);
|
public void twoPaths(@PathParam("path1") String path, @PathParam("path2") String path2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test(enabled = false)
|
||||||
public void testConstantPathParam() throws SecurityException, NoSuchMethodException {
|
public void testConstantPathParam() throws SecurityException, NoSuchMethodException, IOException {
|
||||||
Method method = TestConstantPathParam.class.getMethod("twoPaths", String.class, String.class);
|
Method method = TestConstantPathParam.class.getMethod("twoPaths", String.class, String.class);
|
||||||
HttpRequest httpMethod = factory(TestConstantPathParam.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestConstantPathParam.class).createRequest(
|
||||||
new Object[] { "1", "localhost" });
|
method, new Object[] { "1", "localhost" });
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "/v1/ralphie/1/localhost");
|
assertRequestLineEquals(httpMethod,
|
||||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
"GET http://localhost:8080/v1/ralphie/1/localhost HTTP/1.1");
|
||||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
assertHeadersEqual(httpMethod, "");
|
||||||
|
assertEntityEquals(httpMethod, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Endpoint(Localhost.class)
|
@Endpoint(Localhost.class)
|
||||||
|
@ -611,7 +624,7 @@ public class RestAnnotationProcessorTest {
|
||||||
@Test
|
@Test
|
||||||
public void testParamExtractor() throws SecurityException, NoSuchMethodException {
|
public void testParamExtractor() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = TestPath.class.getMethod("onePathParamExtractor", String.class);
|
Method method = TestPath.class.getMethod("onePathParamExtractor", String.class);
|
||||||
HttpRequest httpMethod = factory(TestPath.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestPath.class).createRequest(method,
|
||||||
new Object[] { "localhost" });
|
new Object[] { "localhost" });
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "/l");
|
assertEquals(httpMethod.getEndpoint().getPath(), "/l");
|
||||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||||
|
@ -621,7 +634,7 @@ public class RestAnnotationProcessorTest {
|
||||||
@Test
|
@Test
|
||||||
public void testParamExtractorMethod() throws SecurityException, NoSuchMethodException {
|
public void testParamExtractorMethod() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = TestPath.class.getMethod("onePathParamExtractorMethod", String.class);
|
Method method = TestPath.class.getMethod("onePathParamExtractorMethod", String.class);
|
||||||
HttpRequest httpMethod = factory(TestPath.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestPath.class).createRequest(method,
|
||||||
new Object[] { "localhost" });
|
new Object[] { "localhost" });
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "/l");
|
assertEquals(httpMethod.getEndpoint().getPath(), "/l");
|
||||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||||
|
@ -752,13 +765,16 @@ public class RestAnnotationProcessorTest {
|
||||||
UnsupportedEncodingException {
|
UnsupportedEncodingException {
|
||||||
Method method = TestMapMatrixParams.class.getMethod("action", String.class, String.class,
|
Method method = TestMapMatrixParams.class.getMethod("action", String.class, String.class,
|
||||||
Map.class);
|
Map.class);
|
||||||
GeneratedHttpRequest<TestMapMatrixParams> httpMethod = factory(TestMapMatrixParams.class).createRequest(method,
|
GeneratedHttpRequest<TestMapMatrixParams> httpMethod = factory(TestMapMatrixParams.class)
|
||||||
new Object[] { "robot", "kill", ImmutableMap.of("death", "slow") });
|
.createRequest(method,
|
||||||
assertEquals(httpMethod.getRequestLine(), "POST http://localhost:8080/objects/robot/action/kill;death=slow HTTP/1.1");
|
new Object[] { "robot", "kill", ImmutableMap.of("death", "slow") });
|
||||||
|
assertEquals(httpMethod.getRequestLine(),
|
||||||
|
"POST http://localhost:8080/objects/robot/action/kill;death=slow HTTP/1.1");
|
||||||
assertEquals(httpMethod.getHeaders().size(), 0);
|
assertEquals(httpMethod.getHeaders().size(), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Endpoint(Localhost.class)
|
@Endpoint(Localhost.class)
|
||||||
|
@SkipEncoding('/')
|
||||||
public class TestQueryReplace {
|
public class TestQueryReplace {
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
|
@ -1104,7 +1120,7 @@ public class RestAnnotationProcessorTest {
|
||||||
GetOptions options = GetOptions.Builder.ifModifiedSince(date);
|
GetOptions options = GetOptions.Builder.ifModifiedSince(date);
|
||||||
HttpRequestOptions[] optionsHolder = new HttpRequestOptions[] {};
|
HttpRequestOptions[] optionsHolder = new HttpRequestOptions[] {};
|
||||||
Method method = TestRequest.class.getMethod("get", String.class, optionsHolder.getClass());
|
Method method = TestRequest.class.getMethod("get", String.class, optionsHolder.getClass());
|
||||||
HttpRequest httpMethod = factory(TestRequest.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestRequest.class).createRequest(method,
|
||||||
new Object[] { "1", options });
|
new Object[] { "1", options });
|
||||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "/1");
|
assertEquals(httpMethod.getEndpoint().getPath(), "/1");
|
||||||
|
@ -1121,7 +1137,7 @@ public class RestAnnotationProcessorTest {
|
||||||
DateTime date = new DateTime();
|
DateTime date = new DateTime();
|
||||||
GetOptions options = GetOptions.Builder.ifModifiedSince(date);
|
GetOptions options = GetOptions.Builder.ifModifiedSince(date);
|
||||||
Method method = TestRequest.class.getMethod("get", String.class, HttpRequestOptions.class);
|
Method method = TestRequest.class.getMethod("get", String.class, HttpRequestOptions.class);
|
||||||
HttpRequest httpMethod = factory(TestRequest.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestRequest.class).createRequest(method,
|
||||||
new Object[] { "1", options });
|
new Object[] { "1", options });
|
||||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "/1");
|
assertEquals(httpMethod.getEndpoint().getPath(), "/1");
|
||||||
|
@ -1142,23 +1158,19 @@ public class RestAnnotationProcessorTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testCreateGetOptionsThatProducesQuery() throws SecurityException,
|
public void testCreateGetOptionsThatProducesQuery() throws SecurityException,
|
||||||
NoSuchMethodException {
|
NoSuchMethodException, IOException {
|
||||||
PrefixOptions options = new PrefixOptions().withPrefix("1");
|
PrefixOptions options = new PrefixOptions().withPrefix("1");
|
||||||
Method method = TestRequest.class.getMethod("get", String.class, HttpRequestOptions.class);
|
Method method = TestRequest.class.getMethod("get", String.class, HttpRequestOptions.class);
|
||||||
HttpRequest httpMethod = factory(TestRequest.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestRequest.class).createRequest(method,
|
||||||
new Object[] { "1", options });
|
new Object[] { "1", options });
|
||||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
assertRequestLineEquals(httpMethod, "GET http://localhost:8080/1?prefix=1 HTTP/1.1");
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "/1");
|
assertHeadersEqual(httpMethod, "Host: localhost\n");
|
||||||
assertEquals(httpMethod.getEndpoint().getQuery(), "prefix=1");
|
assertEntityEquals(httpMethod, null);
|
||||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
|
||||||
assertEquals(httpMethod.getHeaders().size(), 1);
|
|
||||||
assertEquals(httpMethod.getHeaders().get(HttpHeaders.HOST), Collections
|
|
||||||
.singletonList("localhost"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testCreateGetQuery() throws SecurityException, NoSuchMethodException {
|
public void testCreateGetQuery() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = TestRequest.class.getMethod("getQuery", String.class);
|
Method method = TestRequest.class.getMethod("getQuery", String.class);
|
||||||
HttpRequest httpMethod = factory(TestRequest.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestRequest.class).createRequest(method,
|
||||||
new Object[] { "1" });
|
new Object[] { "1" });
|
||||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "/1");
|
assertEquals(httpMethod.getEndpoint().getPath(), "/1");
|
||||||
|
@ -1169,7 +1181,7 @@ public class RestAnnotationProcessorTest {
|
||||||
|
|
||||||
public void testCreateGetQueryNull() throws SecurityException, NoSuchMethodException {
|
public void testCreateGetQueryNull() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = TestRequest.class.getMethod("getQueryNull", String.class);
|
Method method = TestRequest.class.getMethod("getQueryNull", String.class);
|
||||||
HttpRequest httpMethod = factory(TestRequest.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestRequest.class).createRequest(method,
|
||||||
new Object[] { "1" });
|
new Object[] { "1" });
|
||||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "/1");
|
assertEquals(httpMethod.getEndpoint().getPath(), "/1");
|
||||||
|
@ -1191,7 +1203,7 @@ public class RestAnnotationProcessorTest {
|
||||||
EntityOptions options = new EntityOptions();
|
EntityOptions options = new EntityOptions();
|
||||||
Method method = TestRequest.class.getMethod("putOptions", String.class,
|
Method method = TestRequest.class.getMethod("putOptions", String.class,
|
||||||
HttpRequestOptions.class);
|
HttpRequestOptions.class);
|
||||||
HttpRequest httpMethod = factory(TestRequest.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestRequest.class).createRequest(method,
|
||||||
new Object[] { "1", options });
|
new Object[] { "1", options });
|
||||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "/1");
|
assertEquals(httpMethod.getEndpoint().getPath(), "/1");
|
||||||
|
@ -1215,7 +1227,7 @@ public class RestAnnotationProcessorTest {
|
||||||
public void testCreateGetRequest(String key) throws SecurityException, NoSuchMethodException,
|
public void testCreateGetRequest(String key) throws SecurityException, NoSuchMethodException,
|
||||||
UnsupportedEncodingException {
|
UnsupportedEncodingException {
|
||||||
Method method = TestRequest.class.getMethod("get", String.class, String.class);
|
Method method = TestRequest.class.getMethod("get", String.class, String.class);
|
||||||
HttpRequest httpMethod = factory(TestRequest.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestRequest.class).createRequest(method,
|
||||||
new Object[] { key, "localhost" });
|
new Object[] { key, "localhost" });
|
||||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||||
String expectedPath = "/" + URLEncoder.encode(key, "UTF-8").replaceAll("\\+", "%20");
|
String expectedPath = "/" + URLEncoder.encode(key, "UTF-8").replaceAll("\\+", "%20");
|
||||||
|
@ -1229,7 +1241,7 @@ public class RestAnnotationProcessorTest {
|
||||||
|
|
||||||
public void testCreatePutRequest() throws SecurityException, NoSuchMethodException {
|
public void testCreatePutRequest() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = TestRequest.class.getMethod("put", String.class, String.class);
|
Method method = TestRequest.class.getMethod("put", String.class, String.class);
|
||||||
HttpRequest httpMethod = factory(TestRequest.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestRequest.class).createRequest(method,
|
||||||
new Object[] { "111", "data" });
|
new Object[] { "111", "data" });
|
||||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "/1");
|
assertEquals(httpMethod.getEndpoint().getPath(), "/1");
|
||||||
|
@ -1244,7 +1256,7 @@ public class RestAnnotationProcessorTest {
|
||||||
|
|
||||||
public void testCreatePutHeader() throws SecurityException, NoSuchMethodException {
|
public void testCreatePutHeader() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = TestRequest.class.getMethod("putHeader", String.class, String.class);
|
Method method = TestRequest.class.getMethod("putHeader", String.class, String.class);
|
||||||
HttpRequest httpMethod = factory(TestRequest.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestRequest.class).createRequest(method,
|
||||||
new Object[] { "1", "data" });
|
new Object[] { "1", "data" });
|
||||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "/1");
|
assertEquals(httpMethod.getEndpoint().getPath(), "/1");
|
||||||
|
@ -1271,8 +1283,8 @@ public class RestAnnotationProcessorTest {
|
||||||
@Test
|
@Test
|
||||||
public void testVirtualHostMethod() throws SecurityException, NoSuchMethodException {
|
public void testVirtualHostMethod() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = TestVirtualHostMethod.class.getMethod("get", String.class, String.class);
|
Method method = TestVirtualHostMethod.class.getMethod("get", String.class, String.class);
|
||||||
HttpRequest httpMethod = factory(TestVirtualHostMethod.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestVirtualHostMethod.class).createRequest(
|
||||||
new Object[] { "1", "localhost" });
|
method, new Object[] { "1", "localhost" });
|
||||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "/1");
|
assertEquals(httpMethod.getEndpoint().getPath(), "/1");
|
||||||
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
assertEquals(httpMethod.getMethod(), HttpMethod.GET);
|
||||||
|
@ -1306,7 +1318,7 @@ public class RestAnnotationProcessorTest {
|
||||||
@Test
|
@Test
|
||||||
public void testVirtualHost() throws SecurityException, NoSuchMethodException {
|
public void testVirtualHost() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = TestVirtualHost.class.getMethod("get", String.class, String.class);
|
Method method = TestVirtualHost.class.getMethod("get", String.class, String.class);
|
||||||
HttpRequest httpMethod = factory(TestVirtualHost.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestVirtualHost.class).createRequest(method,
|
||||||
new Object[] { "1", "localhost" });
|
new Object[] { "1", "localhost" });
|
||||||
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
assertEquals(httpMethod.getEndpoint().getHost(), "localhost");
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "/1");
|
assertEquals(httpMethod.getEndpoint().getPath(), "/1");
|
||||||
|
@ -1319,7 +1331,7 @@ public class RestAnnotationProcessorTest {
|
||||||
@Test
|
@Test
|
||||||
public void testHostPrefix() throws SecurityException, NoSuchMethodException {
|
public void testHostPrefix() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = TestVirtualHost.class.getMethod("getPrefix", String.class, String.class);
|
Method method = TestVirtualHost.class.getMethod("getPrefix", String.class, String.class);
|
||||||
HttpRequest httpMethod = factory(TestVirtualHost.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestVirtualHost.class).createRequest(method,
|
||||||
new Object[] { "1", "holy" });
|
new Object[] { "1", "holy" });
|
||||||
assertEquals(httpMethod.getEndpoint().getHost(), "holylocalhost");
|
assertEquals(httpMethod.getEndpoint().getHost(), "holylocalhost");
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "/1");
|
assertEquals(httpMethod.getEndpoint().getPath(), "/1");
|
||||||
|
@ -1330,7 +1342,7 @@ public class RestAnnotationProcessorTest {
|
||||||
@Test
|
@Test
|
||||||
public void testHostPrefixDot() throws SecurityException, NoSuchMethodException {
|
public void testHostPrefixDot() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = TestVirtualHost.class.getMethod("getPrefixDot", String.class, String.class);
|
Method method = TestVirtualHost.class.getMethod("getPrefixDot", String.class, String.class);
|
||||||
HttpRequest httpMethod = factory(TestVirtualHost.class).createRequest(method,
|
GeneratedHttpRequest<?> httpMethod = factory(TestVirtualHost.class).createRequest(method,
|
||||||
new Object[] { "1", "holy" });
|
new Object[] { "1", "holy" });
|
||||||
assertEquals(httpMethod.getEndpoint().getHost(), "holy.localhost");
|
assertEquals(httpMethod.getEndpoint().getHost(), "holy.localhost");
|
||||||
assertEquals(httpMethod.getEndpoint().getPath(), "/1");
|
assertEquals(httpMethod.getEndpoint().getPath(), "/1");
|
||||||
|
@ -1457,13 +1469,95 @@ public class RestAnnotationProcessorTest {
|
||||||
.singletonList("test".getBytes().length + ""));
|
.singletonList("test".getBytes().length + ""));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expectedExceptions = IllegalStateException.class)
|
public class TestReplaceFormOptions extends BaseHttpRequestOptions {
|
||||||
public void testPutTwoEntities() throws SecurityException, NoSuchMethodException {
|
public TestReplaceFormOptions() {
|
||||||
RestAnnotationProcessor<TestEntity> processor = factory(TestEntity.class);
|
this.formParameters.put("x-amz-copy-source", "/{bucket}");
|
||||||
Method method = TestEntity.class.getMethod("twoEntities", String.class, String.class);
|
}
|
||||||
GeneratedHttpRequest<TestEntity> request = new GeneratedHttpRequest<TestEntity>("GET", URI
|
}
|
||||||
.create("http://localhost"), processor, TestEntity.class, method, "test", "ralphie");
|
|
||||||
processor.decorateRequest(request);
|
@Endpoint(Localhost.class)
|
||||||
|
@SkipEncoding('/')
|
||||||
|
public class TestFormReplace {
|
||||||
|
|
||||||
|
@POST
|
||||||
|
public void formInOptions(@PathParam("bucket") String path, TestReplaceFormOptions options) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@FormParams(keys = "x-amz-copy-source", values = "/{bucket}")
|
||||||
|
public void oneForm(@PathParam("bucket") String path) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@FormParams(keys = { "slash", "hyphen" }, values = { "/{bucket}", "-{bucket}" })
|
||||||
|
public void twoForm(@PathParam("bucket") String path) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@FormParams(keys = "x-amz-copy-source", values = "/{bucket}/{key}")
|
||||||
|
public void twoForms(@PathParam("bucket") String path, @PathParam("key") String path2) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@FormParams(keys = "x-amz-copy-source", values = "/{bucket}/{key}")
|
||||||
|
public void twoFormsOutOfOrder(@PathParam("key") String path,
|
||||||
|
@PathParam("bucket") String path2) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBuildTwoForm() throws SecurityException, NoSuchMethodException,
|
||||||
|
UnsupportedEncodingException {
|
||||||
|
Method oneForm = TestFormReplace.class.getMethod("twoForm", String.class);
|
||||||
|
String form = factory(TestFormReplace.class).createRequest(oneForm, new Object[] { "robot" })
|
||||||
|
.getEntity().toString();
|
||||||
|
assertEquals(form, "slash=/robot&hyphen=-robot");
|
||||||
|
}
|
||||||
|
|
||||||
|
@FormParams(keys = "x-amz-copy-source", values = "/{bucket}")
|
||||||
|
@Endpoint(Localhost.class)
|
||||||
|
@SkipEncoding('/')
|
||||||
|
public class TestClassForm {
|
||||||
|
@POST
|
||||||
|
public void oneForm(@PathParam("bucket") String path) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBuildOneClassForm() throws SecurityException, NoSuchMethodException,
|
||||||
|
UnsupportedEncodingException {
|
||||||
|
Method oneForm = TestClassForm.class.getMethod("oneForm", String.class);
|
||||||
|
String form = factory(TestClassForm.class).createRequest(oneForm, new Object[] { "robot" })
|
||||||
|
.getEntity().toString();
|
||||||
|
assertEquals(form, "x-amz-copy-source=/robot");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBuildOneForm() throws SecurityException, NoSuchMethodException,
|
||||||
|
UnsupportedEncodingException {
|
||||||
|
Method oneForm = TestFormReplace.class.getMethod("oneForm", String.class);
|
||||||
|
String form = factory(TestFormReplace.class).createRequest(oneForm, new Object[] { "robot" })
|
||||||
|
.getEntity().toString();
|
||||||
|
assertEquals(form, "x-amz-copy-source=/robot");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBuildTwoForms() throws SecurityException, NoSuchMethodException,
|
||||||
|
UnsupportedEncodingException {
|
||||||
|
Method twoForms = TestFormReplace.class.getMethod("twoForms", String.class, String.class);
|
||||||
|
String form = factory(TestFormReplace.class).createRequest(twoForms,
|
||||||
|
new Object[] { "robot", "eggs" }).getEntity().toString();
|
||||||
|
assertEquals(form, "x-amz-copy-source=/robot/eggs");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBuildTwoFormsOutOfOrder() throws SecurityException, NoSuchMethodException,
|
||||||
|
UnsupportedEncodingException {
|
||||||
|
Method twoFormsOutOfOrder = TestFormReplace.class.getMethod("twoFormsOutOfOrder",
|
||||||
|
String.class, String.class);
|
||||||
|
String form = factory(TestFormReplace.class).createRequest(twoFormsOutOfOrder,
|
||||||
|
new Object[] { "robot", "eggs" }).getEntity().toString();
|
||||||
|
assertEquals(form, "x-amz-copy-source=/eggs/robot");
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
|
@ -1495,4 +1589,24 @@ public class RestAnnotationProcessorTest {
|
||||||
new JavaUrlHttpCommandExecutorServiceModule());
|
new JavaUrlHttpCommandExecutorServiceModule());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void assertEntityEquals(GeneratedHttpRequest<?> httpMethod, String toMatch)
|
||||||
|
throws IOException {
|
||||||
|
if (httpMethod.getEntity() == null) {
|
||||||
|
assertNull(toMatch);
|
||||||
|
} else {
|
||||||
|
String entity = (httpMethod.getEntity() instanceof String) ? httpMethod.getEntity()
|
||||||
|
.toString() : IOUtils.toString((InputStream) httpMethod.getEntity());
|
||||||
|
assertEquals(entity, toMatch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void assertHeadersEqual(GeneratedHttpRequest<?> httpMethod, String toMatch) {
|
||||||
|
assertEquals(HttpUtils.sortAndConcatHeadersIntoString(httpMethod.getHeaders()), toMatch);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void assertRequestLineEquals(GeneratedHttpRequest<?> httpMethod, String toMatch) {
|
||||||
|
assertEquals(httpMethod.getRequestLine(), toMatch);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue