/** FIXME #wiki: Clean this up and make queries independent of database.
* Implements printing queries by finding the database associated with the printer and querying it.
*/
@Override
public void print(Printer printer) {
HtmlLinePrinter body = new HtmlLinePrinter();
PageContentPrinter contentPrinter = (PageContentPrinter)((ExtendedPrinter) printer).getExtension();
Database database = contentPrinter.getDatabase();
try {
String query = _queryString;
if(query.toLowerCase().startsWith("ignore:")) {
return;
}
else if(query.toLowerCase().startsWith("chart:") || query.toLowerCase().startsWith("chart(")) {
// FIXME: should parse the arguments to charts in a more
// sensible scalable way.
query = query.substring("chart".length());
String xSize = "800";
String ySize = "600";
if(query.startsWith("(")) {
int comma = query.indexOf(",");
int closeParen = query.indexOf(")", comma);
int colon = query.indexOf(":", closeParen);
if(comma == -1 || closeParen == -1 || colon != closeParen+1)
throw new WikiQueryException(WikiQueryException.UnknownQueryFormat, _queryString);
xSize = query.substring(1, comma);
ySize = query.substring(comma+1, closeParen);
query = query.substring(colon+1);
} else {
query = query.substring(1);
}
QueryResultSet rs = database.query(query);
body.openPARAGRAPH(CSS.CSSPageText);
drawChart(ChartType.Column, xSize, ySize, rs, body);
} else if(query.toLowerCase().startsWith("pie:") || query.toLowerCase().startsWith("pie(")) {
// FIXME: should parse the arguments to charts in a more
// sensible scalable way.
query = query.substring("pie".length());
String xSize = "800";
String ySize = "600";
if(query.startsWith("(")) {
int comma = query.indexOf(",");
int closeParen = query.indexOf(")", comma);
int colon = query.indexOf(":", closeParen);
if(comma == -1 || closeParen == -1 || colon != closeParen+1)
throw new WikiQueryException(WikiQueryException.UnknownQueryFormat, _queryString);
xSize = query.substring(1, comma);
ySize = query.substring(comma+1, closeParen);
query = query.substring(colon+1);
} else {
query = query.substring(1);
}
QueryResultSet rs = database.query(query);
body.openPARAGRAPH(CSS.CSSPageText);
drawChart(ChartType.Pie, xSize, ySize, rs, body);
} else if(query.toLowerCase().startsWith("map:")) {
query = query.substring("map:".length());
QueryResultSet rs = database.query(query);
body.openPARAGRAPH(CSS.CSSPageText);
drawMap(rs, body);
} else {
QueryResultSet rs = database.query(query);
if (!rs.isEmpty()) {
body.openPARAGRAPH(CSS.CSSPageText);
if (rs.isElement()) {
RequestParameterVersion versionParameter = null;
if (rs.hasTimestamp()) {
versionParameter = new RequestParameterVersionTimestamp(rs.getTimestamp());
} else {
versionParameter = new RequestParameterVersionCurrent();
}
body.add(contentPrinter.getLinesForNodeList(new SchemaNodeList(rs),
versionParameter));
} else {
for (int i = 0; i < rs.size(); i++) {
contentPrinter.printTextNode((DatabaseTextNode)rs.get(i), body);
}
}
}
}
} catch (org.dbwiki.exception.data.WikiQueryException queryException) {
queryException.printStackTrace();
body.paragraph("<b> " + queryException.toString() + "</b>", CSS.CSSPageText);
} catch (WikiException e) {
e.printStackTrace();
// don't throw exception because we can't
}
HtmlPage lines = body.lines();
for(int i = 0; i < lines.size(); i++)
printer.print(lines.get(i));
}