See though the whole point is >The Java file should be compiled >under WEB-INF/classes/ >and you can invoke it with CFObject.
wouldn't need to happen. Rob Certified Organic "When you put things in quotes, people think someone actually said it." http://treebeard.sourceforge.net http://ruinworld.sourceforge.net Scientia Est Potentia -----Original Message----- From: Joe Eugene [mailto:[EMAIL PROTECTED]] Sent: Monday, November 25, 2002 2:33 PM To: CF-Talk Subject: Re: Java in CF (CFMX) Dick, Here is an Example that works with CFMX. The Java file should be compiled under WEB-INF/classes/ and you can invoke it with CFObject. Note i am using Macromedia drivers to connect to Sql-Server. This is rough sketch..if you want.. i can improvise this later..to be generic. Dont forget to substitute your Database Name,server name, userid and password. The method call returns a list of table names. /*Java File*/ import java.sql.*; import java.util.*; public class MetaData{ String driverName="macromedia.jdbc.MacromediaDriver"; String url="jdbc:macromedia:sqlserver://SqlServer:1433"; String userid="YourUserid"; String pwd="YourPassword"; private String cat,schPattern,tblNPattern; private String tblTypes[]; public void setParms(String c,String s, String t){ if(c.equalsIgnoreCase("null")) cat=null; else cat=c; if(s.equalsIgnoreCase("null")) schPattern=null; else schPattern=s; if(t.equalsIgnoreCase("null")) tblNPattern=null; else tblNPattern=t; tblTypes=null; } /*String driverName="com.microsoft.jdbc.sqlserver.SQLServerDriver"; //String url="jdbc:microsoft:sqlserver://SqlServer:1433"; */ public String getTablesOnly(){ StringBuffer sb = new StringBuffer(); try{ Class.forName(driverName); Connection con = DriverManager.getConnection(url,userid,pwd); DatabaseMetaData md = con.getMetaData(); //System.out.println(md.getSQLKeywords()+"\n\n"); //System.out.println(md.getNumericFunctions()); //String tbTypes[]={"TABLE","User"}; ResultSet rs = md.getTables(cat,schPattern,tblNPattern,tblTypes); while(rs.next()){ sb.append(rs.getString("TABLE_NAME")+','); } rs.close(); con.close(); return sb.toString(); }catch(Exception e){ return e.toString(); } }//end getTablesOnly /* public static void main(String argv[]){ MetaData m = new MetaData(); System.out.println(m.getTablesOnly()); } */ } <!--- CF Code to get the tables ---> <cfobject action="create" class="MetaData" name="tables" type="JAVA"> <!--- Parm1:Catalog Parm2:SchemaPattern Parm3:tblNPattern I am not currently passsing any types.. but u can add them ---> <cfset tables.setParms("DBName","null","null")> <cfdump var="#tables.getTablesOnly()#"> Hope this gives you an idea. Joe On Mon, 25 Nov 2002 10:56:57 -0800 Dick Applebaum <[EMAIL PROTECTED]> wrote: > Joe > > Below is the Java source, originally caalled > DBViewer. > > This is working code that I modified to use the > CFMX cfsnippets db (The > PointBase > database shipped with the Linux distro). > > I want to accomplish the same thing within > CFMX, and generalize it a > bit so it will > work with any JDBC driver and database, > remote or local, on any platform. > > For remote dbs, there will be a stub program > that determines the > platform, CF > version, etc. and Uses COM objects or the Java > interface as needed. > Requests and data are exchanged via WDDX > packets. > > For local dbs the function could be included > inline (for performance) > or via the > stub (for convenience) > > The problem statements are shown at: 30, 38, > and 45. > > It is fairly easy to program equivalent CF > code, but you can't pass > nulls from CF. > > Given more time, I would probably do this: > > Use a Java program (similar to this) to do > the actual manipulation > of the JDBC driver. > > Use a CF routine to interface the Java > program: providing input > paramaters for the desired db request; and > presentation of the > results > > Use an alias (such as 'MyNull'), to exchange > psuedo nulls between > CF and Java, as necessary > > Any help will be greatly appreciated. > > TIA > > Dick > > > > 1 // public abstract ResultSet > getIndexInfo(String catalog, String > schema, String table, boolean unique, > boolean approximate) > throws SQLException; > 2 // public abstract ResultSet > getColumns(String catalog, String > schemaPattern, String tableNamePattern, String > columnNamePattern) > throws SQLException; > > 3 > 4 import java.sql.*; > 5 import java.util.StringTokenizer; > > 6 public class DBViewerPB { > > 7 final static String jdbcURL = > "jdbc:pointbase:cfsnippets,database.home=/opt/coldfusionmx/db"; > 8 final static String jdbcDriver = > "com.pointbase.jdbc.jdbcUniversalDriver"; > 9 final static String username = "PBPUBLIC"; > 10 final static String password = "PBPUBLIC"; > > 11 public static void main(java.lang.String[] > args) { > > 12 System.out.println("--- Database Viewer > ---"); > 13 > 14 try { > 15 Class.forName(jdbcDriver); > 16 Connection con = > DriverManager.getConnection(jdbcURL, > username, password); > > 17 DatabaseMetaData dbmd = > con.getMetaData( ); > > 18 System.out.println("Driver Name: " + > dbmd.getDriverName( )); > 19 System.out.println("Database Product: > " + > dbmd.getDatabaseProductName( )); > 20 System.out.println("Database Version: > " + > dbmd.getDatabaseProductVersion( )); > 21 System.out.println("SQL Keywords > Supported:"); > 22 //StringTokenizer st = new > StringTokenizer(dbmd.getSQLKeywords( ), ","); > 23 //while(st.hasMoreTokens( )) > 24 // System.out.println(" " + > st.nextToken( )); > 25 > 26 // Get a ResultSet that contains all > of the tables in this > database > 27 // We specify a table_type of "TABLE" > to prevent seeing system > tables, > 28 // views and so forth > 29 String[] tableTypes = { "TABLE" }; > 30 ResultSet allTables = > dbmd.getTables(null,null,null,tableTypes); > 31 while(allTables.next( )) { > 32 String table_name = > allTables.getString("TABLE_NAME"); > 33 System.out.println("Table Name: " + > table_name); > 34 System.out.println("Table Type: " + > > allTables.getString("TABLE_TYPE")); > 35 System.out.println("Indexes: "); > > 36 // Get a list of all the columns for > this table > 37 ResultSet columnList = > 38 > dbmd.getColumns(null,null,table_name,null); > 39 while(columnList.next( )) { > 40 System.out.println(" Column Name: > > "+columnList.getString("COLUMN_NAME")); > 41 } > 42 columnList.close( ); > > 43 // Get a list of all the indexes for > this table > 44 ResultSet indexList = > 45 > dbmd.getIndexInfo(null,null,table_name,false,false); > 46 while(indexList.next( )) { > 47 System.out.println(" Index Name: > "+indexList.getString("INDEX_NAME")); > 48 System.out.println(" Column Name: > > "+indexList.getString("COLUMN_NAME")); > 49 } > 50 indexList.close( ); > 51 } > > 52 allTables.close( ); > 53 con.close( ); > 54 } > 55 catch (ClassNotFoundException e) { > 56 System.out.println("Unable to load > database driver class"); > 57 } > 58 catch (SQLException e) { > 59 System.out.println("SQL Exception: " + > e.getMessage( )); > 60 } > 61 } > 62 } > > > On Monday, November 25, 2002, at 08:42 AM, Joe > Eugene wrote: > > > Dick, > > Can we see your code? Cant you have a method > that converts CF String > > "null" to > > Java String=null? > > > >> tried to invoke it with cfobject. We could > not > >> make the interface work > >> because we could not pass Nulls between CF > and > >> Java. > > > > Here is an example > > > > public class StringType{ > > private String str; > > public String getString(String s){ > > String val=""; > > str=s; > > if(str.equals("null")){ > > val="Your String was null, setting to null > now"; > > str = null; > > val= val+ " " +"Now Java value is : "+ str > +""; > > } > > return val; > > } > > } > > > > You can invoke it with > > type="JAVA"> > > > > #chkNull.getString("null")# > > > > > > if you can post your code, we can try figure > it out. Let me know. > > > > Joe > > > > On Mon, 25 Nov 2002 06:54:03 -0800 Dick > Applebaum > > wrote: > > > >> On Monday, November 25, 2002, at 01:43 AM, > >> Jochem van Dieten wrote: > >> > >>> Quoting Dave Carabetta : > >>>> > >>>> While I understand this isn't a feature > that > >> everybody would use, I > >>>> would personally like to see MM focus on > >> encapsulating some more Java > >>>> features into easy-to-use black-box CF > tags > >> rather than having to code > >>>> my own Java. > >>> > >>> I agree. For instance, it would be far > better > >> if CF had a tag to get at > >>> the DatabaseMetaData interface instead of > >> making it marginally easier > >>> to > >>> write it yourself by allowing inline Java. > >> > >> This is an excellent example & I expect that > >> this will be one of the > >> most-requested capabilities -- to be able to > >> get DatabaseMetaData into > >> CF. I tried to do this, with help from Sean > >> Corfield -- without > >> success. I found a working Java program that > >> extracts metadata, and > >> tried to invoke it with cfobject. We could > not > >> make the interface work > >> because we could not pass Nulls between CF > and > >> Java. > >> > >> This is for a general-purpose developer > utility > >> that I use to > >> manipulate databases. It is especially > useful > >> on remote (shared) sites > >> where you don't have administrative > >> privileges. > >> > >> I have been doing this a long time with CF > 4.5 > >> and CF 5 on win > >> platforms using cfobject to manipulate COM > >> objects. > >> > >> But, I would like to be able to do the same > >> thing with CFMX on > >> non-windows platforms. > >> > >> Here's the difficulty: > >> > >> With CFMX: > >> > >> I can get at the equivalent of > DatabaseMetaData > >> on a remote windows > >> box, using cfobject and COM objects. > >> > >> But, I can't get at the DatabaseMetaData on > my > >> local Unix (Mac OS X) > >> developer machine -- you can't use COM > objects > >> and can't pass the Nulls > >> to the Java program that gets the > >> DatabaseMetaData. > >> > >> I suppose there is a way to circumvent the > need > >> to pass Nulls between > >> CF and Java, but I have not had time to > >> investigate this. > >> > >>> And especially from the point of view of > >> security built-in tags are > >>> better. All those JSP tags and Java classes > >> are nice, but on a shared > >>> server you need to disable them anyway > >> because the same mechanism that > >>> is used to access them can be used to break > >> out of the sandbox. > >>> > >> > >> Is this true for CFMXJ2ee on JRun, Websphere > or > >> whatever? > >> > >> I thought that one of the advantages of > >> CFMXJ2ee on a J2ee-compliant > >> app server, is the ability to interoperate > >> between CF and Java programs. > >> > >> Will this be possible with Java access > >> disabled? > >> > >> For the DatabaseMetaData example, I would > >> prefer the CF tag approach. > >> > >> But, I still think it is valid to use Java, > >> where warranted, on a > >> developer machine. > >> > >> > >> Dick > >> > >> > >>> Jochem > >>> > >> > > > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| Archives: http://www.houseoffusion.com/cf_lists/index.cfm?forumid=4 Subscription: http://www.houseoffusion.com/cf_lists/index.cfm?method=subscribe&forumid=4 FAQ: http://www.thenetprofits.co.uk/coldfusion/faq Get the mailserver that powers this list at http://www.coolfusion.com