blob: 69d2fcfac253f2d83e5139226d2088765b35def5 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.usergrid.rest.test.resource2point0.endpoints;
import org.apache.usergrid.rest.test.resource2point0.model.ApiResponse;
import org.apache.usergrid.rest.test.resource2point0.model.Entity;
import org.apache.usergrid.rest.test.resource2point0.model.QueryParameters;
import org.apache.usergrid.rest.test.resource2point0.model.Token;
import org.apache.usergrid.rest.test.resource2point0.state.ClientContext;
import com.sun.jersey.api.client.GenericType;
import com.sun.jersey.api.client.WebResource;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import javax.ws.rs.core.MediaType;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
import com.sun.jersey.api.representation.Form;
import org.jclouds.openstack.v2_0.domain.Extension;
/**
* Base class that is extended by named endpoints.
* The NamedResource stores the parent of the class, the context in which the class operates and then Name of this resource
*/
public class NamedResource implements UrlResource {
protected final String name;
protected final ClientContext context;
/* Stores the path of the parent that called it.
i.e If we had a ApplicationResource ( an instance of a namedResource ) this would contain the OrganizationResource.
*/
protected final UrlResource parent;
public NamedResource( final String name, final ClientContext context, final UrlResource parent ) {
this.name = name;
this.context = context;
this.parent = parent;
}
@Override
public String getPath() {
return name + getMatrix();
}
@Override
public WebResource getResource() {
return getResource(false);
}
public WebResource getResource(boolean useToken) {
return getResource(useToken,null);
}
public WebResource getResource(boolean useToken,Token token) {
WebResource resource = parent.getResource().path( getPath() );
token = token !=null ? token : this.context.getToken();
//error checking
if(token == null)
return resource;
return useToken ? resource.queryParam("access_token",token.getAccessToken()) : resource;
}
protected WebResource addParametersToResource(WebResource resource, final QueryParameters parameters){
if(parameters == null){
return resource;
}
if ( parameters.getQuery() != null ) {
resource = resource.queryParam( "ql", parameters.getQuery() );
}
if ( parameters.getCursor() != null ) {
resource = resource.queryParam( "cursor", parameters.getCursor() );
}
if ( parameters.getStart() != null ) {
resource = resource.queryParam("start", parameters.getStart().toString());
}
if ( parameters.getLimit() != null ) {
resource = resource.queryParam("limit", parameters.getLimit().toString());
}
//We can also post the params as queries
if ( parameters.getFormPostData().size() > 0){
Map<String,String> formData = parameters.getFormPostData();
Set<String> keySet = formData.keySet();
Iterator<String> keyIterator = keySet.iterator();
while(keyIterator.hasNext()){
String key = keyIterator.next();
String value = formData.get( key );
resource = resource.queryParam( key, value );
}
}
return resource;
}
protected String getMatrixValue(final QueryParameters parameters) {
StringBuilder sb = new StringBuilder();
if (parameters == null) {
return null;
}
if (parameters.getQuery() != null) {
sb.append(";");
sb.append("ql").append("=").append(parameters.getQuery());
}
if (parameters.getCursor() != null) {
sb.append(";");
sb.append("cursor").append("=").append(parameters.getCursor());
}
if (parameters.getStart() != null) {
sb.append(";");
sb.append("start").append("=").append(parameters.getStart());
}
if (parameters.getLimit() != null) {
sb.append(";");
sb.append("limit").append("=").append(parameters.getLimit());
}
//We can also post the params as queries
if (parameters.getFormPostData().size() > 0) {
Map<String, String> formData = parameters.getFormPostData();
Set<String> keySet = formData.keySet();
Iterator<String> keyIterator = keySet.iterator();
while (keyIterator.hasNext()) {
if (sb.length() > 0)
sb.append(";");
String key = keyIterator.next();
String value = formData.get(key);
sb.append(key).append("=").append(value);
}
}
return sb.toString();
}
/**
* Need to refactor all instances of tokens to either be passed in or manually set during the test.
* There isn't any reason we would want a rest forwarding framework to set something on behave of the user.
* @param map
* @return
*/
//For edge cases like Organizations and Tokens
public ApiResponse post(Map map) {
return post(true,ApiResponse.class,map,null,false);
}
//For edge cases like Organizations and Tokens
public ApiResponse post(boolean useToken, Map map, QueryParameters queryParameters) {
return post(useToken,ApiResponse.class,map,queryParameters,false);
}
/**
* Need to refactor all instances of tokens to either be passed in or manually set during the test.
* There isn't any reason we would want a rest forwarding framework to set something on behave of the user.
* @param type
* @param <T>
* @return
*/
//For edge cases like Organizations and Tokens
public <T> T post(Class<T> type) {
return post(true,type,null,null,false);
}
/**
* Need to refactor all instances of tokens to either be passed in or manually set during the test.
* There isn't any reason we would want a rest forwarding framework to set something on behave of the user.
* @param type
* @param requestEntity
* @param <T>
* @return
*/
//For edge cases like Organizations and Tokens
public <T> T post(Class<T> type, Entity requestEntity) {
return post(true,type,requestEntity,null,false);
}
/**
* Need to refactor all instances of tokens to either be passed in or manually set during the test.
* There isn't any reason we would want a rest forwarding framework to set something on behave of the user.
* @param type
* @param requestEntity
* @param <T>
* @return
*/
//For edge cases like Organizations and Tokens
public <T> T post(Class<T> type, Map requestEntity) {
return post(true,type,requestEntity,null,false);
}
/**
* Used to test POST using form payloads.
* @param type
* @param requestEntity
* @param <T>
* @return
*/
public <T> T post(Class<T> type, Form requestEntity) {
GenericType<T> gt = new GenericType<>((Class) type);
return getResource()
.accept(MediaType.APPLICATION_JSON)
.type(MediaType.APPLICATION_FORM_URLENCODED_TYPE)
.entity(requestEntity, MediaType.APPLICATION_FORM_URLENCODED_TYPE)
.post(gt.getRawClass());
}
//Used for empty posts
public <T> T post( boolean useToken, Class<T> type, Map entity, final QueryParameters queryParameters) {
WebResource resource = getResource(useToken);
resource = addParametersToResource(resource, queryParameters);
WebResource.Builder builder = resource
.type(MediaType.APPLICATION_JSON_TYPE)
.accept( MediaType.APPLICATION_JSON );
if(entity!=null){
builder.entity(entity);
}
GenericType<T> gt = new GenericType<>((Class) type);
return builder
.post(gt.getRawClass());
}
//Used for empty posts
public <T> T post( boolean useToken, Class<T> type, Map entity, final QueryParameters queryParameters, boolean useBasicAuthentication ) {
WebResource resource = getResource(useToken);
resource = addParametersToResource(resource, queryParameters);
WebResource.Builder builder = resource
.type(MediaType.APPLICATION_JSON_TYPE)
.accept( MediaType.APPLICATION_JSON );
if(entity!=null){
builder.entity(entity);
}
if(useBasicAuthentication){
//added httpBasicauth filter to all setup calls because they all do verification this way.
HTTPBasicAuthFilter httpBasicAuthFilter = new HTTPBasicAuthFilter( "superuser","superpassword" );
resource.addFilter( httpBasicAuthFilter );
}
GenericType<T> gt = new GenericType<>((Class) type);
return builder
.post(gt.getRawClass());
}
//For edge cases like Organizations and Tokens without any payload
public <T> T get(Class<T> type) {
return get(type,null,true);
}
//For edge cases like Organizations and Tokens without any payload
public <T> T get(Class<T> type, boolean useToken) {
return get(type,null,useToken);
}
public <T> T get(Class<T> type,QueryParameters queryParameters) {
return get(type,queryParameters,true);
}
public <T> T get(Class<T> type,QueryParameters queryParameters, boolean useToken) {
WebResource resource = getResource(useToken);
if(queryParameters!=null) {
resource = addParametersToResource(resource, queryParameters);
}
GenericType<T> gt = new GenericType<>((Class) type);
return resource.type(MediaType.APPLICATION_JSON_TYPE)
.accept( MediaType.APPLICATION_JSON )
.get( gt.getRawClass() );
}
public String getMatrix() {
return "";
}
}