Hi,

With the latest API-M pack build in public branch,when thrift enabled,there
was an ClassCastException[1] thrown while invoking APIs published through
APIStore.

When going through the code,found that issue is appearing with obtaining
the current context for a Thrift Session.

In the method 'getCurrentCarbonContextHolder(ThriftSession
thriftSession, boolean
addToSession)' of 'CarbonContextDataHolder' class there's an attribute is
set for ThriftSession with the object type 'CarbonContextDataHolder'
 [which is currently resides inside a private package]  and without
wrapping it through publicly accessible interface class object either "
CarbonContext/PrivilegedCarbonContext" as below.

       * private static CarbonContextDataHolder
getCurrentCarbonContextHolder(ThriftSession thriftSession,*
*
 boolean addToSession) {*
*        Object contextObject =
thriftSession.getSessionCarbonContextHolder();*
*        if (contextObject != null) {*
*            return (CarbonContextDataHolder) contextObject;*
*        } else if (!addToSession) {*
*            return null;*
*        }*
*        CarbonContextDataHolder context = getClone();*
*        log.debug("Added CarbonContext to the Thrift Session");*
*        thriftSession.setAttribute(CARBON_CONTEXT_HOLDER, context);*
*        return context;*
*    }*

>From the APIMgt Keymgt code,we are invoking the method which returns the
above setter attribute and with the current implementation though it is
returning a 'CarbonContextDataHolder' object,it's trying to  cast that
object  to 'CarbonContext' type  as below.

     public CarbonContext getSessionCarbonContextHolder() {
        CarbonBaseUtils.checkSecurity(ALLOWED_METHODS);
       * return (CarbonContext) attributeMap.get(CARBON_CONTEXT_HOLDER);*
    }

and  then the error[1] is appearing. This issue is fixed[r 144918] .Thanks
Pradeep for help on it.

Additionally we noticed same issue can be appeared when getting carbon
context holder for *HTTPSession* as well. It would be great Platform team
can look in to that as well.


[1] java.lang.ClassCastException:
org.wso2.carbon.context.internal.CarbonContextDataHolder cannot be cast to
org.wso2.carbon.context.CarbonContext
at
org.wso2.carbon.utils.ThriftSession.getSessionCarbonContextHolder(ThriftSession.java:141)
at
org.wso2.carbon.apimgt.keymgt.service.thrift.APIKeyValidationServiceImpl.populateCurrentCarbonContextFromAuthSession(APIKeyValidationServiceImpl.java:56)
at
org.wso2.carbon.apimgt.keymgt.service.thrift.APIKeyValidationServiceImpl.validateKey(APIKeyValidationServiceImpl.java:99)
at
org.wso2.carbon.apimgt.keymgt.service.thrift.APIKeyValidationService$Processor$validateKey.getResult(APIKeyValidationService.java:177)
at
org.wso2.carbon.apimgt.keymgt.service.thrift.APIKeyValidationService$Processor$validateKey.getResult(APIKeyValidationService.java:165)
at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:32)
at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:34)
at
org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:176)
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)
[2012-10-04 13:26:53,929] ERROR - ThriftKeyValidatorClientPool Login
failed.. Reauthenticating again..
[2012-10-04 13:26:53,984] ERROR - TThreadPoolServer Error occurred during
processing of message.
java.lang.ClassCastException:
org.wso2.carbon.context.internal.CarbonContextDataHolder cannot be cast to
org.wso2.carbon.context.CarbonContext
at
org.wso2.carbon.utils.ThriftSession.getSessionCarbonContextHolder(ThriftSession.java:141)
at
org.wso2.carbon.apimgt.keymgt.service.thrift.APIKeyValidationServiceImpl.populateCurrentCarbonContextFromAuthSession(APIKeyValidationServiceImpl.java:56)
at
org.wso2.carbon.apimgt.keymgt.service.thrift.APIKeyValidationServiceImpl.validateKey(APIKeyValidationServiceImpl.java:99)
at
org.wso2.carbon.apimgt.keymgt.service.thrift.APIKeyValidationService$Processor$validateKey.getResult(APIKeyValidationService.java:177)
at
org.wso2.carbon.apimgt.keymgt.service.thrift.APIKeyValidationService$Processor$validateKey.getResult(APIKeyValidationService.java:165)
at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:32)
at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:34)
at
org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:176)
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)

Thanks;
-- 
Lalaji Sureshika
Software Engineer; Development Technologies Team;WSO2, Inc.;
http://wso2.com/
email: [email protected]; cell: +94 71 608 6811
blog: http://lalajisureshika.blogspot.com

Attachment: ThriftContext.diff
Description: Binary data

_______________________________________________
Dev mailing list
[email protected]
http://wso2.org/cgi-bin/mailman/listinfo/dev

Reply via email to