Adding JMCR-Stable version
[Benchmarks_CSolver.git] / JMCR-Stable / real-world application / jigsaw / src / org / w3c / jigsaw / ssi / jdbc / jdbcCommand.java
diff --git a/JMCR-Stable/real-world application/jigsaw/src/org/w3c/jigsaw/ssi/jdbc/jdbcCommand.java b/JMCR-Stable/real-world application/jigsaw/src/org/w3c/jigsaw/ssi/jdbc/jdbcCommand.java
new file mode 100644 (file)
index 0000000..dde13be
--- /dev/null
@@ -0,0 +1,165 @@
+// 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