Hashtable parms;
int maximumRecords=1, maximumTerms=11, responsePosition=6, resultSetTTL=0, startRecord=1;
long startTime;
ScanRequestType scanRequest;
SearchRetrieveRequestType searchRequest;
SearchRetrieveResponseType searchResponse;
String input, key, query=null, recordPacking="xml", scanClause=null,
schema=null, sortKeys=null;
Transformer transformer=null;
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
System.out.println("\ntype \"help\" for an explanation of the commands");
System.out.print("enter request: ");
input=br.readLine();
while(input!=null && input.length()>0 && !quit) {
parms=parseInput(input);
scan=search=false;
keys=parms.keys();
while(keys.hasMoreElements()) {
key=(String)keys.nextElement();
if(key.equals("explain")) {
System.out.println(db.getExplainRecord(null));
}
else if(key.equals("help")) {
help();
}
else if(key.equals("maximumRecords")) {
maximumRecords=Integer.parseInt((String)parms.get(key));
}
else if(key.equals("maximumTerms")) {
maximumTerms=Integer.parseInt((String)parms.get(key));
}
else if(key.equals("q") || key.equals("quit")) {
quit=true;
}
else if(key.equals("query")) {
query=convertUnicodeSequence((String)parms.get(key));
search=true;
}
else if(key.equals("recordPacking")) {
recordPacking=(String)parms.get(key);
}
else if(key.equals("recordSchema")) {
schema=(String)parms.get(key);
}
else if(key.equals("responsePosition")) {
responsePosition=Integer.parseInt((String)parms.get(key));
}
else if(key.equals("resultSetTTL")) {
resultSetTTL=Integer.parseInt((String)parms.get(key));
}
else if(key.equals("scanClause")) {
scanClause=convertUnicodeSequence((String)parms.get(key));
scan=true;
}
else if(key.equals("sortKeys")) {
sortKeys=(String)parms.get(key);
}
else if(key.equals("startRecord")) {
startRecord=Integer.parseInt((String)parms.get(key));
}
else if(key.equals("x-info-5-restrictorSummary")) {
restrictorSummary=!((String)parms.get(key)).equals("false");
}
else if(key.equalsIgnoreCase("xsl")) {
String xslFileName=(String)parms.get(key);
Source xslSource=new StreamSource(xslFileName);
if(xslSource==null) {
System.out.println("Unable to make StreamSource for: "+xslFileName);
continue;
}
TransformerFactory tFactory=TransformerFactory.newInstance();
transformer=tFactory.newTransformer(xslSource);
}
else { // assume it is a query
query=key;
search=true;
}
}
if(search) {
System.out.print("operation=searchRetrieve");
searchRequest=new SearchRetrieveRequestType();
System.out.print("&version=1.1");
searchRequest.setVersion("1.1");
System.out.print("&maximumRecords="+maximumRecords);
searchRequest.setMaximumRecords(new NonNegativeInteger(Integer.toString(maximumRecords)));
System.out.print("&query="+query);
searchRequest.setQuery(query);
System.out.print("&recordPacking="+recordPacking);
searchRequest.setRecordPacking(recordPacking);
if(schema!=null && schema.length()>0) {
System.out.print("&recordSchema="+schema);
searchRequest.setRecordSchema(schema);
}
if(restrictorSummary) {
System.out.print("&x-info-5-restrictorSummary");
ExtraDataType edt=new ExtraDataType();
MessageElement elems[]=new MessageElement[1];
edt.set_any(elems);
Document domDoc;
DocumentBuilderFactory dbf=
DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder docb=dbf.newDocumentBuilder();
StringReader sr=new StringReader("<restrictorSummary xmlns=\"info:srw/extension/5/restrictorSummary\"/>");
domDoc=docb.parse(new InputSource(sr));
sr.close();
Element el=domDoc.getDocumentElement();
elems[0]=new MessageElement(el);
domDoc=null;
searchRequest.setExtraRequestData(edt);
}
System.out.print("&resultSetTTL="+resultSetTTL);
searchRequest.setResultSetTTL(new NonNegativeInteger(Integer.toString(resultSetTTL)));
if(sortKeys!=null && sortKeys.length()>0) {
System.out.print("&sortKeys="+sortKeys);
searchRequest.setSortKeys(sortKeys);
}
System.out.println("&startRecord="+startRecord+"\n");
searchRequest.setStartRecord(new PositiveInteger(Integer.toString(startRecord)));
startTime=System.currentTimeMillis();
searchResponse = db.doRequest(searchRequest);
System.out.println("elapsed time: "+(System.currentTimeMillis()-startTime)+"ms");
DiagnosticsType diags=searchResponse.getDiagnostics();
if(diags!=null) {
DiagnosticType diag, diagArray[]=diags.getDiagnostic();
for(i=0; i<diagArray.length; i++) {
diag=diagArray[i];
System.out.print("diagnostic: "+diag.getUri());
if(diag.getDetails()!=null)
System.out.print(", details: "+diag.getDetails());
System.out.println();
}
}
System.out.println("postings=" + searchResponse.getNumberOfRecords());
// ExtraDataType edt=searchResponse.getExtraResponseData();
// if(edt!=null) {
// HandleSGML rh=new HandleSGML();
// StringBuffer tags=new StringBuffer();
// tags.append("ns1:restrictorSummary 0 recordTag\n");
// tags.append("restrictor 10\n");
// tags.append("entry 11\n");
// tags.append("xmlns 12\n");
// tags.append("xmlns:ns1 12\n");
// tags.append("count 13\n");
// tags.append("use 14\n");
// rh.loadTags(new StringReader(tags.toString()));
// rh.setByteToCharConverter("utf8");
// MessageElement elems[]=edt.get_any();
// rh.Input(new ByteArrayInputStream(elems[0].toString().getBytes("UTF-8")));
// DataDir summary=rh.getNextRecord();
// DataDir restrictors[]=new DataDir[summary.count()-1];
// restrictors[0]=summary.child().next();
// for(int i=1; i<restrictors.length; i++)
// restrictors[i]=restrictors[i-1].next();
// for(int i=0; i<restrictors.length; i++) {
// System.out.print("use="+restrictors[i].find(2).find(14).getUTFString());
// System.out.print(" count="+restrictors[i].find(2).find(13).getUTFString());
// System.out.print(" ");
// }
// System.out.println();
// for(int i=0; i<restrictors.length; i++)
// restrictors[i]=restrictors[i].child().next();
// for(int j=0; j<5; j++) {
// for(int i=0; i<restrictors.length; i++) {
// if(restrictors[i]!=null) {
// System.out.print(restrictors[i].find(1).getUTFString());
// System.out.print("("+restrictors[i].find(2).find(13).getUTFString()+")");
// System.out.print(" ");
// restrictors[i]=restrictors[i].next();
// }
// else
// System.out.print(" ");
// }
// System.out.println();
// }
// }
RecordsType records = searchResponse.getRecords();
RecordType record[];
if(records == null || (record = records.getRecord()) == null) {
System.out.println("0 records returned");
}
else {
System.out.println(record.length + " records returned");
MessageElement[] elems;
Source source;
String recordStr;
StringOrXmlFragment frag;
StringWriter sw;
for(i=0; i<record.length; i++) {
System.out.print("record number " + record[i].getRecordPosition());
frag=record[i].getRecordData();
elems=frag.get_any();
recordStr=elems[0].toString();
if(transformer!=null) {
source=new StreamSource(new StringReader(recordStr));
sw=new StringWriter();
try {
transformer.transform(source, new StreamResult(sw));
System.out.print(sw.toString());
}
catch(Exception e) {
e.printStackTrace();
}
}
else
System.out.println(recordStr);
}
}
System.out.println("nextRecordPosition=" + searchResponse.getNextRecordPosition());
}
else if(scan) {
System.out.print("operation=searchRetrieve");
scanRequest = new ScanRequestType();
System.out.print("&version=1.1");