/* See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* Esri Inc. 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 com.esri.gpt.agp.client;
import org.json.JSONArray;
import org.json.JSONObject;
/**
* A search request.
*/
public class AgpSearchRequest {
/** constructors ============================================================ */
/** Default constructor. */
public AgpSearchRequest() {
super();
}
/** methods ================================================================= */
/**
* Executes a search request.
* @param connection the connection
* @param criteria the criteria
* @param listener the listener
* @throws Exception if an exception occurs
*/
public void search(AgpConnection connection,
AgpSearchCriteria criteria, AgpItemListener listener) throws Exception {
// prepare the request
String sType = "application/x-www-form-urlencoded";
String sUrl = connection.makeSharingUrl()+"/search";
StringBuilder params = new StringBuilder("f=json");
connection.appendToken(params);
criteria.appendURLParameters(params);
AgpProperties hdr = connection.makeRequestHeaderProperties();
// execute the request
AgpClient client = connection.ensureClient();
JSONObject jso = client.executeJsonRequest(sUrl,hdr,params,sType);
// parse the result cursor
AgpCursor cursor = new AgpCursor();
cursor.parseResponse(jso);
//System.err.println(cursor);
// parse the results
if (jso.has("results") && (!jso.isNull("results"))) {
JSONArray jsoResults = jso.getJSONArray("results");
int nResults = jsoResults.length();
for (int iResult=0;iResult<nResults;iResult++) {
if (!doContinue()) {
return;
}
JSONObject jsoItem = jsoResults.getJSONObject(iResult);
AgpItem agpItem = new AgpItem();
agpItem.parseItem(jsoItem);
//System.err.println("id="+agpItem.getProperties().get("id").getValue());
if (listener != null) {
listener.onItemLoaded(connection,agpItem);
}
}
// page if required (shouldn't do this if there is no listener)
if (listener != null) {
long nNextStart = cursor.getNextStart();
long nDeepTotal = criteria.getDeepTotal();
if ((nNextStart > 0) && (nDeepTotal > 0)) {
if (nNextStart <= nDeepTotal) {
long nNumLeft = nDeepTotal - nNextStart + 1;
if (nNumLeft < cursor.getNum()) {
int nNum = (int)nNumLeft;
criteria.setNum(nNum);
}
criteria.setStart(nNextStart);
this.search(connection,criteria,listener);
}
}
}
}
}
protected boolean doContinue() {
return true;
}
}