Listing 1 XMLQuery class
package com.sonoma.xmldb;
import org.xmldb.api.base.*;
import org.xmldb.api.modules.*;
import org.xmldb.api.*;
import org.apache.xindice.client.xmldb.services.*;
import org.apache.xindice.xml.dom.*;
import java.io.File;
import java.io.FileInputStream;
public class xmlQuery {
/** Creates new xmlQuery */
public xmlQuery(){
}
public String getResults(String DBCollection, String
XPathQuery) throws Exception{
Collection col = null;
StringBuffer sb = new StringBuffer();
try {
String driver =
"org.apache.xindice.client.xmldb.DatabaseImpl";
Class c = Class.forName(driver);
Database database = (Database) c.newInstance();
DatabaseManager.registerDatabase(database);
col = DatabaseManager.getCollection(DBCollection);
String xpath;
xpath = XPathQuery;
System.out.println("query: " + xpath);
XPathQueryService service =
(XPathQueryService)
col.getService("XPathQueryService", "1.0");
ResourceSet resultSet = service.query(xpath);
ResourceIterator results = resultSet.getIterator();
if (results.hasMoreResources()){
sb.append("<results>");
String sResults = "";
while (results.hasMoreResources()) {
Resource res = results.nextResource();
sResults = (String) res.getContent();
if(sResults.indexOf(Ô\nÕ)>-1){
sResults =sResults.substring(sResults.
indexOf(Ô\nÕ)+1);
}
sb.append(sResults);
}
sb.append("</results>");
}
}
catch (XMLDBException e) {
System.err.println("XML:DB Exception occurred " + e.getMessage());
}
finally {
if (col != null) {
col.close();
}
return sb.toString();
}
}
public void addCollection(String collectionName) throws
Exception{
Collection col = null;
try {
String driver = "org.apache.xindice.client.xmldb.DatabaseImpl";
Class c = Class.forName(driver);
Database database = (Database) c.newInstance();
DatabaseManager.registerDatabase(database);
col =
DatabaseManager.getCollection("xmldb:xindice:///db/");
//String collectionName = "mycollection";
CollectionManager service =
(CollectionManager) col.getService("Collection
Manager", "1.0");
// Build up the Collection XML configuration.
String collectionConfig =
"<collection compressed=\"true\" name=\"" +
collectionName + "\">" +
" <filer class=\"org.apache.xindice.core.filer.BTreeFiler\" gzip=\"true\"/>" +
"</collection>";
service.createCollection(collectionName,
DOMParser.toDocument(collectionConfig));
System.out.println("Collection " + collectionName + " created.");
}
catch (XMLDBException e) {
System.err.println("XML:DB Exception occured " +
e.getMessage());
}
finally {
if (col != null) {
col.close();
}
}
}
public void addDocument(String CollectionURI, String
FileName)
throws XMLDBException{
Collection col = null;
try {
String driver = "org.apache.xindice.client.xmldb.DatabaseImpl";
Class c = Class.forName(driver);
Database database = (Database) c.newInstance();
DatabaseManager.registerDatabase(database);
col =
DatabaseManager.getCollection(CollectionURI);
String data = readFileFromDisk(FileName);
XMLResource document = (XMLResource) col.create
Resource(null,
"XMLResource");
document.setContent(data);
col.storeResource(document);
System.out.println("Document " + FileName + "
inserted");
}
catch(Exception e){
e.printStackTrace();
}
finally {
if (col != null) {
col.close();
}
}
}
private String readFileFromDisk(String fileName) throws
Exception {
File file = new File(fileName);
FileInputStream insr = new FileInputStream(file);
byte[] fileBuffer = new byte[(int)file.length()];
insr.read(fileBuffer);
insr.close();
return new String(fileBuffer);
}
}
Listing 2. (searchParams.java)
package com.sonoma.xmldb;
public class searchParams {
public String DocType = "article";
public String SearchNode = "title";
public String SearchText;
public String Collection = "xmldb:xindice:///db/
addressbook";
public boolean FullText = false;
public boolean TitlesOnly = true;
public searchParams() {
}
}
Listing 3. (docBookSearch.java)
package com.sonoma.xmldb;
public final class docBookSearch {
/** Creates new DocBookSearch */
public static String getSearchResults(searchParams
params){
String sPath = "";
sPath = "/" + params.DocType;
if (params.Collection==null){
params.Collection ="xmldb:xindice:///db/arti
cles";
}
if (params.SearchText == null || params.Search
Text.length()<1){
return "parameter searchText cannot be empty";
}
if(params.FullText){
sPath += "[contains("+ params.SearchNode +
",'"+params.SearchText+"Õ)]";
}else{
sPath += "[decendant::"+ params.SearchNode +
"='"+params.SearchText+"Õ]";
}
if(params.TitlesOnly){
sPath += "/title";
}else{
sPath += "/" + params.SearchNode;
}
try{
xmlQuery xq = new xmlQuery();
return xq.getResults(params.Collection,sPath);
}catch(Exception e){
return "<DBError>DocBookSearch: " + e.getMessage() + "</DBERROR>";
}
}
}
Listing 4 (dbSearchServlet.java)
package com.sonoma.xmldb;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class dbSearchServlet extends HttpServlet{
/** Creates new docbookSearch */
public dbSearchServlet() {
}
//request searchString=someString&searchNode=node&fullText=false&titlesOn
ly=true&doc=book|article
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
//basic errors
if (checkParameters(request,response)){
try{
searchParams sp = new searchParams();
String sQuery = "";
sp.SearchText = request.getParameter("searchString");
sp.DocType = request.getParameter("doc");
sp.SearchNode = request.getParameter("searchNode");
if (request.getParameter("fullText") != null &&
request.getParameter("fullText").startsWith("t")){
sp.FullText = true;
}else{
sp.FullText = false;
}
if (request.getParameter("titlesOnly") != null && request.getParameter("titlesOnly").startsWith("t")){
sp.TitlesOnly = true;
}else{
sp.TitlesOnly = false;
}
response.getOutputStream().println(DocBookSearch.getSearchRe
sults(sp));
}catch(Exception e){
response.getOutputStream().println("<DBError>" +
e.getMessage() + "</DBError>");
}
}
}
private void returnError(HttpServletResponse response,
String message){
try{
response.getOutputStream().println("<DBError>" + message +
"</DBError>");
}catch(Exception e){
e.printStackTrace();
}
}
private boolean checkParameters(HttpServletRequest
request, HttpServletResponse response){
if ((request.getParameter("doc") == null) || (!request.getParameter("doc").equals("book") && !request.getParameter("doc").equals("article"))){
returnError(response,"parameter doc must be
article or book");
return false;
}
if (request.getParameter("searchString") == null
|| request.getParameter("searchString").length()<1){
returnError(response,"parameter searchString
cannot be empty");
return false;
}
return true;
}
}
Listing 5 Add to ./WEB-INF/wdo-xml file
<servlet>
<servlet-name>
xmlSearch
</servlet-name>
<servlet-class>
com.sonoma.xmldb.dbSearchServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
xmlSearch
</servlet-name>
<url-pattern>
/xSearch
</url-pattern>
</servlet-mapping>
Listing 6 XSLT Code
<xsl:template name="showArticleSearch">
<table width="100%">
<tr>
<td>Xindice Search Results<br/>
<xsl:variable name="search" select="document(Ôhttp://localhost:8080/examples/xSearch?doc =article&
searchString=SSL&searchNode=title&fullText=true&
titlesOnly=true')"/>
<xsl:apply-templates select="search/results"/>
</td>
</tr>
</table>
</xsl:template>