This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

Bug 137644 - Cannot generate WSDL with SQL Module and Oracle DB
Summary: Cannot generate WSDL with SQL Module and Oracle DB
Status: NEW
Alias: None
Product: soa
Classification: Unclassified
Component: SQL Project (show other bugs)
Version: 6.x
Hardware: All All
: P3 blocker (vote)
Assignee: Venkat Srinivasan
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2008-06-18 23:21 UTC by jozwicki
Modified: 2009-03-29 12:43 UTC (History)
0 users

See Also:
Issue Type: DEFECT
Exception Reporter:


Attachments
Fix for generating WSDL from SQL using Oracle JDBC driver (4.55 KB, patch)
2008-06-24 10:47 UTC, jozwicki
Details | Diff
Fixed SQL Module jar (478.00 KB, application/octet-stream)
2008-06-24 11:24 UTC, jozwicki
Details

Note You need to log in before you can comment on or make changes to this bug.
Description jozwicki 2008-06-18 23:21:26 UTC
Netbeans throws error while generating WSDL file for SQL Module which uses Oracle DB and Oracle JDBC driver:

java.sql.SQLException: Handle does not exist: getMetaData
	at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
	at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:112)
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:173)
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:229)
	at oracle.jdbc.driver.OracleResultSetImpl.getMetaData(OracleResultSetImpl.java:141)
	at oracle.jdbc.driver.OraclePreparedStatement.getMetaData(OraclePreparedStatement.java:4091)
	at oracle.jdbc.driver.OraclePreparedStatementWrapper.getMetaData(OraclePreparedStatementWrapper.java:1498)
	at org.netbeans.modules.sql.project.dbmodel.DBMetaData.getPrepStmtResultSetColumns(DBMetaData.java:1858)
	at org.netbeans.modules.sql.project.dbmodel.DBMetaData.getPrepStmtMetaData(DBMetaData.java:711)
	at org.netbeans.modules.sql.project.dbmodel.DBMetaData.getPrepStmtMetaData(DBMetaData.java:737)
	at org.netbeans.modules.sql.project.wsdl.WSDLGenerator.generateSelectSchemaElements(WSDLGenerator.java:935)
	at org.netbeans.modules.sql.project.wsdl.WSDLGenerator.modifyMessageTypes(WSDLGenerator.java:412)
	at org.netbeans.modules.sql.project.wsdl.WSDLGenerator.modifyWSDL(WSDLGenerator.java:353)
	at org.netbeans.modules.sql.project.wsdl.WSDLGenerator.generateWSDL(WSDLGenerator.java:321)
	at org.netbeans.modules.sql.project.wsdl.GenFiles.execute(GenFiles.java:266)
	at org.netbeans.modules.sql.project.wsdl.GenFiles.actionPerformed(GenFiles.java:151)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
	at javax.swing.AbstractButton.doClick(AbstractButton.java:357)
	at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1220)
	at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1261)
	at java.awt.Component.processMouseEvent(Component.java:6041)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
	at java.awt.Component.processEvent(Component.java:5806)
	at java.awt.Container.processEvent(Container.java:2058)
	at java.awt.Component.dispatchEventImpl(Component.java:4413)
	at java.awt.Container.dispatchEventImpl(Container.java:2116)
	at java.awt.Component.dispatchEvent(Component.java:4243)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
	at java.awt.Container.dispatchEventImpl(Container.java:2102)
	at java.awt.Window.dispatchEventImpl(Window.java:2440)
	at java.awt.Component.dispatchEvent(Component.java:4243)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
	at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:104)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

Oracle driver can't get metadata for statement which wasn't executed.
I have decompiled org.netbeans.modules.sql.project.dbmodel.DBMetaData and fixed it slightly:


private ResultSetColumn[] getPrepStmtResultSetColumns(PreparedStatement preparedstatement)
        throws SQLException
    {
        String s = "";
        errPrepStmtResultSetColumns = false;
        ResultSetColumn aresultsetcolumn[] = null;
+        try {
+        	int i=0;
+        	try {
+        		while(true)
+        			preparedstatement.setNull(++i, java.sql.Types.NULL);
+        	}
+        	catch (SQLException sqe)
+        	{
+        		// sqe.printStackTrace();
+                       // usually no more parameters to bind
+        	}
+        	preparedstatement.execute();
+        }
+        catch (Exception e) {}
        try
        {
            ResultSetMetaData resultsetmetadata = preparedstatement.getMetaData();
            int i = 0;
            if(resultsetmetadata != null)
                i = resultsetmetadata.getColumnCount();
            else
                errPrepStmtResultSetColumns = true;
            if(i > 0)
            {
                aresultsetcolumn = new ResultSetColumn[i];
                for(int j = 1; j <= i; j++)
                {
                    ResultSetColumn resultsetcolumn = new ResultSetColumn();
                    resultsetcolumn.setName(resultsetmetadata.getColumnName(j));
                    resultsetcolumn.setSqlType(getSQLTypeDescription(resultsetmetadata.getColumnType(j)));
                    resultsetcolumn.setJavaType(getJavaFromSQLTypeDescription(resultsetcolumn.getSqlType()));
                    resultsetcolumn.setOrdinalPosition(j);
                    resultsetcolumn.setNumericPrecision(resultsetmetadata.getPrecision(j));
                    resultsetcolumn.setNumericScale(resultsetmetadata.getScale(j));
                    if(resultsetmetadata.isNullable(j) == 1)
                        resultsetcolumn.setIsNullable(true);
                    else
                        resultsetcolumn.setIsNullable(false);
                    aresultsetcolumn[j - 1] = resultsetcolumn;
                }

            }
        }
        catch(SQLException sqlexception)
        {
            errPrepStmtResultSetColumns = true;
            aresultsetcolumn = null;
            sqlexception.printStackTrace();
            String s1 = sqlexception.getLocalizedMessage();
            throw sqlexception;
        }
        return aresultsetcolumn;
    }
