ah, the fun of writting cf java tags. After you make a change and recompile, you'll need to cycle the service to re-read the class file...
unless there is a better way that I don't know about. Rob http://treebeard.sourceforge.net http://ruinworld.sourceforge.net Scientia Est Potentia -----Original Message----- From: Dick Applebaum [mailto:[EMAIL PROTECTED]] Sent: Tuesday, November 26, 2002 2:21 PM To: CF-Talk Subject: Re: Java in CF (CFMX) Joe I have been modifing with your Java code to return tables and columns and I ran into a weird situation. for convenience, I put the ,java file in WEB-INF/classes I recompile the program and get a class file I run the CF template, but get the old version of the class file I even deleted the class file -- something is being cached, somewhere -- Where? TIA Dick On Tuesday, November 26, 2002, at 01:35 PM, Joe Eugene wrote: > Dick > > No problem, i got the same solution working with MM,MS-SQL and Oracle > drivers > without any problem. >> You, likely, saved me several hours of >> frustration. > Now the ideal solution would be to return Complex > Objects/Types(Structs,ResultSets) back to CFMX. Havent had a chance to > play > with Structs(CFMX-Java) compatibility. > >> Is there value to the Java developer (new or >> experienced) to inline >> code -- Yes, > > I understand your need. A while ago, we looked at the generated Java > code(Real > Ugly!) from a *.cfm page. A lot of ugly wrappers coverting loose *.cfm > TYPES > to strong Java Types..(Result..Slow pages)(Topic Jsp vs Cfm). > > InLine Java Code. > If this ever happens, ideally.. CFMX complier should create a helper > class > file and let Java Complier, compile it like a Jsp page.. this would be > excellent.. but again IS'nt CfObject doing the same thing?(seperating > the > helper/model class from presentation)...Am trying to relate to "Inline > Java".. > So what overall advantage do we get with Inline Java? Any > Performance...? > other than coding between CF/Java in templates? > > I am not against InLine Java.. just trying to understand the Mechanics. > > Joe > > On Tue, 26 Nov 2002 07:10:11 -0800 Dick Applebaum <[EMAIL PROTECTED]> > wrote: > >> Joe >> >> Your example, does, in fact work. >> >> Of course, I needed to modify the Java code to >> specify a different >> database -- >> none of the MS databases appear to work on Mac >> OS X (or and non-win >> platform) :) >> >> This is enough to get me started -- I will add >> the flexibility to the >> interface so it >> will work with any JDBC driver, and any >> MetaData request. >> >> Thanks >> >> I have never written a wrapper for a Java >> program & it helps to start >> with a >> working example, and concise instructions. >> >> You, likely, saved me several hours of >> frustration. >> >> I think that implementing and deploying this >> example is a good >> illustration of the >> value of inline Java. >> >> Someone new to Java, like myself, could take >> your example and drop it >> into a simpleCF template, >> between tags. Then they could add the CFML >> portion in the >> same template. More likely, >> you would have provided a complete, standalone >> CF Template with the >> Java code, inline. >> >> Then they could save and test the template >> without concern for: >> >> 1) Separating your file into its Java and >> CFML component parts. >> >> 2) Where to put the Java source >> >> 3) How to compile the Java class >> >> 4) Which Java compiler options to use and >> their proper settings -- >> things such as: >> >> Usage: javac >> where possible options include: >> -g Generate >> all debugging info >> -g:none Generate >> no debugging info >> -g:{lines,vars,source} Generate >> only some debugging info >> -O Optimize; >> may hinder debugging or >> enlarge class file >> -nowarn Generate >> no warnings >> -verbose Output >> messages about what the >> compiler is doing >> -deprecation Output >> source locations where >> deprecated APIs are used >> -classpath Specify where to >> find user class >> files >> -sourcepath Specify where to >> find input source >> files >> -bootclasspath Override >> location of bootstrap >> class files >> -extdirs Override >> location of installed >> extensions >> -d Specify where to >> place generated >> class files >> -encoding Specify character >> encoding used by >> source files >> -target Generate class >> files for specific >> VM version >> >> 5) Figuring out the command line interface >> or some Java IDE, just to >> be able to compile the Java program. >> >> 6) Where to put the Java class >> >> 7) Where to get a Java compiler if one >> isn't installed on their >> platform (Mac OS X comes, >> standard, with a JDK, but many >> platforms do not). >> >> Sure, these are things that the new Java person >> will need to learn >> eventually. But, is it necessary to >> overload the new Java user with all this >> minutiae, just to try a simple >> Java example -- I think not! >> >> Is there value to the Java developer (new or >> experienced) to inline >> code -- Yes, I've noted some >> advantages to the lay person. But, Joe, who is >> experienced with Java, >> could have benefitted from >> inline Java too. I suspect he would have saved >> time preparing/testing >> his example and the instructions >> how to deploy it : >> >> 1) He, simply, could have provided a single >> CF template with the >> Java inline; rather than a Java >> program and a separate CF template. >> >> 2) He could have avoided typing the >> instructions to compile and >> deploy the Java program >> >> 3) The flow of the example, likely, would >> be better, better >> understood, and easier >> to explain and document within the >> code (both CF and Java >> Comments) >> >> 4) He'd have a single file, a complete >> example, with no special >> instructions -- >> Just "Save it and Run it" as you would >> any other CF template. >> >> >> Is there significant [enough] value, that MM >> should consider >> implementing inline Java -- >> I think so -- what it boils down to is this: >> inline Java is an >> improved interface to >> many Java programs -- much the way that (and >> the associated >> , , etc.) tags >> are an improvement to many SQL databases. >> Here are some advantages to >> MM. >> >> 1) The CFMX product could have another >> productivity advantage for >> developers, and >> resellers... hmm... I wonder if IBM >> could use this feature.... >> >> 2) Macromedia could more easily, and more >> effectively include many >> Java examples >> in the code they distribute, >> >> 3) Inline Java could facilitate writing, >> testing and documenting >> wrappers for many >> Java programs (whether deployed inline >> or not). >> >> 4) It could be easier to reconcile Java >> constructs of strong typing, >> nulls, etc, with the absence >> these constructs in CFML. In fact. >> inline Java, could provide a >> very nice means to help >> pass data between CFML and Java -- >> something like >> where you could >> specify typing, nulls, etc. in a way >> meaningful to both CFML and >> Java. >> >> 5) If MM were to implement , they could >> delay (or >> postpone indefinitly) the >> request to add these features to CF >> (requiring major >> reengineering of CF, according to some). >> this could be a placeholder, preserving >> MM's options, while >> deferring revision of CFML! >> >> 6) If MM did decide to add typing, nulls, >> etc to a later version >> CFML, they would have an existing standard >> (the cfjavaparam placeholder) that >> would make it easier to >> implement compatibility. >> >> OK, I was careful to use words like "many, >> could, etc.". Do the >> benefits of inline Java apply to all -- Nah! >> >> But, here is a feature that "could" be of use >> to "many" -- Macromedia, >> Resellers, Developers, end users, >> >> As Phil Costa said at the beginning of this >> thread, MM did consider it, >> and it wasn't a "cut and dried" decision. >> >> It may be worth reconsidering! >> >> Dick >> >> P.S. Thanks, again, Joe! >> >> >> >> >> >> >> >> >> On Monday, November 25, 2002, at 02:32 PM, Joe >> Eugene wrote: >> >>> 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()); >>> } >>> */ >>> } >>> >>> >>> >>> Parm1:Catalog >>> Parm2:SchemaPattern >>> Parm3:tblNPattern >>> I am not currently passsing any types.. but u >> can add them >>> ---> >>> >>> >>> >>> Hope this gives you an idea. >>> Joe >>> >>> >>> >>> On Mon, 25 Nov 2002 10:56:57 -0800 Dick >> Applebaum >>> 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 Your ad could be here. Monies from ads go to support these lists and provide more resources for the community. http://www.fusionauthority.com/ads.cfm