blob: fe918363a062766f9c6e580a2d18f9aada6ef1e5 [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.vxquery.app.util;
import static org.apache.vxquery.rest.Constants.MODE_ASYNC;
import static org.apache.vxquery.rest.Constants.MODE_SYNC;
import static org.apache.vxquery.rest.Constants.HttpHeaderValues.CONTENT_TYPE_JSON;
import static org.apache.vxquery.rest.Constants.HttpHeaderValues.CONTENT_TYPE_XML;
import static org.apache.vxquery.rest.Constants.Parameters.COMPILE_ONLY;
import static org.apache.vxquery.rest.Constants.Parameters.FRAME_SIZE;
import static org.apache.vxquery.rest.Constants.Parameters.METRICS;
import static org.apache.vxquery.rest.Constants.Parameters.MODE;
import static org.apache.vxquery.rest.Constants.Parameters.OPTIMIZATION;
import static org.apache.vxquery.rest.Constants.Parameters.REPEAT_EXECUTIONS;
import static org.apache.vxquery.rest.Constants.Parameters.SHOW_AST;
import static org.apache.vxquery.rest.Constants.Parameters.SHOW_OET;
import static org.apache.vxquery.rest.Constants.Parameters.SHOW_RP;
import static org.apache.vxquery.rest.Constants.Parameters.SHOW_TET;
import static org.apache.vxquery.rest.Constants.Parameters.STATEMENT;
import static org.apache.vxquery.rest.Constants.URLs.QUERY_ENDPOINT;
import static org.apache.vxquery.rest.Constants.URLs.QUERY_RESULT_ENDPOINT;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.URI;
import java.net.URISyntaxException;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import org.apache.htrace.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.HttpEntity;
import org.apache.http.client.utils.URIBuilder;
import org.apache.vxquery.rest.request.QueryRequest;
import org.apache.vxquery.rest.request.QueryResultRequest;
/**
* A set of utility methods used by the REST related tasks
*
* @author Erandi Ganepola
*/
public class RestUtils {
private RestUtils() {
}
/**
* Builds the {@link URI} once the {@link QueryRequest} is given. Only the
* parameters given (different from the default values) are put in the
* {@link URI}
*
* @param request
* {@link QueryRequest} to be converted to a {@link URI}
* @param restIpAddress
* Ip address of the REST server
* @param restPort
* port of the REST server
* @return generated {@link URI}
* @throws URISyntaxException
*/
public static URI buildQueryURI(QueryRequest request, String restIpAddress, int restPort)
throws URISyntaxException {
URIBuilder builder =
new URIBuilder().setScheme("http").setHost(restIpAddress).setPort(restPort).setPath(QUERY_ENDPOINT);
if (request.getStatement() != null) {
builder.addParameter(STATEMENT, request.getStatement());
}
if (request.isCompileOnly()) {
builder.addParameter(COMPILE_ONLY, String.valueOf(request.isCompileOnly()));
}
if (request.getOptimization() != QueryRequest.DEFAULT_OPTIMIZATION) {
builder.addParameter(OPTIMIZATION, String.valueOf(request.getOptimization()));
}
if (request.getFrameSize() != QueryRequest.DEFAULT_FRAMESIZE) {
builder.addParameter(FRAME_SIZE, String.valueOf(request.getFrameSize()));
}
if (request.getRepeatExecutions() != 1) {
builder.addParameter(REPEAT_EXECUTIONS, String.valueOf(request.getRepeatExecutions()));
}
if (request.isShowMetrics()) {
builder.addParameter(METRICS, String.valueOf(request.isShowMetrics()));
}
if (request.isShowAbstractSyntaxTree()) {
builder.addParameter(SHOW_AST, String.valueOf(request.isShowAbstractSyntaxTree()));
}
if (request.isShowTranslatedExpressionTree()) {
builder.addParameter(SHOW_TET, String.valueOf(request.isShowTranslatedExpressionTree()));
}
if (request.isShowOptimizedExpressionTree()) {
builder.addParameter(SHOW_OET, String.valueOf(request.isShowOptimizedExpressionTree()));
}
if (request.isShowRuntimePlan()) {
builder.addParameter(SHOW_RP, String.valueOf(request.isShowRuntimePlan()));
}
if (!request.isAsync()) {
builder.addParameter(MODE, request.isAsync() ? MODE_ASYNC : MODE_SYNC);
}
return builder.build();
}
/**
* Builds the query result {@link URI} given the {@link QueryResultRequest}
*
* @param resultRequest
* result request
* @param restIpAddress
* rest server's ip
* @param restPort
* port of the rest server
* @return generated {@link URI}
* @throws URISyntaxException
*/
public static URI buildQueryResultURI(QueryResultRequest resultRequest, String restIpAddress, int restPort)
throws URISyntaxException {
URIBuilder builder = new URIBuilder().setScheme("http").setHost(restIpAddress).setPort(restPort)
.setPath(QUERY_RESULT_ENDPOINT.replace("*", String.valueOf(resultRequest.getResultId())));
if (resultRequest.isShowMetrics()) {
builder.setParameter(METRICS, String.valueOf(resultRequest.isShowMetrics()));
}
return builder.build();
}
/**
* Reads the entity from an {@link HttpEntity}
*
* @param entity
* entity instance to be read
* @return entity read by this method as a string
* @throws IOException
*/
public static String readEntity(HttpEntity entity) throws IOException {
StringBuilder responseBody = new StringBuilder();
try (InputStream in = entity.getContent()) {
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line;
while ((line = reader.readLine()) != null) {
responseBody.append(line);
}
}
return responseBody.toString();
}
/**
* Maps the object in the string representation to a java object. To map json
* entities, this method use {@link ObjectMapper}. For XML this method use
* {@link Unmarshaller}.
*
* @param entity
* string representation of the object
* @param type
* the class to which the string needs to be mapped to
* @param contentType
* json or XML
* @param <T>
* content's class type
* @return mapped object
* @throws IOException
* @throws JAXBException
*/
public static <T> T mapEntity(String entity, Class<T> type, String contentType) throws IOException, JAXBException {
if (contentType == null) {
contentType = CONTENT_TYPE_JSON;
}
switch (contentType) {
case CONTENT_TYPE_XML:
JAXBContext jaxbContext = JAXBContext.newInstance(type);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
return type.cast(unmarshaller.unmarshal(new StringReader(entity)));
case CONTENT_TYPE_JSON:
default:
ObjectMapper jsonMapper = new ObjectMapper();
return jsonMapper.readValue(entity, type);
}
}
}