/*
* 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.stanbol.entityhub.test.query;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
public class FindQueryTestCase extends QueryTestCase {
/**
* If {@link #getField()} set this field is expected to be used as default
* search field (rdfs:label)
*/
public static final String DEFAULT_SEARCH_FIELD = "http://www.w3.org/2000/01/rdf-schema#label";
private final String text;
private String language;
private String field;
private Integer offset;
private Integer limit;
/**
* Constructs a /find test case with a text and a expected HTTP status code
* for the Request. This constructor is typically used to construct illegal
* requests that return status codes other that 2xx
* @param text the text
* @param expectedStatus the expected status
*/
public FindQueryTestCase(String text,int expectedStatus) {
this(text, expectedStatus, null,null);
}
/**
* Constructs a valid /find request (expects an 2xx status) that may or may
* not have results
* @param text the text
* @param expectsResults if results are expected or not
*/
public FindQueryTestCase(String text, boolean expectsResults) {
this(text, 200, expectsResults ? new ArrayList<String>(0) : null,null);
}
/**
* Constructs a /find request where the response MUST contain the parsed
* expected results. Additional other results are ok.
* @param text the text
* @param expectedResultIds the ids of the required results. An empty
* collection to accept any results or <code>null</code> to explicitly
* check that this query MUST NOT have results.
*/
public FindQueryTestCase(String text, Collection<String> expectedResultIds) {
this(text, 200, expectedResultIds,null);
}
/**
* Constructs a /find request where the response MUST contain the parsed
* expected results. Additional other results are ok.
* @param text the text
* @param expectedResultIds the ids of the required results. An empty
* collection to accept any results or <code>null</code> to explicitly
* check that this query MUST NOT have results.
* @param prohibitedResultIds results that MUST NOT be returned by the query
*/
public FindQueryTestCase(String text, Collection<String> expectedResultIds,
Collection<String> prohibitedResultIds) {
this(text, 200, expectedResultIds,prohibitedResultIds);
}
/**
* Internally used to construct FindTestCases. Not all combinations make
* sense therefore this one is a private one
* @param text the text
* @param status the status
* @param expectedResultIds expected results
* @param prohibitedResultIds results that MUST NOT be returned by the query
*/
private FindQueryTestCase(String text, int status, Collection<String> expectedResultIds,
Collection<String> prohibitedResultIds){
super(status,expectedResultIds,prohibitedResultIds);
this.text = text;
//For queries that should succeed
if(expectsSuccess()){
//add the default search field (needed to correctly init that the
//default search field is required to be included in results
setField(null);
}
//find queries use application/x-www-form-urlencoded
this.setHeader("Content-Type", "application/x-www-form-urlencoded");
}
/**
* @return the language
*/
public final String getLanguage() {
return language;
}
/**
* @param language the language to set
*/
public final void setLanguage(String language) {
this.language = language;
}
/**
* Getter for the field to search the {@link #getText() text}
* @return the field
*/
public final String getField() {
return field;
}
/**
* Setter for the field to search the {@link #getText() text}
* @param field the field to set
*/
public final void setField(String field) {
this.field = field;
//set also the new field as required for results!
setRequiredFields(Arrays.asList(
field == null ? DEFAULT_SEARCH_FIELD : field));
}
/**
* Getter for the offset of this query
* @return the offset
*/
public final Integer getOffset() {
return offset;
}
/**
* Setter for the offset
* @param offset the offset to set
*/
public final void setOffset(Integer offset) {
this.offset = offset;
}
/**
* Getter for the maximum number of results (starting from the offset)
* @return the limit
*/
public final Integer getLimit() {
return limit;
}
/**
* Setter for the maximum number of results (starting from the offset)
* @param limit the limit to set
*/
public final void setLimit(Integer limit) {
this.limit = limit;
}
/**
* Getter for the text to search
* @return the text
*/
public final String getText() {
return text;
}
@Override
public String getServicePath() {
return "/find";
}
/**
* Getter for the encoded Content for the query
* @return
*/
public final String getContent(){
StringBuilder sb = new StringBuilder();
addParam(sb,"name",text);
addParam(sb, "field", field);
addParam(sb, "lang", language);
addParam(sb, "offset", offset);
addParam(sb, "limit", limit);
return sb.toString();
}
/**
* Adds a param to the {@link #getContent() content} of the query
* @param sb
*/
private void addParam(StringBuilder sb,String param, Object value) {
if(value != null){
if(sb.length() != 0){
sb.append('&');
}
//TODO: do we need to URLencode the value?
sb.append(param).append('=').append(value);
}
}
}