Rob
You are right!
The thread is/was about inline Java (someone, maybe you started it)
I posted that I would like to see inline Java for several reasons:
to gently learn Java
to get at some capabilities not available in CF
etc.
Several others posted.
Then, Jochem posted that he thought inline Java was a security exposure
and
MM should provide some superfunctions, for example getting
DatabaseMetaData.
I posted that this was one of the things I wanted to do with inline
Java but would be
prefer a superfunction. I also said that I had a working Java program
that accessed
DatabaseMetaData, but could not accomplish the same with CF.
Joe posted asking to see the code
--and you know the rest.
So, the thread changed topic a little -- to how interface CF to a Java
program to get
DatabaseMateData.
I haven't tried Joe's code yet, but it looks like it will work --
Thanks Joe! (I'll report back, later).
But, Rob, your point was well made -- with inline Java, you wouldn't
need to have a separate
Java program to interface, maintain, compile, etc.
This could be done entirely in a single CF program, if inline Java were
available -- and it would
be a lot cleaner and much much more consistent with the "ease-of-use"
and "self-documenting"
philosophy/strength of CF..
In fact, this is exactly the kind of Java snippet (and justification) I
had in mind when
I originally posted to this thread.
Dick
On Monday, November 25, 2002, at 02:45 PM, Rob Rohan wrote:
> Thought this thread was still about inline java. Sorry - maybe it was
> another thread.
>
> nevermind.
>
> Rob
>
> -----Original Message-----
> From: Joe Eugene [mailto:[EMAIL PROTECTED]]
> Sent: Monday, November 25, 2002 2:40 PM
> To: CF-Talk
> Subject: RE: Java in CF (CFMX)
>
>
>> wouldn't need to happen.
> Where do u want it happen?
>
> Joe
>
> On Mon, 25 Nov 2002 14:37:29 -0800 Rob Rohan <[EMAIL PROTECTED]>
> wrote:
>
>> See though the whole point is
>>
>>> The Java file should be compiled
>>> under WEB-INF/classes/
>>> and you can invoke it with CFObject.
>>
>
>>
>>
>> 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());
>> }
>> */
>> }
>>
>>
>>
>>
>>
>>
>>
>> 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