Yep, it is out there :-) Got it and after i've configured the customization class then it is being activated - nice! Also, i see that the multiple DocTarget.RESPONSE logic we've talked about was implemented (and i see it generates multiple response in the wadl) - or at least i see it is working... (or maybe it was implemented somewhere between 3.1.4 version i was using to 3.1.14 i'm using now)
Thanks a lot for all of your help!!! Thanks, Eyal -----Original Message----- From: Sergey Beryozkin [mailto:sberyoz...@gmail.com] Sent: 07 November, 2017 14:15 To: Eyal Weingart <eyal.weing...@exlibrisgroup.com>; users <users@cxf.apache.org> Subject: Re: cxf-java2wadl-plugin java2wadl questions Sorry I forgot, I think 3.1.14 is already available in Central Give it another try please Cheers, Sergey On 07/11/17 12:07, Eyal Weingart wrote: > Hi > Tried with the 3.1.13 libs and now i fail on: > [exec] Caused by: java.lang.ClassNotFoundException: > org.apache.cxf.jaxrs.model.wadl.WadlGenerator > And i see it under cxf-rt-rs-service-description-3.1.13.jar > > Not sure i will be able to "test" this locally so my next question is - do > you plan to add it to future release, and if so when can i expect it (give or > take :-) )? > > > Thanks, > Eyal > > > -----Original Message----- > From: Sergey Beryozkin [mailto:sberyoz...@gmail.com] > Sent: 07 November, 2017 12:02 > To: Eyal Weingart <eyal.weing...@exlibrisgroup.com>; users > <users@cxf.apache.org> > Subject: Re: cxf-java2wadl-plugin java2wadl questions > > Hi > > Well, something is going wrong there given this class in the cxf-core. > You only need to get the snapshot of the cxf-java2wadl-plugin, it will > work OK with other existing 3.1.13 libs > > Sergey > On 07/11/17 07:52, Eyal Weingart wrote: >> Hi Sergey >> >> We've taken 3.1.14-20171106.085950 jars but still failing (see below). >> So for the use of "cxf-java2wadl-plugin" I've taken also >> "cxf-rt-rs-service-description" and "cxf-core" with same snapshot releases >> (just to make sure) but did not help. >> Ami i missing something? >> >> [exec] WARNING: Error injecting: >> org.apache.cxf.maven_plugin.javatowadl.Java2WADLMojo >> [exec] java.lang.NoClassDefFoundError: org/apache/cxf/Bus >> [exec] at java.lang.Class.getDeclaredMethods0(Native Method) >> [exec] at >> java.lang.Class.privateGetDeclaredMethods(Class.java:2701) >> [exec] at java.lang.Class.getDeclaredMethods(Class.java:1975) >> [exec] at >> com.google.inject.spi.InjectionPoint.getInjectionPoints(InjectionPoint.java:664) >> [exec] at >> com.google.inject.spi.InjectionPoint.forInstanceMethodsAndFields(InjectionPoint.java:358) >> [exec] at >> com.google.inject.internal.ConstructorBindingImpl.getInternalDependencies(ConstructorBindingImpl.java:155) >> [exec] at >> com.google.inject.internal.InjectorImpl.getInternalDependencies(InjectorImpl.java:585) >> [exec] at >> com.google.inject.internal.InjectorImpl.cleanup(InjectorImpl.java:542) >> [exec] at >> com.google.inject.internal.InjectorImpl.initializeJitBinding(InjectorImpl.java:528) >> [exec] at >> com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:833) >> [exec] at >> com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:758) >> [exec] at >> com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:255) >> [exec] at >> com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:204) >> [exec] at >> com.google.inject.internal.InjectorImpl.getProviderOrThrow(InjectorImpl.java:954) >> [exec] at >> com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:987) >> [exec] at >> com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:950) >> [exec] at >> com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1000) >> [exec] at >> org.sonatype.guice.bean.reflect.AbstractDeferredClass.get(AbstractDeferredClass.java:45) >> [exec] at >> com.google.inject.internal.ProviderInternalFactory.provision(ProviderInternalFactory.java:84) >> [exec] at >> com.google.inject.internal.InternalFactoryToInitializableAdapter.provision(InternalFactoryToInitializableAdapter.java:52) >> [exec] at >> com.google.inject.internal.ProviderInternalFactory$1.call(ProviderInternalFactory.java:70) >> [exec] at >> com.google.inject.internal.ProvisionListenerStackCallback$Provision.provision(ProvisionListenerStackCallback.java:100) >> [exec] at >> org.sonatype.guice.plexus.lifecycles.PlexusLifecycleManager.onProvision(PlexusLifecycleManager.java:138) >> [exec] at >> com.google.inject.internal.ProvisionListenerStackCallback$Provision.provision(ProvisionListenerStackCallback.java:108) >> [exec] at >> com.google.inject.internal.ProvisionListenerStackCallback.provision(ProvisionListenerStackCallback.java:55) >> [exec] at >> com.google.inject.internal.ProviderInternalFactory.circularGet(ProviderInternalFactory.java:68) >> [exec] at >> com.google.inject.internal.InternalFactoryToInitializableAdapter.get(InternalFactoryToInitializableAdapter.java:45) >> [exec] at >> com.google.inject.internal.InjectorImpl$3$1.call(InjectorImpl.java:965) >> [exec] at >> com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1011) >> [exec] at >> com.google.inject.internal.InjectorImpl$3.get(InjectorImpl.java:961) >> [exec] at com.google.inject.Scopes$1$1.get(Scopes.java:59) >> [exec] at >> org.sonatype.guice.bean.locators.LazyBeanEntry.getValue(LazyBeanEntry.java:83) >> [exec] at >> org.sonatype.guice.plexus.locators.LazyPlexusBean.getValue(LazyPlexusBean.java:49) >> [exec] at >> org.codehaus.plexus.DefaultPlexusContainer.lookup(DefaultPlexusContainer.java:253) >> [exec] at >> org.codehaus.plexus.DefaultPlexusContainer.lookup(DefaultPlexusContainer.java:245) >> [exec] at >> org.apache.maven.plugin.internal.DefaultMavenPluginManager.getConfiguredMojo(DefaultMavenPluginManager.java:455) >> [exec] at >> org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:92) >> [exec] at >> org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209) >> [exec] at >> org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) >> [exec] at >> org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) >> [exec] at >> org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84) >> [exec] at >> org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59) >> [exec] at >> org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183) >> [exec] at >> org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161) >> [exec] at >> org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320) >> [exec] at >> org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156) >> [exec] at >> org.apache.maven.cli.MavenCli.execute(MavenCli.java:537) >> [exec] at >> org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196) >> [exec] at org.apache.maven.cli.MavenCli.main(MavenCli.java:141) >> [exec] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native >> Method) >> [exec] at >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) >> [exec] at >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) >> [exec] at java.lang.reflect.Method.invoke(Method.java:498) >> [exec] at >> org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290) >> [exec] at >> org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230) >> [exec] at >> org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409) >> [exec] at >> org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352) >> [exec] Caused by: java.lang.ClassNotFoundException: >> org.apache.cxf.Bus >> [exec] at >> org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50) >> [exec] at >> org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:244) >> [exec] at >> org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:230) >> >> Thanks, >> Eyal >> >> -----Original Message----- >> From: Sergey Beryozkin [mailto:sberyoz...@gmail.com] >> Sent: 01 November, 2017 16:58 >> To: Eyal Weingart <eyal.weing...@exlibrisgroup.com>; users >> <users@cxf.apache.org> >> Subject: Re: cxf-java2wadl-plugin java2wadl questions >> >> Hi >> >> You can get it from >> >> https://repository.apache.org/content/groups/snapshots/org/apache/cxf >> / cxf-java2wadl-plugin/3.1.14-SNAPSHOT/ >> >> Sergey >> On 01/11/17 14:27, Eyal Weingart wrote: >>> Hi Sergey, >>> >>> I'm struggling here with downloading it thru the maven build (i was >>> told that in my local environment i'm connecting only to a local maven >>> repository) Is it possible to send me the jar for this snapshot version so >>> we can upload it to our local maven repository and then work with it? >>> >>> >>> Thanks, >>> Eyal >>> >>> >>> -----Original Message----- >>> From: Sergey Beryozkin [mailto:sberyoz...@gmail.com] >>> Sent: 23 October, 2017 12:19 >>> To: Eyal Weingart <eyal.weing...@exlibrisgroup.com>; users >>> <users@cxf.apache.org> >>> Subject: Re: cxf-java2wadl-plugin java2wadl questions >>> >>> Hi, I think you'll need to enable the snapshot repositories >>> >>> Sergey >>> On 22/10/17 09:14, Eyal Weingart wrote: >>>> Hi Sergey >>>> >>>> Should i download something manually for the 3.1.14-SNAPSHOT version (and >>>> if so how and from where)? >>>> Because i'm trying to do it thru the maven build (defining the version of >>>> the artifact as 3.1.14-SNAPSHOT) and it does not download this version. >>>> >>>> And it comes with the below error (of course) : >>>> Plugin org.apache.cxf:cxf-java2wadl-plugin:3.1.14-SNAPSHOT or one of >>>> its dependencies could not be resolved: Failed to read artifact descriptor >>>> for org.apache.cxf:cxf-java2wadl- plugin:jar:3.1.14-SNAPSHOT: Could >>>> not find artifact org.apache.cxf:cxf-java2wadl-plugin:pom:3.1.14-SNAPSHOT >>>> in >>>> >>>> >>>> Thanks, >>>> Eyal >>>> >>>> >>>> -----Original Message----- >>>> From: Sergey Beryozkin [mailto:sberyoz...@gmail.com] >>>> Sent: 19 October, 2017 17:01 >>>> To: Eyal Weingart <eyal.weing...@exlibrisgroup.com>; users >>>> <users@cxf.apache.org> >>>> Subject: Re: cxf-java2wadl-plugin java2wadl questions >>>> >>>> Np, by the way, the custom provider will need to have a constructor >>>> accepting 'Bus' which it can provide to the super... >>>> >>>> Sergey >>>> On 19/10/17 14:06, Eyal Weingart wrote: >>>>> Thanks a lot! >>>>> I will check this on Sunday (leaving for the weekend) and will let >>>>> you know Working currently with version 3.1.4 and not 3.1.14 so will need >>>>> to fix some dependencies so my build will not fail... >>>>> >>>>> Thanks, >>>>> Eyal >>>>> >>>>> >>>>> -----Original Message----- >>>>> From: Sergey Beryozkin [mailto:sberyoz...@gmail.com] >>>>> Sent: 19 October, 2017 15:20 >>>>> To: Eyal Weingart <eyal.weing...@exlibrisgroup.com>; users >>>>> <users@cxf.apache.org> >>>>> Subject: Re: cxf-java2wadl-plugin java2wadl questions >>>>> >>>>> Hi Eyal >>>>> On 19/10/17 09:47, Eyal Weingart wrote: >>>>>> Hi Sergey >>>>>> >>>>>> 1. Do you see a future option to custom the WADL generator class >>>>>> during the maven build? If so, what is a reasonable timeline for this? >>>>>> (Just to know how to plan ahead) >>>>>> >>>>> I've added a 'customWadlGenerator' parameter, give 3.1.14-SNAPSHOT >>>>> or 3.2.1-SNAPSHOT a try >>>>>> 2. Regarding the "classResourceNames" and multiple WADL files question, >>>>>> i think i was misunderstood, it is not that each rest class holds 1 >>>>>> service, i meant that each rest class holds >>>>>> 1 business with few operations. >>>>>> For example, 1 class holds books operations, another class holds >>>>>> teachers operations and another class will hold course operations - so >>>>>> our expectation is that we should have >>>>>> 3 separate WADLs generated - what do you think? >>>>>> >>>>> That is fine, it is just that it can't be really solved at the >>>>> WADLGenerator level - in your case the separation may be clean, in >>>>> other cases - may be not. And from the practical point of view it >>>>> will push the already very complex WADLGenerator code to the limit >>>>> if we started trying updating it to push the info to many files >>>>> >>>>> Thanks, Sergey >>>>>> >>>>>> Thanks, >>>>>> Eyal >>>>>> >>>>>> >>>>>> -----Original Message----- >>>>>> From: Eyal Weingart >>>>>> Sent: 18 October, 2017 13:47 >>>>>> To: Sergey Beryozkin <sberyoz...@gmail.com>; users >>>>>> <users@cxf.apache.org> >>>>>> Subject: RE: cxf-java2wadl-plugin java2wadl questions >>>>>> >>>>>> Well, actually i was referring to applicative error codes (and >>>>>> their >>>>>> descriptions) - that might be useful by users so can they >>>>>> understand the exact issue >>>>>> >>>>>> >>>>>> Thanks, >>>>>> Eyal >>>>>> >>>>>> >>>>>> -----Original Message----- >>>>>> From: Sergey Beryozkin [mailto:sberyoz...@gmail.com] >>>>>> Sent: 18 October, 2017 12:44 >>>>>> To: Eyal Weingart <eyal.weing...@exlibrisgroup.com>; users >>>>>> <users@cxf.apache.org> >>>>>> Subject: Re: cxf-java2wadl-plugin java2wadl questions >>>>>> >>>>>> That said, while customizing a response serialization in order to show >>>>>> the extra statuses can help users see them, one can document it as well. >>>>>> >>>>>> For example, I do not see how the information that a given response can >>>>>> return 405 can be practically used. Well, one can type for example a 405 >>>>>> catch block on the client knowing 405 can be returned, but I'm not sure >>>>>> what difference it makes, where this 405 info is located in the response >>>>>> statuses or in the docs... >>>>>> >>>>>> Cheers, Sergey >>>>>> On 18/10/17 10:37, Sergey Beryozkin wrote: >>>>>>> I forgot it's really about using a Maven plugin. >>>>>>> Hmm...I guess we may need to support a custom class... >>>>>>> >>>>>>> Sergey >>>>>>> On 18/10/17 07:06, Eyal Weingart wrote: >>>>>>>> Thanks again. >>>>>>>> Regarding: "Create MyWadlGenerator extending WADLGenerator, >>>>>>>> override whatever is needed, and register MyWadlGenerator as a >>>>>>>> jaxrs:provider" >>>>>>>> Where exactly do i need to register the MyWadlGenerator as a >>>>>>>> jaxrs:provider? I saw it can be done in a spring file that >>>>>>>> serves cases for WADL Auto Generation at Runtime. >>>>>>>> But where/how should i do it in the pom.xml for the >>>>>>>> cxf-java2wadl-plugin in order for it to be activated during >>>>>>>> build time >>>>>>>> >>>>>>>> >>>>>>>> Thanks, >>>>>>>> Eyal >>>>>>>> >>>>>>>> >>>>>>>> -----Original Message----- >>>>>>>> From: Sergey Beryozkin [mailto:sberyoz...@gmail.com] >>>>>>>> Sent: 17 October, 2017 17:48 >>>>>>>> To: Eyal Weingart <eyal.weing...@exlibrisgroup.com>; users >>>>>>>> <users@cxf.apache.org> >>>>>>>> Subject: Re: cxf-java2wadl-plugin java2wadl questions >>>>>>>> >>>>>>>> Hi, >>>>>>>> On 17/10/17 15:28, Eyal Weingart wrote: >>>>>>>>> Thanks Sergey for the quick response. >>>>>>>>> >>>>>>>>> 1. Regarding the customization option, one example i can think >>>>>>>>> of (and it relates to issue#2 below) is that we want to use >>>>>>>>> multiple DocTarget.RESPONSE in order to display multiple error >>>>>>>>> codes and since the generic code does not support it then this >>>>>>>>> logic could have been applied in the customization class. >>>>>>>>> >>>>>>>> Well, there are so many possible customization points that one >>>>>>>> can think of, some parts like the docs can be easier customized >>>>>>>> than others, but FYI, nearly all of if not all of methods in >>>>>>>> WADLGenerator are protected. >>>>>>>> Create MyWadlGenerator extending WADLGenerator, override >>>>>>>> whatever is needed, and register MyWadlGenerator as a >>>>>>>> jaxrs:provider >>>>>>>> >>>>>>>>> 3. Sorry, but did not understand the answer regarding >>>>>>>>> generating >>>>>>>>> 1 WADL per 1 Rest API class. >>>>>>>>> Each Rest API class is a different service so don't >>>>>>>>> you think it should have the option to have its own WADL file? >>>>>>>>> >>>>>>>> It depends. They can be part of the composite service, and >>>>>>>> quite often, they can share the same (XML) schema types. It's >>>>>>>> not something WADLGenerator should be concerned about, trying >>>>>>>> to push each service docs into a separate file, and thinking of >>>>>>>> how to avoid the schema duplication. >>>>>>>> >>>>>>>> If, in your case, each class does indeed represent a standalone >>>>>>>> service, then IMHO it would be better to create N >>>>>>>> jaxrs:endpoints, one per each class, as opposed to having 1 >>>>>>>> endpoint with N classes >>>>>>>> >>>>>>>> Sergey >>>>>>>> >>>>>>>>> >>>>>>>>> Thanks, >>>>>>>>> Eyal >>>>>>>>> >>>>>>>>> -----Original Message----- >>>>>>>>> From: Sergey Beryozkin [mailto:sberyoz...@gmail.com] >>>>>>>>> Sent: 17 October, 2017 00:06 >>>>>>>>> To: users <users@cxf.apache.org> >>>>>>>>> Cc: Eyal Weingart <eyal.weing...@exlibrisgroup.com> >>>>>>>>> Subject: Re: cxf-java2wadl-plugin java2wadl questions >>>>>>>>> >>>>>>>>> Hi >>>>>>>>> On 16/10/17 12:35, Eyal Weingart wrote: >>>>>>>>>> Hi, >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> Not sure to whom i need to send my Questions so hopefully one >>>>>>>>>> of you can help me. >>>>>>>>>> >>>>>>>>> Forwarding to the CXF users list >>>>>>>>> >>>>>>>>>> I want to use the maven plugin cxf-java2wadl-plugin in order >>>>>>>>>> to generate WADL from Java rest APIs in build time but i >>>>>>>>>> found few issues with that: >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> 1. Is there a way to custom the generator class so i can >>>>>>>>>> apply some business code during the build? (is it the >>>>>>>>>> org.apache.cxf.jaxrs.model.wadl.WadlGenerator that generates >>>>>>>>>> it?) >>>>>>>>> >>>>>>>>> What do you need to customize in the generated WADL ? >>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> 2. When i use multiple DocTarget.RESPONSE in the rest >>>>>>>>>> API annotations then it generates only the first one it finds >>>>>>>>>> >>>>>>>>> Right, because WADLGenerator only creates a single >>>>>>>>> wadl:response per a given operation >>>>>>>>>> >>>>>>>>>> 3. If i define more than 1 classResourceNames in the >>>>>>>>>> configuration in the pom.xml then it generates all services >>>>>>>>>> under >>>>>>>>>> 1 application.wadl file so if i want 1 WADL file per 1 rest >>>>>>>>>> API class then i need to define multiple <execution> (1 >>>>>>>>>> execution per >>>>>>>>>> 1 Rest >>>>>>>>>> class) - is there a nicer way of doing it? >>>>>>>>>> >>>>>>>>> There's no way to auto-gen 1 wadl per 1 class resource - it >>>>>>>>> would be hard to achieve because most likely these class >>>>>>>>> resources will share the schema >>>>>>>>> >>>>>>>>> Sergey >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> Example of how i configured it in the pom.xml: >>>>>>>>>> >>>>>>>>>> <plugin> >>>>>>>>>> >>>>>>>>>> <groupId>org.apache.cxf</groupId> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> <artifactId>cxf-java2wadl-plugin</artifactId> >>>>>>>>>> >>>>>>>>>> <version>3.1.4</version> >>>>>>>>>> >>>>>>>>>> <executions> >>>>>>>>>> >>>>>>>>>> <execution> >>>>>>>>>> >>>>>>>>>> <id>process-classes1</id> >>>>>>>>>> >>>>>>>>>> <phase>process-classes</phase> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> <goals> >>>>>>>>>> >>>>>>>>>> <goal>java2wadl</goal> >>>>>>>>>> >>>>>>>>>> </goals> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> <configuration> >>>>>>>>>> >>>>>>>>>> <classResourceNames> >>>>>>>>>> >>>>>>>>>> <classResourceName>com.exlibris.primo.webservices.rest.EShelf >>>>>>>>>> R >>>>>>>>>> e >>>>>>>>>> s >>>>>>>>>> t >>>>>>>>>> A >>>>>>>>>> p >>>>>>>>>> i< >>>>>>>>>> / >>>>>>>>>> classResourceName> >>>>>>>>>> >>>>>>>>>> </classResourceNames> >>>>>>>>>> >>>>>>>>>> <applicationTitle>Primo</applicationTitle> >>>>>>>>>> >>>>>>>>>> <attachWadl>true</attachWadl> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> </configuration> >>>>>>>>>> >>>>>>>>>> </execution> >>>>>>>>>> >>>>>>>>>> </executions> >>>>>>>>>> >>>>>>>>>> </plugin> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> Thanks in advance >>>>>>>>>> >>>>>>>>>> Eyal >>>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> Sergey Beryozkin >>>>>>>>> >>>>>>>>> Talend Community Coders >>>>>>>>> http://coders.talend.com/ >>>>>>>>> >>>> >>>> >>>> -- >>>> Sergey Beryozkin >>>> >>>> Talend Community Coders >>>> http://coders.talend.com/ >>>> -- Sergey Beryozkin Talend Community Coders http://coders.talend.com/