You made it so that it will only work if DEBUG is enabled.  This will work
in all circumstances:

(see
http://opensource.atlassian.com/confluence/oss/pages/viewpage.action?pageId=15597591
)

public Object getResult(ResultGetter getter) throws SQLException {
  logger.info("Entered getResult(ResultGetter getter)");
  Object xmlDocument = null;
  ResultSet realResultSet = getter.getResultSet();

  if (Proxy.isProxyClass(realResultSet.getClass())) {
    InvocationHandler ih = Proxy. getInvocationHandler(realResultSet);
    if (ih instanceof ResultSetLogProxy) {
      realResultSet = ((ResultSetLogProxy) ih).getRs();
    } else {
      logger.error("Some non-iBATIS ResultSet Proxy");
    }
  }
  OracleResultSet ors = (OracleResultSet) realResultSet;
  OPAQUE opaqueValue = null;
  if (getter.getColumnName() != null)  {
    opaqueValue = ors.getOPAQUE(getter.getColumnName());
  } else {
    opaqueValue = ors.getOPAQUE(getter.getColumnIndex());
  }

  if (opaqueValue != null) {
    XMLType xmlResult = XMLType.createXML(opaqueValue);
    xmlDocument = xmlResult.getDOM();
  } else {
    xmlDocument = null;
  }
  return xmlDocument;
}

Jeff Butler



On Tue, Apr 29, 2008 at 2:19 PM, <[EMAIL PROTECTED]> wrote:

