/*
* 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.resource.endpoints;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.usergrid.rest.test.resource.model.Collection;
import org.apache.usergrid.rest.test.resource.state.ClientContext;
import org.apache.usergrid.utils.StringUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* //myorg/myapp/mycollection
*/
public class CollectionEndpoint extends NamedResource {
private static final Logger logger = LoggerFactory.getLogger(CollectionEndpoint.class);
protected List<String> acceptHeaders = new ArrayList<String> ();
private String matrix;
public CollectionEndpoint(String name, ClientContext context, UrlResource parent) {
super(name, context, parent);
}
public EntityEndpoint uniqueID(final String identifier){
return new EntityEndpoint(identifier, context, this);
}
public EntityEndpoint entity(final org.apache.usergrid.rest.test.resource.model.Entity entity){
String identifier = (String) entity.get("uuid");
return entity(identifier);
}
public EntityEndpoint entity(final UUID identifier ){
return entity(identifier.toString());
}
public EntityEndpoint entity(final String identifier ){
return uniqueID(identifier);
}
public CollectionEndpoint withAcceptHeader(final String acceptHeader) {
this.acceptHeaders.add(acceptHeader);
return this;
}
/**
* <pre>
* app.collection("users").uniqueID("fred").connection("following").collection("users").uniqueID("barney").post();
* POST /users/fred/following/users/barney?token=<token>
*
* app.collection("users").uniqueID("fred").connection().collection("users").uniqueID("barney").post();
* POST /users/fred/groups/theitcrowd?token=<token>
* </pre>
*/
public CollectionEndpoint collection(final String identifier){
return new CollectionEndpoint(identifier, context, this);
}
/**
* Get a list of entities.
*
* <pre>
* //with token
* app.collection("users").get(); //return entity
* GET /users?token=<token>
*
* //with query and token
* collection = app.collection("users").get(queryparam); //return collection (list of entities)
* GET /users?ql=select * where created > 0&token=<token>
*
* //with query and no token
* collection = app.collection("users").get(queryparam, false); //return collection (list of entities)
* GET /users?ql=select * where created > 0
*
* //with no query and no token
* collection = app.collection("users").get(null, false); //return collection (list of entities)
* GET /users
*
* collection = app.collection("users").get(collection);
* <pre>
*/
public Collection get(){
return new Collection( get(org.apache.usergrid.rest.test.resource.model.ApiResponse.class,null,true));
}
public Collection get( final org.apache.usergrid.rest.test.resource.model.QueryParameters parameters ){
return get(parameters, true);
}
public Collection get(
final org.apache.usergrid.rest.test.resource.model.QueryParameters parameters,
final boolean useToken){
String acceptHeader = MediaType.APPLICATION_JSON;
if (this.acceptHeaders.size() > 0) {
acceptHeader = StringUtils.join(this.acceptHeaders, ',');
}
WebTarget resource = getTarget( useToken );
resource = addParametersToResource(resource, parameters);
logger.info("PATH is "+ resource.getUri().getRawPath()+"?"+resource.getUri().getRawQuery());
// use string type so we can log actual response from server
String responseString = resource.request()
.accept( acceptHeader )
.get(String.class);
if (logger.isDebugEnabled()) {
logger.debug("Response from get: " + responseString);
}
ObjectMapper mapper = new ObjectMapper();
org.apache.usergrid.rest.test.resource.model.ApiResponse response;
try {
response = mapper.readValue(
new StringReader(responseString), org.apache.usergrid.rest.test.resource.model.ApiResponse.class);
} catch (IOException e) {
throw new RuntimeException("Error parsing response", e);
}
return new Collection(response);
}
/**
* Gets the next page using only default settings with the passed in collection.
*
* <pre>
* Collection usersCollection = app.collection("users").get();
* //iterate through the collection
* while(usersCollection.hasNext()){
* Entity bob = usersCollection.next();
* assert("blah",bob.get("words"));
* }
* usersCollection = app.collections("users").getNextPage(usersCollection.cursor);
* </pre>
*/
//TODO: add queryParameters here
public Collection getNextPage(Collection collection,
org.apache.usergrid.rest.test.resource.model.QueryParameters passedParameters ,
final boolean useToken) {
String acceptHeader = MediaType.APPLICATION_JSON;
if (this.acceptHeaders.size() > 0) {
acceptHeader = StringUtils.join(this.acceptHeaders, ',');
}
WebTarget resource = getTarget( useToken );
org.apache.usergrid.rest.test.resource.model.QueryParameters queryParameters = passedParameters;
if( queryParameters == null){
queryParameters = new org.apache.usergrid.rest.test.resource.model.QueryParameters();
}
queryParameters.setCursor(collection.getCursor());
resource = addParametersToResource(resource, queryParameters);
org.apache.usergrid.rest.test.resource.model.ApiResponse response =
resource.request()
.accept( acceptHeader )
.get(org.apache.usergrid.rest.test.resource.model.ApiResponse.class);
return new Collection(response);
}
/**
* DELETE on a collection endpoint with query (use DELETE on entity for single entity delete).
*
* <pre>
* //with token
* app.collection("users").delete(parameters);
* DELETE /users?ql=select * where created > 0&token=<token>
*
* //without token
* app.collection("users").delete(parameters, false);
* DELETE /users?ql=select * where created > 0
*
* app.collection("users").delete(null, false);
* DELETE /users
* </pre>
*/
public org.apache.usergrid.rest.test.resource.model.ApiResponse delete(
final org.apache.usergrid.rest.test.resource.model.QueryParameters parameters ){
return delete(parameters, true);
}
public org.apache.usergrid.rest.test.resource.model.ApiResponse delete(
final org.apache.usergrid.rest.test.resource.model.QueryParameters parameters, final boolean useToken) {
String acceptHeader = MediaType.APPLICATION_JSON;
if (this.acceptHeaders.size() > 0) {
acceptHeader = StringUtils.join(this.acceptHeaders, ',');
}
WebTarget resource = getTarget( useToken );
resource = addParametersToResource(resource, parameters);
return resource.request()
.accept( acceptHeader )
.delete(org.apache.usergrid.rest.test.resource.model.ApiResponse.class);
}
/**
* Post an entity to a collection.
*
* <pre>
* app.collection("users").post(entity);
* POST /users {"color","red"}
* </pre>
*/
public org.apache.usergrid.rest.test.resource.model.Entity post(
org.apache.usergrid.rest.test.resource.model.Entity payload){
String acceptHeader = MediaType.APPLICATION_JSON;
if (this.acceptHeaders.size() > 0) {
acceptHeader = StringUtils.join(this.acceptHeaders, ',');
}
// use string type so we can log actual response from server
String responseString = getTarget( true )
.request()
.accept(acceptHeader)
.post( javax.ws.rs.client.Entity.json( payload ), String.class);
if (logger.isDebugEnabled()) {
logger.debug("Response from post: " + responseString);
}
ObjectMapper mapper = new ObjectMapper();
org.apache.usergrid.rest.test.resource.model.ApiResponse response;
try {
response = mapper.readValue( new StringReader(responseString),
org.apache.usergrid.rest.test.resource.model.ApiResponse.class);
} catch (IOException e) {
throw new RuntimeException("Error parsing response", e);
}
return new org.apache.usergrid.rest.test.resource.model.Entity(response);
}
public org.apache.usergrid.rest.test.resource.model.Entity post() {
String acceptHeader = MediaType.APPLICATION_JSON;
if (this.acceptHeaders.size() > 0) {
acceptHeader = StringUtils.join(this.acceptHeaders, ',');
}
// use string type so we can log actual response from server
String responseString = getTarget( true )
.request()
.accept( acceptHeader )
.post( javax.ws.rs.client.Entity.json( null ), String.class);
if (logger.isDebugEnabled()) {
logger.debug("Response from post: " + responseString);
}
ObjectMapper mapper = new ObjectMapper();
org.apache.usergrid.rest.test.resource.model.ApiResponse response;
try {
response = mapper.readValue( new StringReader(responseString),
org.apache.usergrid.rest.test.resource.model.ApiResponse.class);
} catch (IOException e) {
throw new RuntimeException("Error parsing response", e);
}
return new org.apache.usergrid.rest.test.resource.model.Entity(response);
}
public org.apache.usergrid.rest.test.resource.model.ApiResponse post(
List<org.apache.usergrid.rest.test.resource.model.Entity> entityList) {
String acceptHeader = MediaType.APPLICATION_JSON;
if (this.acceptHeaders.size() > 0) {
acceptHeader = StringUtils.join(this.acceptHeaders, ',');
}
// use string type so we can log actual response from server
String responseString = getTarget( true )
.request()
.accept( acceptHeader )
.post( javax.ws.rs.client.Entity.json( entityList ), String.class);
if (logger.isDebugEnabled()) {
logger.debug("Response from post: " + responseString);
}
ObjectMapper mapper = new ObjectMapper();
org.apache.usergrid.rest.test.resource.model.ApiResponse response;
try {
response = mapper.readValue( new StringReader(responseString),
org.apache.usergrid.rest.test.resource.model.ApiResponse.class);
} catch (IOException e) {
throw new RuntimeException("Error parsing response", e);
}
return response;
}
/**
* PUT a payload to a collection.
*
* <pre>
* app.collection("users").put(entity, param);
* PUT /users?ql=select * where created > 0&token=<token>
*
* app.collection("users").put(entity, false, param);
* PUT /users?ql=select * where created > 0
* </pre>
*/
public org.apache.usergrid.rest.test.resource.model.ApiResponse put(
final org.apache.usergrid.rest.test.resource.model.QueryParameters parameters,
org.apache.usergrid.rest.test.resource.model.Entity entity ){
return put(parameters, true, entity);
}
public org.apache.usergrid.rest.test.resource.model.ApiResponse put(
final org.apache.usergrid.rest.test.resource.model.QueryParameters parameters,
final boolean useToken,
org.apache.usergrid.rest.test.resource.model.Entity entity) {
String acceptHeader = MediaType.APPLICATION_JSON;
if (this.acceptHeaders.size() > 0) {
acceptHeader = StringUtils.join(this.acceptHeaders, ',');
}
WebTarget resource = getTarget( useToken );
addParametersToResource(getTarget(), parameters);
// use string type so we can log actual response from server
String responseString = resource.request()
.accept(acceptHeader)
.put( javax.ws.rs.client.Entity.json( entity ), String.class);
if (logger.isDebugEnabled()) {
logger.debug("Response from put: " + responseString);
}
ObjectMapper mapper = new ObjectMapper();
org.apache.usergrid.rest.test.resource.model.ApiResponse response;
try {
response = mapper.readValue( new StringReader(responseString),
org.apache.usergrid.rest.test.resource.model.ApiResponse.class);
} catch (IOException e) {
throw new RuntimeException("Error parsing response", e);
}
return response;
}
public CollectionEndpoint matrix(
org.apache.usergrid.rest.test.resource.model.QueryParameters parameters) {
this.matrix = getMatrixValue(parameters);
return this;
}
@Override
public String getMatrix(){
return matrix != null ? matrix : "";
}
}