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.

Reply via email to