>
> Jeff,
>
> Here is my code for ResultSet TypeHandlerCallback.
>
>
>        public Object getResult(ResultGetter getter) throws SQLException
>       {
>          logger.info("Entered getResult(ResultGetter getter)");
>          Object xmlDocument = null;
>          ResultSet rs = getter.getResultSet();
>
>           if (Proxy.isProxyClass(rs.getClass()))
>          {
>            InvocationHandler ih = Proxy. getInvocationHandler(rs);
>            if (ih instanceof ResultSetLogProxy)
>            {
>                ResultSet realResultSet = ((ResultSetLogProxy) ih).getRs();
>                OracleResultSet ors = (OracleResultSet) realResultSet;
>                OPAQUE opaqueValue = null;
>                if (getter.getColumnName() != null)
>                {
>                    opaqueValue = ors.getOPAQUE(getter.getColumnName());
>                }
>                else
>                {
>                    opaqueValue = ors.getOPAQUE(getter.getColumnIndex());
>                }
>               if (opaqueValue != null)
>               {
>                   XMLType xmlResult = XMLType.createXML(opaqueValue);
>                   xmlDocument = xmlResult.getDOM();
>               }
>               else
>               {
>                   xmlDocument = null;
>               }
>            }
>          }
>          else
>          {
>              logger.error("ResultSet class is not Proxy class");
>              xmlDocument = null;
>          }
>          return xmlDocument;
>        }
>
>
> I have ibatis-2.3.0.677.jar and I have tried with both log4j-1.2.8.jar and
> log4j-1.2.13.jar as well. But as long as I keep the log level to DEBUG it
> works fine. If I change it to either INFO or ERROR,  I am getting error on
> reading resultset for XML datatype
>
> [29 Apr 2008 11:58:33] INFO  [XMLTypeHandlerCallback] Entered
> getResult(ResultGetter getter)
>      [exec] [29 Apr 2008 11:58:33] ERROR [XMLTypeHandlerCallback]
> ResultSet class is not Proxy class
>      [exec] [29 Apr 2008 11:58:33] INFO  [XMLTypeHandlerCallback] Entered
> getResult(ResultGetter getter)
>      [exec] [29 Apr 2008 11:58:33] ERROR [XMLTypeHandlerCallback]
> ResultSet class is not Proxy class
>      [exec] java.lang.NullPointerException
>      [exec]         at
> org.jdom.input.DOMBuilder.buildTree(DOMBuilder.java:166)
>      [exec]         at
> org.jdom.input.DOMBuilder.build(DOMBuilder.java:135):
>
>
> How do I fix it for log level ERROR or INFO?
>
> Thanks
> Jasmin
>
>
>
>
>   *"Jeff Butler" <[EMAIL PROTECTED]>*
>
> 12/26/2007 10:30 PM
>    Please respond to
> [email protected]
>
>    To
> [email protected]  cc
>   Subject
> Re: Exception "XMLType mapping only supported for Oracle RDBMS"
>
>
>
>
> Here's how to get the real resultset from a the proxied class:
>
>
> *public* Object getResult(ResultGetter getter) *throws* SQLException {
>  ResultSet rs = getter.getResultSet();*
>  if* (Proxy.*isProxyClass*(rs.getClass())) {
>    InvocationHandler ih = Proxy. *getInvocationHandler*(rs);*
>    if* (ih *instanceof* ResultSetLogProxy) {
>      ResultSet realResultSet = ((ResultSetLogProxy) ih).getRs();
>      // do something here...
>    }
>  }
> }
>
> It's ugly - but it works.
>
> Jeff Butler
> On Dec 26, 2007 11:37 AM, <[EMAIL PROTECTED]<[EMAIL PROTECTED]>>
> wrote:
>
> Jeff,
>
> I did read your posting at *
> http://www.mail-archive.com/[email protected]/msg06898.html*<http://www.mail-archive.com/[email protected]/msg06898.html>
>  already before sending this question. I could not understand how/where do I
> modify the code to consider proxy class.
>
> My getOpaqueValue() displays *ResultSet class is: $Proxy2, *not
> ResultSetLogProxy.
>
> The program DOES WORK if I turn off logging.
>
> I tried something like this:
>
>  public Object getResult(ResultGetter getter) throws SQLException {
>    //    if (getter.getResultSet() instanceof OracleResultSet) {
>            OPAQUE opaqueValue = getOpaqueValue(getter);
>            if (opaqueValue != null) {
>                XMLType xmlResult = XMLType.createXML (opaqueValue);
>                return xmlResult.getDOM();
>            } else {
>                return null;
>            }
>     //   } else {
>      //      throw new UnsupportedOperationException("XMLType mapping only
> supported for Oracle RDBMS");
>      //  }
>    }
>
>
>    private OPAQUE getOpaqueValue(ResultGetter getter) throws SQLException
> {
>
>
>          java.sql.ResultSet rs = getter.getResultSet();
>          System.out.println("ResultSet class is: " + rs.getClass());
>    //       ResultSetLogProxy rsProx =  (ResultSetLogProxy)rs;
>          OracleResultSet ors =
> (OracleResultSet)ResultSetLogProxy.newInstance(rs);         //--- *THROWS
> ClassCastException*
>          OPAQUE op = null;
>          if (getter.getColumnName() != null) {
>              op = ors.getOPAQUE(getter.getColumnName());
>          } else {
>              op = ors.getOPAQUE(getter.getColumnIndex());
>          }
>          return op;
>      }
>
>
> Thanks
>
>
>
>   *"Jeff Butler" <[EMAIL PROTECTED] <[EMAIL PROTECTED]>*>*
>
> 12/26/2007 12:24 PM
>   Please respond to
> *
> [EMAIL PROTECTED] <[email protected]>
>
>
>   To
> [EMAIL PROTECTED] <[email protected]>  cc
>   Subject
> Re: Exception "XMLType mapping only supported for Oracle RDBMS"
>
>
>
>
>
> The code in the wiki article does not take into account the fact that
> iBATIS logging changes the normal classes to proxy classes.  First thing to
> do is turn off logging to see it will work.  Second thing, the code must be
> modified to account for the proxy class if logging is enabled (add another
> instanceof check for the proxy class, then unwind the embedded "real"
> class).
>
> See here for more information:
>  *
> **http://www.mail-archive.com/[email protected]/msg06898.html*<http://www.mail-archive.com/[email protected]/msg06898.html>
>
> Jeff Butler
>
>
>
> On Dec 26, 2007 10:26 AM, < [EMAIL PROTECTED]<[EMAIL PROTECTED]>>
> wrote:
>
> I am using code as directed in this url: *
> **
> **http://opensource.atlassian.com/confluence/oss/display/IBATIS/XMLTypeHandlerCallback.java
> *<http://opensource.atlassian.com/confluence/oss/display/IBATIS/XMLTypeHandlerCallback.java>
>
> It throw UnsupportedOperationException("XMLType mapping only supported for
> Oracle RDBMS");
>
> I have logger set to DEBUG  mode.
>
> I tried displaying class from ResultSet like :
>
>        java.sql.ResultSet rs = getter.getResultSet();
>        System.out.println("ResultSet class is: " + rs.getClass());
>
> The cosole displays
>
> [20 Dec 2007 15:15:05] DEBUG [PreparedStatement] {pstm-100001} Executing
> Statement:         SELECT OTM, SEQUENCE, MESSAGETYPE, MESSAGEID, STATUS,
> PROCESSED_TIME, CREATED     FROM OTM_XML
> [20 Dec 2007 15:15:05] DEBUG [PreparedStatement] {pstm-100001} Parameters:
> []
> [20 Dec 2007 15:15:05] DEBUG [PreparedStatement] {pstm-100001} Types: []
> [20 Dec 2007 15:15:05] DEBUG [ResultSet] {rset-100002} ResultSet *
> ResultSet class is: class $Proxy2 *
>
> I am using JDeveloper *10.1.3.1* <http://10.1.3.1/>
>
> What should I change in my code to make it working?
>
> Thanks
>
> *
> ******************************************************************************
> *
> ATTENTION ATTENTION ATTENTION ATTENTION ATTENTION
> Our domain name is changing.  Please take note of the sender's
> e-Mail address and make changes to your personal address list,
> if needed.  Both domains will continue to work, only for a limited
> time.
>
> ******************************************************************************
> This email and any files transmitted with it are intended solely for
> the use of the individual or agency to whom they are addressed.
> If you have received this email in error please notify the Navy
> Exchange Service Command e-mail administrator. This footnote
> also confirms that this email message has been scanned for the
> presence of computer viruses.
>
> Thank You!            *
>
> ******************************************************************************
> *
>
>

Reply via email to