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
This list and all House of Fusion resources hosted by CFHosting.com. The place for
dependable ColdFusion Hosting.