Comment 1 jozwicki 2008-06-18 23:35:19 UTC
Maybe for databases which don't support getting statement metadata before statement execution
there should be some dialog box asking for standard parameters for binding.

Here is WSDL generated for 'select sysdate as s1, sysdate+1 as s2 from dual' with applied patch:

<?xml version="1.0" encoding="UTF-8"?>
<definitions name="SQLApp1" targetNamespace="http://com.sun.jbi/sqlse/sqlseengine"
xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://com.sun.jbi/sqlse/sqlseengine"
xmlns:slnk="http://schemas.xmlsoap.org/ws/2002/07/service-link/"
xmlns:plink="http://docs.oasis-open.org/wsbpel/2.0/plnktype" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
    <types>
        <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
targetNamespace="http://com.sun.jbi/sqlse/sqlseengine" xmlns="http://com.sun.jbi/sqlse/sqlseengine">
            <xsd:element name="sysdateRequest">
                <xsd:complexType>
                    <xsd:sequence/>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="sysdateResponse">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element maxOccurs="unbounded" ref="record"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="record">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="S1" type="xsd:string"/>
                        <xsd:element name="S2" type="xsd:string"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
        </xsd:schema>
    </types>
    <message name="sysdateRequest">
        <part name="sysdateRequestPart" element="tns:sysdateRequest"/>
    </message>
    <message name="sysdateResponse">
        <part name="sysdateResponsePart" element="tns:sysdateResponse"/>
    </message>
    <portType name="SQLApp1_sqlsePortType">
        <operation name="sysdate">
            <input name="sysdateRequest" message="tns:sysdateRequest"/>
            <output name="sysdateResponse" message="tns:sysdateResponse"/>
        </operation>
    </portType>
    <binding name="SQLApp1Binding" type="tns:SQLApp1_sqlsePortType">
        <operation name="sysdate">
            <input name="sysdateRequest">
            </input>
            <output name="sysdateResponse">
            </output>
        </operation>
    </binding>
    <service name="SQLApp1_sqlseService">
        <port name="SQLApp1_sqlsePort" binding="tns:SQLApp1Binding">
        </port>
    </service>
    <plink:partnerLinkType xmlns:plink="http://docs.oasis-open.org/wsbpel/2.0/plnktype" name="SQLApp1_sqlsePartnerLinkType">
        <plink:role name="SQLApp1_myrole" portType="tns:SQLApp1_sqlsePortType"/>
    </plink:partnerLinkType>
</definitions>

Result is not 100% correct, however better than nothing.

Comment 2 jozwicki 2008-06-19 14:25:17 UTC
also

resultsetcolumn.setName(resultsetmetadata.getColumnName(j));
resultsetcolumn.setSqlType(getSQLTypeDescription(resultsetmetadata.getColumnType(j)));
resultsetcolumn.setJavaType(getJavaFromSQLTypeDescription(resultsetcolumn.getSqlType()));
try { 
    resultsetcolumn.setOrdinalPosition(j);
} catch (Exception e) {}
try {
    resultsetcolumn.setNumericPrecision(resultsetmetadata.getPrecision(j));
} catch (Exception e) {}
try { 
    resultsetcolumn.setNumericScale(resultsetmetadata.getScale(j));
} catch (Exception e) {}

would help.
If I have free time I can try to install Mercurial, download source and deliver patch.
Comment 3 jozwicki 2008-06-24 10:47:40 UTC
Created attachment 63323 [details]
Fix for generating WSDL from SQL using Oracle JDBC driver
Comment 4 jozwicki 2008-06-24 11:24:24 UTC
Created attachment 63324 [details]
Fixed SQL Module jar
Comment 5 Sergey Lunegov 2008-10-01 14:20:31 UTC
Changed target milestone.
Comment 6 jozwicki 2009-03-29 12:43:26 UTC
http://systest.googlecode.com/files/org-netbeans-modules-sql-project.jar

Here is SOA2 SQL module fixed for Oracle select, insert, update, delete and call operations.
Class org.netbeans.modules.sql.project.dbmodel.DBMetaData was taken from soa-dev65.