--- /dev/null
+// jdbcCommand.java\r
+// $Id: jdbcCommand.java,v 1.2 2010/06/15 17:52:50 smhuang Exp $ \r
+// (c) COPYRIGHT MIT and INRIA, 1997.\r
+// Please first read the full copyright statement in file COPYRIGHT.html\r
+\r
+package org.w3c.jigsaw.ssi.jdbc;\r
+\r
+import java.util.Dictionary;\r
+\r
+import java.sql.Connection;\r
+import java.sql.DriverManager;\r
+import java.sql.ResultSet;\r
+import java.sql.Statement;\r
+\r
+import org.w3c.www.http.HTTP;\r
+\r
+import org.w3c.jigsaw.http.Reply;\r
+import org.w3c.jigsaw.http.Request;\r
+\r
+import org.w3c.util.ArrayDictionary;\r
+\r
+import org.w3c.jigsaw.ssi.SSIFrame;\r
+\r
+import org.w3c.jigsaw.ssi.commands.Command;\r
+\r
+/**\r
+ * Implementation of the SSI <code>jdbc</code> command. \r
+ */\r
+public class jdbcCommand implements Command {\r
+ private final static String NAME = "jdbc";\r
+ private final static boolean debug = true;\r
+\r
+ private static final String keys[] = {\r
+ "select",\r
+ "url",\r
+ "driver",\r
+ "user",\r
+ "password",\r
+ "name",\r
+ "column",\r
+ "next"\r
+ };\r
+\r
+ /**\r
+ * return true if reply can be cached.\r
+ * @return a boolean.\r
+ */\r
+ public boolean acceptCaching() {\r
+ return true;\r
+ }\r
+\r
+ protected Connection getConnection(String driver, \r
+ String url, \r
+ String user,\r
+ String password) \r
+ {\r
+ try {\r
+ Class.forName(driver);\r
+ //Added by Jeff Huang\r
+ //TODO: FIXIT\r
+ return DriverManager.getConnection(url, user, password);\r
+ } catch (Exception ex) {\r
+ ex.printStackTrace();\r
+ }\r
+ return null;\r
+ }\r
+\r
+ protected ResultSet performSelect(Connection conn, String cmd) {\r
+ try {\r
+ Statement smt = conn.createStatement();\r
+ ResultSet set = smt.executeQuery(cmd);\r
+ return set;\r
+ } catch (Exception ex) {\r
+ ex.printStackTrace();\r
+ }\r
+ return null;\r
+ }\r
+\r
+ protected void addSet(Dictionary d, \r
+ String name, \r
+ Request request,\r
+ ResultSet set) {\r
+ d.put(request.toString()+"."+name, set);\r
+ }\r
+\r
+ protected ResultSet getSet(Dictionary d, String name, Request request) {\r
+ return (ResultSet) d.get(request.toString()+"."+name);\r
+ }\r
+\r
+ public String getName() {\r
+ return NAME;\r
+ }\r
+\r
+ public String getValue(Dictionary variables, String var, Request request) {\r
+ ResultSet set = getSet(variables, var, request);\r
+ if (! hasMoreValue(variables, var, request))\r
+ return "empty";\r
+ else return "not-empty";\r
+ }\r
+\r
+ protected void sethasMoreValueFlag(Dictionary d,\r
+ String name,\r
+ Request request,\r
+ boolean flag)\r
+ {\r
+ d.put(request.toString()+"."+name+".flag", new Boolean(flag));\r
+ }\r
+\r
+ protected boolean hasMoreValue(Dictionary d,\r
+ String name,\r
+ Request request)\r
+ {\r
+ Boolean flag = (Boolean) d.get(request.toString()+"."+name+".flag");\r
+ return (flag == null) ? true : flag.booleanValue();\r
+ }\r
+\r
+ public synchronized Reply execute(SSIFrame ssiframe,\r
+ Request request,\r
+ ArrayDictionary parameters,\r
+ Dictionary variables) \r
+ {\r
+ Object values[] = parameters.getMany(keys);\r
+ String select = (String) values[0];\r
+ String url = (String) values[1];\r
+ String driver = (String) values[2];\r
+ String user = (String) values[3];\r
+ String password = (String) values[4];\r
+ String name = (String) values[5];\r
+ String column = (String) values[6];\r
+ String next = (String) values[7];\r
+ String text = null;\r
+ if ( select != null ) {\r
+ // user and password are optionnals, they can be null.\r
+ Connection conn = getConnection(driver, url, user, password);\r
+ if ( conn != null ) {\r
+ addSet(variables, name, request, performSelect(conn, select));\r
+ sethasMoreValueFlag(variables, name, request, true);\r
+ }\r
+ } else if (column != null) {\r
+ ResultSet set = getSet(variables, name, request);\r
+ try {\r
+ if ( set != null ) \r
+ text = set.getObject(Integer.parseInt(column)).toString();\r
+ } catch (Exception ex) {\r
+ ex.printStackTrace();\r
+ }\r
+ } else if ( next != null ) {\r
+ ResultSet set = getSet(variables, name, request);\r
+ if ( set != null ) {\r
+ try {\r
+ sethasMoreValueFlag(variables, name, request, set.next());\r
+ } catch (Exception ex) {\r
+ ex.printStackTrace();\r
+ }\r
+ }\r
+ }\r
+\r
+ // We are NOT doing notMod hack here (tricky and useless ?)\r
+ Reply reply = ssiframe.createCommandReply(request, HTTP.OK);\r
+ if ( text != null )\r
+ reply.setContent(text);\r
+ return reply;\r
+ \r
+ }\r
+}\r