Hi All,

Finally I've been able to find the root cause for the $subject and the
solution.

*Scenario*:

* A tenant change its main sequence to something like following.

<sequence xmlns="http://ws.apache.org/ns/synapse"; name="main"
trace="enable">
   <in>
      <send>
         <endpoint>
            <address uri="
http://appserver.stratoslive.wso2.com/services/t/a.com/SimpleStockQuoteService";
format="soap11" />
         </endpoint>
      </send>
   </in>
   <out>
      <send />
   </out>
</sequence>

* A client trying to access this tenant's services through a REST call.

*Explanation to the problem:*

* In the product this works like following:

* Since ESB doesn't have any real service in it, what Synapse (RESTUtil)
does is set its default service property as the axis-service in
MessageContext in order to inject the request into the main sequence.
Following code handles that:

if (axisService == null) {
            String defaultSvcName =
NHttpConfiguration.getInstance().getStringValue(
                    "nhttp.default.service", "__SynapseService");
            axisService = msgContext.getConfigurationContext()
                    .getAxisConfiguration().getService(defaultSvcName);
        }
 msgContext.setAxisService(axisService);

* But in the service's case, finding the service should be done carefully,
since we need to access relevant tenant's main sequence, not super admin's.


*Proposing Solution*:

* Currently in
org.wso2.carbon.core.multitenancy.MultitenantMessageReceiver's doNhttpREST
method, we are processing a REST message coming in from the NHTTP transport.
* For this method we're passing the "service name".
         if service URL is
http://esb.cloud-test.wso2.com:8280/services/t/test.com/myproxy : service
name is "myproxy"
         if service URL is
http://esb.cloud-test.wso2.com:8280/services/t/test.com : service name is ""
* Hence, I think we could safely assume that if service name is "", the
request should go to the default service i.e. "__SynapseService" of that
particular tenant.
* Thus, we can set the axis-service of the message context of that tenant
to this default service within MultitenantMessageReceiver's doNhttpREST
method.
* The code portion I've added is following:

        // handling requests with an empty service part
        if("".equals(servicePart)){
            // we assume that the request should go to the default service

tenantInMsgCtx.setAxisService(tenantConfigCtx.getAxisConfiguration().getService("__SynapseService"));
        }

------------------------------------------------------------------------------------------------------------------------------------------------------------------------
If you have any concerns with the above approach please fire them up ASAP.


-- 

Thanks & regards,
Nirmal

Software Engineer- Platform Technologies Team, WSO2 Inc.
Mobile: +94715779733
Blog: http://nirmalfdo.blogspot.com/
_______________________________________________
Dev mailing list
[email protected]
http://wso2.org/cgi-bin/mailman/listinfo/dev

Reply via email to