[Mondrian] xmla issues
Julian Hyde
julianhydepentaho at speakeasy.net
Thu Aug 4 14:03:54 EDT 2011
On Aug 4, 2011, at 6:57 AM, Michele Rossi wrote:
> Hi Julian,
> I took the trunk of mondrian and attempted to use the Olap4jXmlaServlet finding a couple more issues:
>
> 1. the method below needs to use "getDeclaringClass" and not getClass()
>
> private static OlapConnection createDelegatingOlapConnection(
> final Connection connection,
> final OlapConnection olapConnection)
> {
> return (OlapConnection) Proxy.newProxyInstance(
> olapConnection.getClass().getClassLoader(),
> new Class[] {OlapConnection.class},
> new InvocationHandler() {
> public Object invoke(
> Object proxy,
> Method method,
> Object[] args)
> throws Throwable
> {
> if (OlapConnection.class.isAssignableFrom(
> method.getDeclaringClass()))
> {
> return method.invoke(olapConnection, args);
> } else {
> return method.invoke(connection, args);
> }
> }
> }
> );
> }
> }
Agreed.
>
> 2. Even with the fix above the method call "unwrap" is sent to the wrapped commons-dbcp object which doesn't have it and that causes the Exception below.
>
> 2011-08-04 15:44:26,468 ERROR [mondrian.xmla.XmlaServlet] - <Errors when handling XML/A message>
> mondrian.xmla.XmlaException: Mondrian Error:XMLA Discover unparse results error
> at mondrian.xmla.XmlaHandler.discover(XmlaHandler.java:2812)
> at mondrian.xmla.XmlaHandler.process(XmlaHandler.java:608)
> at mondrian.xmla.impl.DefaultXmlaServlet.handleSoapBody(DefaultXmlaServlet.java:557)
> at mondrian.xmla.XmlaServlet.doPost(XmlaServlet.java:315)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
> at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
> at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
> at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
> at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
> at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
> at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
> at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
> at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
> at org.apache.coyote.http11.Http11NioProcessor.process(Http11NioProcessor.java:883)
> at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:721)
> at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:2258)
> at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
> at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
> at java.lang.Thread.run(Thread.java:662)
> Caused by: java.lang.reflect.UndeclaredThrowableException
> at $Proxy0.unwrap(Unknown Source)
> at mondrian.xmla.XmlaHandler.getExtra(XmlaHandler.java:69)
> at mondrian.xmla.RowsetDefinition$DbschemaCatalogsRowset.populateImpl(RowsetDefinition.java:2169)
> at mondrian.xmla.Rowset.populate(Rowset.java:220)
> at mondrian.xmla.Rowset.unparse(Rowset.java:192)
> at mondrian.xmla.XmlaHandler.discover(XmlaHandler.java:2806)
> ... 19 more
> Caused by: java.lang.reflect.InvocationTargetException
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597)
> at mondrian.xmla.impl.Olap4jXmlaServlet$1.invoke(Olap4jXmlaServlet.java:453)
> ... 25 more
> Caused by: java.lang.AbstractMethodError: org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.unwrap(Ljava/lang/Class;)Ljava/lang/Object;
> ... 30 more
>
>
> A possible fix is to add that "catch (AbstractMethodException e)" clause to the method below in XmlaHandler.java line 2806
>
>
> public static XmlaExtra getExtra(OlapConnection connection) {
> try {
> final XmlaExtra extra = connection.unwrap(XmlaExtra.class);
> if (extra != null) {
> return extra;
> }
> } catch (SQLException e) {
> // Connection cannot provide an XmlaExtra. Fall back and give a
> // default implementation.
> } catch (AbstractMethodError e) {
> // the connection does not implement the "unwrap" method
> }
> return new XmlaExtraImpl();
> }
>
>
> What do you think?
Are you running JDK 1.5? If so, java.sql.Connection does not implement "unwrap" (it was introduced in JDBC 4.0, i.e. JDK 1.6) but org.olap4j.OlapConnection implements a similar-looking-but-different "unwrap" method.
In any case, the "unwrap" and "isWrapperFor" methods -- i.e. the methods on java.sql.Wrapper -- should be handled differently than regular methods. I'm not sure whether they should be dispatched to olapConnection or connection, but try both. I don't think we should handle AbstractMethodException -- that is a sign that we are dispatching to the wrong place.
Julian
More information about the Mondrian
mailing list