Before show the java source, I'll show the corresponding entry into setupcms.xml file, which set the association of this dynamic services with the CMS structure.
<CMS:documents>
<CMS:document src="/Home.xml"/>
<CMS:document src="/NotFound.xml" parent="no"/>
<CMS:document src="/live/search.xml" parent="no"/>
.....
This fragment of the setupcms.xml config file tells to the Upload Utility to insert a page in the content metadata named "Result Page" and which has no parent and, unlike other CMS pages the content is loaded with a sample document his content will be dynamic.
The code below shows the most important part of the Search Engine, this search engine uses a function
translate(avQueryString)
public void doSearch(String ext,
String baseURL,
String avQueryString)
throws SQLException,IOException,SAXException {
Arguments, this function receives three arguments. ext means html, wml or xml given the posibilty of making different behaviours depending on the target output. baseURL is added to the begining of the links when the search engine makes urls to documents which contain the query string. avQueryString is the query string with Altavista (TM) syntax.
String interMediaQueryString = translate(avQueryString);
interMediaQueryString hold the converted query string, now with Oracle interMedia (TM) query syntax.
if (avQueryString.equalsIgnoreCase("nullQuery")) {
Jxtp.tagOpen("body");
Jxtp.tagOpen("s1","title='Advanced Search is not implemented yet'");
Jxtp.tagClose("s1");
Jxtp.tagClose("body");
Jxtp.tagClose("document");
return;
}
If no query string is given as argument value implements Advance Search modality, like "find documents which contains DBPrism in titles of level 1, obviusly not implemented yet because document-v10.dtd do not include specifications for XForm tags.
Jxtp.tagOpen("body");
Jxtp.tagOpen("s1","title='Search result for:"+avQueryString+"'");
Jxtp.tagOpen("table");
// Title
Jxtp.tagOpen("tr");
Jxtp.tag("th","Rank");
Jxtp.tag("th","Page");
Jxtp.tag("th","Long Name");
Jxtp.tag("th","Comments");
Jxtp.tagClose("tr");
The resulting output of the search is enclosed in a html table like structure, at this point the code makes the corresponding header for the table.
QueryResult qryResult = null;
try {
#sql qryResult = { select score(1) rank,cn_id_page,path,name,longname,comments
from content,pages
where contains(content, :interMediaQueryString, 1)>0
and cn_id_page=id_page
and version=current_version
order by rank desc };
while(qryResult.next()) {
String name = qryResult.name();
Jxtp.tagOpen("tr");
Jxtp.tag("td","("+qryResult.rank()+"%)");
Jxtp.tagOpen("td");
Jxtp.tag("link",name,
"href='"+baseURL+qryResult.path()+name+"."+ext+"'");
Jxtp.tagClose("td");
Jxtp.tag("td",qryResult.longname());
String comments = qryResult.comments();
if (comments!=null)
Jxtp.tag("td",comments);
else
Jxtp.tag("td","");
Jxtp.tagClose("tr");
}
Execute the query on the table content only with the current documents, remember that the CMS stores previous version of the documents. The result is stored into the SQLJ iterator
qryResult
contains(columnName,query,1)
} catch (SQLException sqe) {
Jxtp.tagOpen("tr");
Jxtp.tag("td","0");
Jxtp.tag("td","Pages found for");
Jxtp.tag("td",avQueryString);
Jxtp.tag("td","");
Jxtp.tagClose("tr");
}
Commonly this catch receives SQL No Data Found Exception which means no documents contain the given query.
Jxtp.tagClose("table");
Jxtp.tagClose("s1");
Jxtp.tagClose("body");
Jxtp.tagClose("document");
}
This part of code closes the XML sections opened in the prevous part. One is the table, opened before the query, and the last is
<document>
showMetaData


