Thanks Maduranga for the reply, I did create a custom user store which retrieves user details by calling a rest endpoint, the challenge I'm facing right now is how to configure WSO2 to retrieve those attributes, I deployed travelocity sample application and tried to generate the SAML token, while checking the SAML response I didn't find any of the claims I declared. Is there a config part apart from declaring custom claims ?
Regards, *Hanen Ben Rhouma* *Java Tech Lead* On Tue, Nov 22, 2016 at 5:32 AM, Maduranga Siriwardena <madura...@wso2.com> wrote: > Hi Hanen, > > As I understood, you need to connect to your own database schema or a REST > endpoint to retrieve the user information. For this you can write a custom > userstore manager as explained above. > > If you see the mothod getUserPropertyValues in JDBCUserStoreManager [1], > what it does is connect to the database and retrieve the user attributes > according to a predefined schema. So you can extend > AbstractUserStoreManager and implement getUserPropertyValues method to > talk to a your REST endpoint to fetch user attributes following the > JDBCUserStoreManager as an example. In the same way you have to implement > all the abstract methods in AbstractUserStoreManager to be able to > connect to a REST endpoint and work as a user store. > > [1] https://github.com/wso2/carbon-kernel/blob/v4.4.9/ > core/org.wso2.carbon.user.core/src/main/java/org/wso2/ > carbon/user/core/jdbc/JDBCUserStoreManager.java#L926 > > Thanks, > > On Mon, Nov 21, 2016 at 2:15 PM, Hanen Ben Rhouma <hanen...@gmail.com> > wrote: > >> Any ideas guys? >> >> >> Regards, >> Hanen >> >> On Fri, Nov 18, 2016 at 4:38 PM, Hanen Ben Rhouma <hanen...@gmail.com> >> wrote: >> >>> Hello, >>> >>> The tutorial doesn't answer the question "how can I interface with a >>> REST API", there are many examples around custom JDBC stores but for REST >>> calls I couldn't find anything. >>> There are other examples about transforming WSO2 OSGi bundles into REST >>> APIs but this not what I'm looking for. >>> The idea is to inherit from AbstractUserStoreManager and override its >>> methods in order to communicate with a third party REST API to retrieve >>> user details and roles without having to mention a JDBC or LDAP store >>> properties in user-mgt.xml. >>> >>> Is this feasible guys? >>> >>> >>> >>> Regards, >>> Hanen >>> >>> On Thu, Nov 3, 2016 at 9:53 AM, Hanen Ben Rhouma <hanen...@gmail.com> >>> wrote: >>> >>>> Thanks Gayan, >>>> >>>> I followed the blog entry but now I'm receiving another kind of error >>>> related to domain name: >>>> >>>> [2016-11-03 09:50:15,556] ERROR {org.wso2.carbon.identity.user >>>> .store.configuration.UserStoreConfigAdminService} - Error occurred >>>> during the transformation process of C:\Users\rhoumah\DOCUME~1\LMR\ >>>> WSO2\WSO2IS~1.0\bin\..\repository\deployment\server\userstor >>>> es\custom.xml >>>> org.wso2.carbon.identity.user.store.configuration.utils.IdentityUserStoreMgtException: >>>> Error occurred during the transformation process of >>>> C:\Users\rhoumah\DOCUME~1\LMR\WSO2\WSO2IS~1.0\bin\..\reposit >>>> ory\deployment\server\userstores\custom.xml >>>> at org.wso2.carbon.identity.user.store.configuration.UserStoreC >>>> onfigAdminService.writeUserMgtXMLFile(UserStoreConfigAdminSe >>>> rvice.java:831) >>>> at org.wso2.carbon.identity.user.store.configuration.UserStoreC >>>> onfigAdminService.addUserStore(UserStoreConfigAdminService.java:270) >>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >>>> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcce >>>> ssorImpl.java:62) >>>> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMe >>>> thodAccessorImpl.java:43) >>>> at java.lang.reflect.Method.invoke(Method.java:498) >>>> at org.apache.axis2.rpc.receivers.RPCUtil.invokeServiceClass(RP >>>> CUtil.java:212) >>>> at org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver.invo >>>> keBusinessLogic(RPCInOnlyMessageReceiver.java:66) >>>> at org.apache.axis2.receivers.AbstractMessageReceiver.receive(A >>>> bstractMessageReceiver.java:110) >>>> at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:1 >>>> 80) >>>> at org.apache.axis2.transport.local.LocalTransportReceiver.proc >>>> essMessage(LocalTransportReceiver.java:169) >>>> at org.apache.axis2.transport.local.LocalTransportReceiver.proc >>>> essMessage(LocalTransportReceiver.java:82) >>>> at org.wso2.carbon.core.transports.local.CarbonLocalTransportSe >>>> nder.finalizeSendWithToAddress(CarbonLocalTransportSender.java:45) >>>> at org.apache.axis2.transport.local.LocalTransportSender.invoke >>>> (LocalTransportSender.java:77) >>>> at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:442) >>>> at org.apache.axis2.description.OutInAxisOperationClient.send(O >>>> utInAxisOperation.java:430) >>>> at org.apache.axis2.description.OutInAxisOperationClient.execut >>>> eImpl(OutInAxisOperation.java:225) >>>> at org.apache.axis2.client.OperationClient.execute(OperationCli >>>> ent.java:149) >>>> at org.wso2.carbon.identity.user.store.configuration.stub.UserS >>>> toreConfigAdminServiceStub.addUserStore(UserStoreConfigAdmin >>>> ServiceStub.java:889) >>>> at org.wso2.carbon.identity.user.store.configuration.ui.client. >>>> UserStoreConfigAdminServiceClient.addUserStore(UserStoreConf >>>> igAdminServiceClient.java:95) >>>> at org.apache.jsp.userstore_005fconfig.userstore_002dconfig_002 >>>> dfinish_002dajaxprocessor_jsp._jspService(userstore_002dconf >>>> ig_002dfinish_002dajaxprocessor_jsp.java:198) >>>> at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.ja >>>> va:70) >>>> at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) >>>> at org.apache.jasper.servlet.JspServletWrapper.service(JspServl >>>> etWrapper.java:439) >>>> at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServl >>>> et.java:395) >>>> at org.apache.jasper.servlet.JspServlet.service(JspServlet.java >>>> :339) >>>> at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) >>>> at org.wso2.carbon.ui.JspServlet.service(JspServlet.java:155) >>>> at org.wso2.carbon.ui.TilesJspServlet.service(TilesJspServlet.j >>>> ava:80) >>>> at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) >>>> at org.eclipse.equinox.http.helper.ContextPathServletAdaptor.se >>>> rvice(ContextPathServletAdaptor.java:37) >>>> at org.eclipse.equinox.http.servlet.internal.ServletRegistratio >>>> n.service(ServletRegistration.java:61) >>>> at org.eclipse.equinox.http.servlet.internal.ProxyServlet.proce >>>> ssAlias(ProxyServlet.java:128) >>>> at org.eclipse.equinox.http.servlet.internal.ProxyServlet.servi >>>> ce(ProxyServlet.java:68) >>>> at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) >>>> at org.wso2.carbon.tomcat.ext.servlet.DelegationServlet.service >>>> (DelegationServlet.java:68) >>>> at org.apache.catalina.core.ApplicationFilterChain.internalDoFi >>>> lter(ApplicationFilterChain.java:303) >>>> at org.apache.catalina.core.ApplicationFilterChain.doFilter(App >>>> licationFilterChain.java:208) >>>> at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilte >>>> r.java:52) >>>> at org.apache.catalina.core.ApplicationFilterChain.internalDoFi >>>> lter(ApplicationFilterChain.java:241) >>>> at org.apache.catalina.core.ApplicationFilterChain.doFilter(App >>>> licationFilterChain.java:208) >>>> at org.apache.catalina.filters.HttpHeaderSecurityFilter.doFilte >>>> r(HttpHeaderSecurityFilter.java:120) >>>> at org.apache.catalina.core.ApplicationFilterChain.internalDoFi >>>> lter(ApplicationFilterChain.java:241) >>>> at org.apache.catalina.core.ApplicationFilterChain.doFilter(App >>>> licationFilterChain.java:208) >>>> at org.wso2.carbon.tomcat.ext.filter.CharacterSetFilter.doFilte >>>> r(CharacterSetFilter.java:61) >>>> at org.apache.catalina.core.ApplicationFilterChain.internalDoFi >>>> lter(ApplicationFilterChain.java:241) >>>> at org.apache.catalina.core.ApplicationFilterChain.doFilter(App >>>> licationFilterChain.java:208) >>>> at org.apache.catalina.filters.HttpHeaderSecurityFilter.doFilte >>>> r(HttpHeaderSecurityFilter.java:120) >>>> at org.apache.catalina.core.ApplicationFilterChain.internalDoFi >>>> lter(ApplicationFilterChain.java:241) >>>> at org.apache.catalina.core.ApplicationFilterChain.doFilter(App >>>> licationFilterChain.java:208) >>>> at org.apache.catalina.core.StandardWrapperValve.invoke(Standar >>>> dWrapperValve.java:218) >>>> at org.apache.catalina.core.StandardContextValve.invoke(Standar >>>> dContextValve.java:122) >>>> at org.apache.catalina.authenticator.AuthenticatorBase.invoke(A >>>> uthenticatorBase.java:505) >>>> at org.apache.catalina.core.StandardHostValve.invoke(StandardHo >>>> stValve.java:169) >>>> at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorRepo >>>> rtValve.java:103) >>>> at org.wso2.carbon.tomcat.ext.valves.CompositeValve.continueInv >>>> ocation(CompositeValve.java:99) >>>> at org.wso2.carbon.tomcat.ext.valves.CarbonTomcatValve$1.invoke >>>> (CarbonTomcatValve.java:47) >>>> at org.wso2.carbon.webapp.mgt.TenantLazyLoaderValve.invoke(Tena >>>> ntLazyLoaderValve.java:57) >>>> at org.wso2.carbon.tomcat.ext.valves.TomcatValveContainer.invok >>>> eValves(TomcatValveContainer.java:47) >>>> at org.wso2.carbon.tomcat.ext.valves.CompositeValve.invoke(Comp >>>> ositeValve.java:62) >>>> at org.wso2.carbon.tomcat.ext.valves.CarbonStuckThreadDetection >>>> Valve.invoke(CarbonStuckThreadDetectionValve.java:159) >>>> at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogVa >>>> lve.java:956) >>>> at org.wso2.carbon.tomcat.ext.valves.CarbonContextCreatorValve. >>>> invoke(CarbonContextCreatorValve.java:57) >>>> at org.apache.catalina.core.StandardEngineValve.invoke(Standard >>>> EngineValve.java:116) >>>> at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAd >>>> apter.java:442) >>>> at org.apache.coyote.http11.AbstractHttp11Processor.process(Abs >>>> tractHttp11Processor.java:1082) >>>> at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler >>>> .process(AbstractProtocol.java:623) >>>> at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun >>>> (NioEndpoint.java:1756) >>>> at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(N >>>> ioEndpoint.java:1715) >>>> at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPool >>>> Executor.java:1142) >>>> at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoo >>>> lExecutor.java:617) >>>> at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.r >>>> un(TaskThread.java:61) >>>> at java.lang.Thread.run(Thread.java:745) >>>> Caused by: javax.xml.transform.TransformerException: >>>> java.io.FileNotFoundException: C:\Users\rhoumah\DOCUME%7E1\LM >>>> R\WSO2\WSO2IS%7E1.0\bin\..\repository\deployment\server\userstores\custom.xml >>>> (The system cannot find the path specified) >>>> at org.apache.xalan.transformer.TransformerIdentityImpl.createR >>>> esultContentHandler(TransformerIdentityImpl.java:297) >>>> at org.apache.xalan.transformer.TransformerIdentityImpl.transfo >>>> rm(TransformerIdentityImpl.java:330) >>>> at org.wso2.carbon.identity.user.store.configuration.UserStoreC >>>> onfigAdminService.writeUserMgtXMLFile(UserStoreConfigAdminSe >>>> rvice.java:825) >>>> >>>> >>>> How can I configure the domain in order for WSO2 IS to generate the >>>> required XML file? >>>> >>>> >>>> Regards, >>>> >>>> >>>> *Hanen Ben Rhouma* >>>> *Java Tech Lead* >>>> >>>> On Wed, Nov 2, 2016 at 7:14 PM, Gayan Gunawardana <ga...@wso2.com> >>>> wrote: >>>> >>>>> >>>>> >>>>> On Wed, Nov 2, 2016 at 8:53 PM, Hanen Ben Rhouma <hanen...@gmail.com> >>>>> wrote: >>>>> >>>>>> Thanks for the reply Gayan, >>>>>> >>>>>> Actually I'm facing an issue while trying to deploy the custom user >>>>>> store jar file under WSO2 IS, though I put it in >>>>>> <PRODUCT_HOME>/repository/components/dropins and changed >>>>>> <PRODUCT_HOME>/repository/conf/user-mgt.xml according to the >>>>>> documentation I'm receiving a ClassNotFound error: >>>>>> >>>>>> [2016-11-02 16:16:03,660] ERROR >>>>>> {org.wso2.carbon.user.core.common.DefaultRealm} >>>>>> - com.wso2.custom.usermgt.CustomUserStoreManager cannot be found by >>>>>> org.wso2.carbon.user.core_4.4.9Type class >>>>>> java.lang.ClassNotFoundException >>>>>> org.wso2.carbon.user.core.UserStoreException: >>>>>> com.wso2.custom.usermgt.CustomUserStoreManager cannot be found by >>>>>> org.wso2.carbon.user.core_4.4.9Type class >>>>>> java.lang.ClassNotFoundException >>>>>> at org.wso2.carbon.user.core.comm >>>>>> on.DefaultRealm.createObjectWithOptions(DefaultRealm.java:401) >>>>>> at org.wso2.carbon.user.core.comm >>>>>> on.DefaultRealm.initializeObjects(DefaultRealm.java:222) >>>>>> at org.wso2.carbon.user.core.comm >>>>>> on.DefaultRealm.init(DefaultRealm.java:127) >>>>>> at org.wso2.carbon.user.core.comm >>>>>> on.DefaultRealmService.initializeRealm(DefaultRealmService.java:263) >>>>>> at org.wso2.carbon.user.core.comm >>>>>> on.DefaultRealmService.<init>(DefaultRealmService.java:100) >>>>>> at org.wso2.carbon.user.core.comm >>>>>> on.DefaultRealmService.<init>(DefaultRealmService.java:113) >>>>>> at org.wso2.carbon.user.core.inte >>>>>> rnal.Activator.startDeploy(Activator.java:68) >>>>>> at org.wso2.carbon.user.core.inte >>>>>> rnal.BundleCheckActivator.start(BundleCheckActivator.java:61) >>>>>> at org.eclipse.osgi.framework.int >>>>>> ernal.core.BundleContextImpl$1.run(BundleContextImpl.java:711) >>>>>> at java.security.AccessController.doPrivileged(Native Method) >>>>>> at org.eclipse.osgi.framework.int >>>>>> ernal.core.BundleContextImpl.startActivator(BundleContextImp >>>>>> l.java:702) >>>>>> at org.eclipse.osgi.framework.int >>>>>> ernal.core.BundleContextImpl.start(BundleContextImpl.java:683) >>>>>> at org.eclipse.osgi.framework.int >>>>>> ernal.core.BundleHost.startWorker(BundleHost.java:381) >>>>>> at org.eclipse.osgi.framework.int >>>>>> ernal.core.AbstractBundle.resume(AbstractBundle.java:390) >>>>>> at org.eclipse.osgi.framework.int >>>>>> ernal.core.Framework.resumeBundle(Framework.java:1176) >>>>>> at org.eclipse.osgi.framework.int >>>>>> ernal.core.StartLevelManager.resumeBundles(StartLevelManager >>>>>> .java:559) >>>>>> at org.eclipse.osgi.framework.int >>>>>> ernal.core.StartLevelManager.resumeBundles(StartLevelManager >>>>>> .java:544) >>>>>> at org.eclipse.osgi.framework.int >>>>>> ernal.core.StartLevelManager.incFWSL(StartLevelManager.java:457) >>>>>> at org.eclipse.osgi.framework.int >>>>>> ernal.core.StartLevelManager.doSetStartLevel(StartLevelManag >>>>>> er.java:243) >>>>>> at org.eclipse.osgi.framework.int >>>>>> ernal.core.StartLevelManager.dispatchEvent(StartLevelManager >>>>>> .java:438) >>>>>> at org.eclipse.osgi.framework.int >>>>>> ernal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:1) >>>>>> at org.eclipse.osgi.framework.eve >>>>>> ntmgr.EventManager.dispatchEvent(EventManager.java:230) >>>>>> at org.eclipse.osgi.framework.eve >>>>>> ntmgr.EventManager$EventThread.run(EventManager.java:340) >>>>>> Caused by: java.lang.ClassNotFoundException: >>>>>> com.wso2.custom.usermgt.CustomUserStoreManager cannot be found by >>>>>> org.wso2.carbon.user.core_4.4.9 >>>>>> at org.eclipse.osgi.internal.load >>>>>> er.BundleLoader.findClassInternal(BundleLoader.java:501) >>>>>> at org.eclipse.osgi.internal.load >>>>>> er.BundleLoader.findClass(BundleLoader.java:421) >>>>>> at org.eclipse.osgi.internal.load >>>>>> er.BundleLoader.findClass(BundleLoader.java:412) >>>>>> at org.eclipse.osgi.internal.base >>>>>> adaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107) >>>>>> at java.lang.ClassLoader.loadClass(ClassLoader.java:357) >>>>>> at java.lang.Class.forName0(Native Method) >>>>>> at java.lang.Class.forName(Class.java:264) >>>>>> at org.wso2.carbon.user.core.comm >>>>>> on.DefaultRealm.createObjectWithOptions(DefaultRealm.java:345) >>>>>> >>>>>> >>>>>> Is there a missing config step in order to load the new jar? >>>>>> >>>>> According to exception I guess >>>>> com.wso2.custom.usermgt.CustomUserStoreManager >>>>> was not added to OSGI environment. You have to register >>>>> CustomUserStoreManager as an OSGI service. >>>>> >>>>> CustomUserStoreManager customUserStoreManager = new >>>>> CustomUserStoreManager(); >>>>> >>>>> ctxt.getBundleContext().registerService(UserStoreManager.class.getName(), >>>>> customUserStoreManager, props); >>>>> >>>>> Please try sample code provided in [1]. >>>>> >>>>> [1]http://isurad.blogspot.com/2016/03/how-to-write-custom-us >>>>> er-store-manager.html >>>>> >>>>> >>>>> >>>>>> >>>>>> >>>>>> >>>>>> Regards, >>>>>> >>>>>> >>>>>> *Hanen Ben Rhouma* >>>>>> *Java Tech Lead* >>>>>> >>>>>> On Tue, Nov 1, 2016 at 2:10 AM, Gayan Gunawardana <ga...@wso2.com> >>>>>> wrote: >>>>>> >>>>>>> Hi Hanen, >>>>>>> >>>>>>> On Mon, Oct 31, 2016 at 9:57 PM, Hanen Ben Rhouma < >>>>>>> hanen...@gmail.com> wrote: >>>>>>> >>>>>>>> Thanks guys for your help but I guess I didn't explain it well; >>>>>>>> Actually, I'm looking for a step by step configuration that allows me >>>>>>>> to >>>>>>>> create an identity provider which jumps to our DB or any other inhouse >>>>>>>> endpoint (it can be a REST endpoint) in order to retrieve user details >>>>>>>> and >>>>>>>> aggregate them within the SAML token. Is there a way to do it through >>>>>>>> WSO2 >>>>>>>> IS? >>>>>>>> >>>>>>> You can write custom user store manager according to [1] and >>>>>>> override doAuthenticate, doGetUserClaimValue methods to jump into >>>>>>> your DB or REST endpoint. >>>>>>> Once you have custom user store, you can configure a service >>>>>>> provider in WSO2 IS with SAML inbound protocol. >>>>>>> >>>>>>> [1] https://docs.wso2.com/display/IS520/Writing+a+Custom+User+St >>>>>>> ore+Manager >>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> Thanks, >>>>>>>> Hanen >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> On Fri, Oct 28, 2016 at 8:07 PM, Gayan Gunawardana <ga...@wso2.com> >>>>>>>> wrote: >>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> On Fri, Oct 28, 2016 at 2:54 PM, Lakshani Gamage < >>>>>>>>> laksh...@wso2.com> wrote: >>>>>>>>> >>>>>>>>>> Hi Hanen, >>>>>>>>>> >>>>>>>>>> This article [1] contains how to communicate Identity server with >>>>>>>>>> REST APIs. It will be a help to your POC. >>>>>>>>>> >>>>>>>>>> [1] http://wso2.com/library/articles/2016/10/article-exposing-ws >>>>>>>>>> o2-identity-server-admin-services-the-rest-way/ >>>>>>>>>> >>>>>>>>>> Regards, >>>>>>>>>> Lakshani >>>>>>>>>> >>>>>>>>>> On Fri, Oct 28, 2016 at 1:22 PM, Ben Rhouma, Hanen (FircoSoft) < >>>>>>>>>> hanen.ben.rho...@fircosoft.com> wrote: >>>>>>>>>> >>>>>>>>>>> Hello, >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> We’re working on a POC related to Authentication and Identity >>>>>>>>>>> Management using WSO2. We’re looking for a way to configure the >>>>>>>>>>> Identity >>>>>>>>>>> Provider to communicate with a REST API or even a database in order >>>>>>>>>>> to >>>>>>>>>>> retrieve more details about the user trying to authenticate so that >>>>>>>>>>> those >>>>>>>>>>> details can be used to generate the token. >>>>>>>>>>> >>>>>>>>>> What sort of token you expect to generate ? >>>>>>>>> If you are looking for REST way to get authenticated user >>>>>>>>> information OIDC might help[1]. If you can explain exact use case we >>>>>>>>> can >>>>>>>>> help you more. >>>>>>>>> >>>>>>>>> [1]https://docs.wso2.com/display/IS520/OpenID+Connect >>>>>>>>> >>>>>>>>>> Is there a tutorial or a documentation part which can point us >>>>>>>>>>> directly to such use case implementation? >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> Regards, >>>>>>>>>>> >>>>>>>>>>> Hanen >>>>>>>>>>> >>>>>>>>>>> _______________________________________________ >>>>>>>>>>> Dev mailing list >>>>>>>>>>> Dev@wso2.org >>>>>>>>>>> http://wso2.org/cgi-bin/mailman/listinfo/dev >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> Lakshani Gamage >>>>>>>>>> >>>>>>>>>> *Software Engineer, WSO2* >>>>>>>>>> >>>>>>>>>> *Mobile : +94 71 5478184 <%2B94%20%280%29%20773%20451194>* >>>>>>>>>> *Blog : http://lakshanigamage.blogspot.com/ >>>>>>>>>> <http://lakshanigamage.blogspot.com/>* >>>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> Gayan Gunawardana >>>>>>>>> Software Engineer; WSO2 Inc.; http://wso2.com/ >>>>>>>>> Email: ga...@wso2.com >>>>>>>>> Mobile: +94 (71) 8020933 >>>>>>>>> >>>>>>>>> _______________________________________________ >>>>>>>>> Dev mailing list >>>>>>>>> Dev@wso2.org >>>>>>>>> http://wso2.org/cgi-bin/mailman/listinfo/dev >>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> Gayan Gunawardana >>>>>>> Software Engineer; WSO2 Inc.; http://wso2.com/ >>>>>>> Email: ga...@wso2.com >>>>>>> Mobile: +94 (71) 8020933 >>>>>>> >>>>>> >>>>>> >>>>> >>>>> >>>>> -- >>>>> Gayan Gunawardana >>>>> Software Engineer; WSO2 Inc.; http://wso2.com/ >>>>> Email: ga...@wso2.com >>>>> Mobile: +94 (71) 8020933 >>>>> >>>> >>>> >>> >> >> _______________________________________________ >> Dev mailing list >> Dev@wso2.org >> http://wso2.org/cgi-bin/mailman/listinfo/dev >> >> > > > -- > Maduranga Siriwardena > Software Engineer > WSO2 Inc; http://wso2.com/ > > Email: madura...@wso2.com > Mobile: +94718990591 > Blog: http://madurangasblogs.blogspot.com/ > <http://wso2.com/signature> >
_______________________________________________ Dev mailing list Dev@wso2.org http://wso2.org/cgi-bin/mailman/listinfo/dev