Again, I could be totally misinformed - I only write cfx_ tags at home with a dev edition and it's not too bad typing
$/opt/coldfusionmx/bin/coldfusion stop $/opt/coldfusionmx/bin/coldfusion start (i dont trust restart) Then take them to work and acctuallly add them to live server (which I restart) But I would dig auto-reload - if it's not already there. 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 3:03 PM To: CF-Talk Subject: Re: Java in CF (CFMX) Rob Are you saying that you need to restart CFMX to install a new Java class. Now there's a convenient, user-friendly, implementation. If what you say is true, I think you have just made the case for inline Java -- at least for developers Do you mean that a CF production house, running clusters, and all that, need to recycle the whole system, say just to fix a bug in a Java tag? Do people put up with this? Is this true of CFMXJ2ee? Is this true on pure Java appservers like WebSphere, etc? I recycled CFMX & the new Java class was recognized. -- Head shaking in disbelief--- Dick On Tuesday, November 26, 2002, at 02:29 PM, Rob Rohan wrote: > 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 Signup for the Fusion Authority news alert and keep up with the latest news in ColdFusion and related topics. http://www.fusionauthority.com/signup.cfm