Also, just in case, a custom activator is ever required, it can be overridden easily without breaking the over all design
On Tue, May 5, 2020 at 6:27 PM Niclas Hedhman <nic...@hedhman.org> wrote: > Yes, that's what I mean, because that is what you have inside the loop, so > it should work. > > On Tue, May 5, 2020 at 11:50 AM Robinet, Etienne <43...@etu.he2b.be> > wrote: > >> Hi Niclas, >> thanks for the feedback. So you mean to make the Activator in API/SPI >> generic so every Driver would call it and declare the service itself? >> >> Le mar. 5 mai 2020 à 05:25, Niclas Hedhman <nic...@hedhman.org> a écrit : >> >> > What you are doing is not particularly OSGi-y... The expected way to do >> > this is to have each bundle register their PlcDriver or Transport to the >> > OSGi service registry. >> > >> > That said, what you have done is otherwise fine, as you basically >> trying to >> > centralize the BundleActivators away from respective Driver/Transport. >> And >> > I assume you do so to limit code in the drivers/transports. >> > >> > Another way would be to make two generic BundleActivator in this bundle >> and >> > have each driver/transport just declare them in the manifest. That >> would be >> > a bit more conventional. >> > >> > // Niclas >> > >> > On Tue, May 5, 2020 at 11:06 AM Robinet, Etienne <43...@etu.he2b.be> >> > wrote: >> > >> > > Hi all, >> > > With the change of Christofer this problem got solved. Nonetheless, I >> > kept >> > > the work I did (inspired by the work of Lukasz) to make an Activator >> for >> > > API (Driver Services) and SPI (Transport Services). I also tested it, >> but >> > > as I am pretty new to this, if anyone could just give me a feedback on >> > the >> > > code: >> > > >> > > API Activator: >> > > >> > > >> > >> https://github.com/apache/plc4x/blob/feature/osgi/plc4j/api/src/main/java/org/apache/plc4x/java/osgi/ApiActivator.java >> > > SPI Activator: >> > > >> > > >> > >> https://github.com/apache/plc4x/blob/feature/osgi/plc4j/spi/src/main/java/org/apache/plc4x/java/osgi/SpiActivator.java >> > > >> > > If everything is alright, I could merge this today. >> > > >> > > Etienne >> > > >> > > Le mar. 7 avr. 2020 à 17:52, Christofer Dutz < >> christofer.d...@c-ware.de> >> > a >> > > écrit : >> > > >> > > > Hi folks, >> > > > >> > > > I just pushed a change that might get rid of this error. >> > > > >> > > > I added the Plc4xBootstrap in an attempt to get the TestTransport >> > > working. >> > > > For some reasons the netty folks created the EmbeddedChannel >> > differently >> > > > than the rest. >> > > > However as the TestTransport is the only one needing this change, I >> > moved >> > > > these classes to the test-transport module >> > > > and extended NettyChannelFactory with a createBootstrap method >> which is >> > > > simply overridden in TestTransport. >> > > > >> > > > So please give everything a try if it now works as planned. >> > > > >> > > > Chris >> > > > >> > > > >> > > > >> > > > Am 07.04.20, 17:36 schrieb "Etienne Robinet" <43...@etu.he2b.be>: >> > > > >> > > > Hi all, >> > > > I’ve checked the Manifest. If I put the Embed-Dependency to the >> > > > plc4j-spi artifact it does not find the Transport Service. And if I >> > dont >> > > > it does not find the Plc4xBootstrap. >> > > > >> > > > Etienne ROBINET >> > > > >> > > > > Le 7 avr. 2020 à 16:48, Łukasz Dywicki <l...@code-house.org> >> a >> > > > écrit : >> > > > > >> > > > > I was updating my local checkout yesterday. Can't promise if I >> > will >> > > > be >> > > > > able to help, but will give a try with 0.7 snapshot. >> > > > > >> > > > > Best, >> > > > > Łukasz >> > > > > >> > > > > >> > > > >> On 07.04.2020 15:39, Etienne Robinet wrote: >> > > > >> Hi again, >> > > > >> I've been looking at this issue all day, and I am back to the >> > > > initial error: >> > > > >> https://i.imgur.com/LLfan8H.png >> > > > >> >> > > > >> The difference is I used and Activator for API and SPI to >> > register >> > > > the driver and transports Service, which are then loaded by the >> custom >> > > > blueprint. The error now is caused again because this class is not >> > > exported >> > > > (I think?) by the SPI, but is used by one of the dependency >> (io.netty). >> > > > >> Any ideas on how to solve this? >> > > > >> >> > > > >> Etienne >> > > > >> >> > > > >>> On 2020/04/07 06:53:54, Etienne Robinet < >> erobi...@apache.org> >> > > > wrote: >> > > > >>> Hi all, >> > > > >>> the faulty ClassLoader is the >> > > > BundleDelegatingClassLoader(plc4x-test [191]). Which means that the >> > > custom >> > > > bundle can not find the class right? >> > > > >>> >> > > > >>> I'm sorry if it's a silly question but I am pretty new to >> this. >> > > > >>> >> > > > >>> Etienne >> > > > >>> >> > > > >>> On 2020/04/06 20:28:17, Łukasz Dywicki <l...@code-house.org >> > >> > > > wrote: >> > > > >>>> I haven't used Camel for a while, but to me it seems to be >> a >> > > > problem >> > > > >>>> caused by caller's classloader. >> > > > >>>> >> > > > >>>> See that in stack trace you have a thread which is started >> by >> > > > camel, so >> > > > >>>> there are 3 or even 4 classloaders to be considered: >> > > > >>>> - plc4x, definitely not a faulty one >> > > > >>>> - netty, could be troublesome but unlikely to be used >> > > > >>>> - camel-core, or component itself >> > > > >>>> - custom bundle which started the route >> > > > >>>> >> > > > >>>> Anything beside last one which knows all the dependencies >> will >> > > > blow up >> > > > >>>> whole universe. Here is why - only the custom bundle knows >> all >> > > the >> > > > >>>> dependencies necessary to run logic and can be used to fix >> > > messed >> > > > up >> > > > >>>> classpath. In most of the cases, that's the "trick" you >> have >> > to >> > > > make in >> > > > >>>> order to get OSGi happy. >> > > > >>>> Camel component may not, and should not depend on specific >> > > driver, >> > > > >>>> however in your case it does. Possibly due to new APIs in >> > > > transport >> > > > >>>> layer its shouldn't be used for adhoc fixes. >> > > > >>>> >> > > > >>>> We can try to turn drivers into services (see here >> > > > >>>> >> > > > >> > > >> > >> https://github.com/splatch/plc4x/commit/5ce379cf8d2f5dc91fdfb6d8a8e2c0531906e69f >> > > > ) >> > > > >>>> in order to cut concrete class dependency and rely on >> isolated >> > > > APIs. >> > > > >>>> This code was done before new abstractions over netty were >> > > > introduced, >> > > > >>>> but it should cut in half API and caller side (not sure if >> > we're >> > > > on >> > > > >>>> declarative services). >> > > > >>>> >> > > > >>>> My tip to you Etienne - please verify which class loader is >> > used >> > > > in your >> > > > >>>> polling cycle. You can do that by making breakpoint in >> faulty >> > > > method of >> > > > >>>> S7Driver and evaluating expression >> > > > >>>> "Thread.currentThread().getContextClassLoader()". >> > > > >>>> Once you know that you can either fix classloading in the >> > > calling >> > > > class >> > > > >>>> loader or override classloader for thread to proper one. >> > > > >>>> >> > > > >>>> Best, >> > > > >>>> Łukasz >> > > > >>>> >> > > > >>>> >> > > > >>>> On 03.04.2020 10:27, Etienne Robinet wrote: >> > > > >>>>> Hi Christian, >> > > > >>>>> you mean the code used in the Camel route? It is an >> > blueprint: >> > > > >>>>> >> > > > >>>>> <?xml version="1.0" encoding="UTF-8"?> >> > > > >>>>> <blueprint xmlns=" >> http://www.osgi.org/xmlns/blueprint/v1.0.0 >> > " >> > > > >>>>> xmlns:xsi=" >> > http://www.w3.org/2001/XMLSchema-instance >> > > " >> > > > >>>>> xsi:schemaLocation= " >> > > > http://www.osgi.org/xmlns/blueprint/v1.0.0 >> > > > https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd >> > > > >>>>> http://camel.apache.org/schema/blueprint >> > > > http://camel.apache.org/schema/blueprint/camel-blueprint-2.24.2.xsd >> "> >> > > > >>>>> >> > > > >>>>> >> > > > >>>>> <camelContext id="PLC-IoTDB" xmlns=" >> > > > http://camel.apache.org/schema/blueprint" streamCache="true" > >> > > > >>>>> <route id="plc-route" > >> > > > >>>>> <from >> > > > uri="timer://plcFetch?fixedRate=true&period=1000"/> >> > > > >>>>> <pollEnrich> >> > > > >>>>> <simple>plc4x:s7:tcp:// >> > > > 192.168.178.10?address=#fields</simple> >> > > > >>>>> </pollEnrich> >> > > > >>>>> <log message="${body}"/> >> > > > >>>>> <to uri="mock:test?retainLast=10"/> >> > > > >>>>> </route> >> > > > >>>>> </camelContext> >> > > > >>>>> >> > > > >>>>> >> > > > >>>>> <bean id="fields" class="java.util.ArrayList"> >> > > > >>>>> <argument> >> > > > >>>>> <list> >> > > > >>>>> <bean >> class="org.apache.plc4x.camel.TagData"> >> > > > >>>>> <argument index="0" value="IntTest"/> >> > > > >>>>> <argument index="1" >> > value="%DB1.DBW254:INT"/> >> > > > >>>>> </bean> >> > > > >>>>> <bean >> class="org.apache.plc4x.camel.TagData"> >> > > > >>>>> <argument index="0" value="StringTest"/> >> > > > >>>>> <argument index="1" >> > > value="%DB1.DBX0:STRING"/> >> > > > >>>>> </bean> >> > > > >>>>> </list> >> > > > >>>>> </argument> >> > > > >>>>> </bean> >> > > > >>>>> </blueprint> >> > > > >>>>> >> > > > >>>>> This code used to wrok actually, I just wanted to test the >> > new >> > > > TagData of the integration. This is the bundling in the pom, these >> > > imports >> > > > had to be there before too >> > > > >>>>> >> > > > >>>>> <plugin> >> > > > >>>>> <groupId>org.apache.felix</groupId> >> > > > >>>>> >> <artifactId>maven-bundle-plugin</artifactId> >> > > > >>>>> <version>4.2.1</version> >> > > > >>>>> <extensions>true</extensions> >> > > > >>>>> <configuration> >> > > > >>>>> <instructions> >> > > > >>>>> >> > > > <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> >> > > > >>>>> >> > > > <Bundle-Version>${project.version}</Bundle-Version> >> > > > >>>>> <Export-Package> >> > > > >>>>> *;version=${project.version} >> > > > >>>>> </Export-Package> >> > > > >>>>> <Import-Package> >> > > > >>>>> >> > org.apache.plc4x.java.spi.transport, >> > > > >>>>> >> > org.apache.plc4x.java.s7.readwrite, >> > > > >>>>> * >> > > > >>>>> </Import-Package> >> > > > >>>>> </instructions> >> > > > >>>>> </configuration> >> > > > >>>>> </plugin> >> > > > >>>>> >> > > > >>>>> >> > > > >>>>> Etienne >> > > > >>>>> >> > > > >>>>> On 2020/04/03 08:17:45, Christian Schneider < >> > > > ch...@die-schneider.net> wrote: >> > > > >>>>>> The code in plc4x directly uses the class (not a String >> of >> > the >> > > > name). This >> > > > >>>>>> is good. Normally such a class reference should work >> fine. >> > > > >>>>>> >> > > > >>>>>> Can you show your code as a complete example? >> > > > >>>>>> >> > > > >>>>>> Christian >> > > > >>>>>> >> > > > >>>>>> >> > > > >>>>>> Am Fr., 3. Apr. 2020 um 09:58 Uhr schrieb Julian >> Feinauer < >> > > > >>>>>> j.feina...@pragmaticminds.de>: >> > > > >>>>>> >> > > > >>>>>>> I am off with my knowledge. >> > > > >>>>>>> You could ask the Karaf friends (#karaf in Slack). They >> are >> > > > all OSGi >> > > > >>>>>>> experts and very friendly and helpful. >> > > > >>>>>>> Or perhaps Christian has an idea here? >> > > > >>>>>>> >> > > > >>>>>>> Best >> > > > >>>>>>> Julian >> > > > >>>>>>> >> > > > >>>>>>> Am 03.04.20, 09:50 schrieb "Etienne Robinet" < >> > > > erobi...@apache.org>: >> > > > >>>>>>> >> > > > >>>>>>> Hi again, >> > > > >>>>>>> I've been struggling with this issue for 2 days >> now... I >> > > > still don't >> > > > >>>>>>> get it why it can not find classes. here is the current >> > > > problem: >> > > > >>>>>>> https://i.imgur.com/LtZMdsu.png >> > > > >>>>>>> >> > > > >>>>>>> We can see that the classes are available and >> exported, >> > I >> > > > don't know >> > > > >>>>>>> why the Camel Context can't find it. I even tried to >> add an >> > > > Activator to my >> > > > >>>>>>> bundle, and load these classes there and it works! But >> not >> > in >> > > > the >> > > > >>>>>>> blueprint. If anyone had any idea on where the problem >> > is... >> > > > >>>>>>> >> > > > >>>>>>> Etienne >> > > > >>>>>>> >> > > > >>>>>>> On 2020/04/01 01:31:15, Niclas Hedhman < >> > > nic...@hedhman.org> >> > > > wrote: >> > > > >>>>>>>> It happens that OSGi classloading result in the wrong >> > NCDFE >> > > > and that >> > > > >>>>>>> one of >> > > > >>>>>>>> the classes "used" (i.e. return type, parameter, >> throws, >> > > > extends, >> > > > >>>>>>>> implements) in the reported class is not visible by the >> > > > classloader. >> > > > >>>>>>> And >> > > > >>>>>>>> occasionally, it is a "diamond problem", i.e. that the >> > > > Constraints >> > > > >>>>>>> (IIRC, >> > > > >>>>>>>> see chapter 3.8 in OSGi spec) can't be satisfied. >> > > > >>>>>>>> >> > > > >>>>>>>> Sorry that I don't have time to dig into the actual >> > > situation >> > > > here, >> > > > >>>>>>> but I >> > > > >>>>>>>> thought I could share some of my past (dark) >> history.... >> > ;-) >> > > > >>>>>>>> >> > > > >>>>>>>> Cheers >> > > > >>>>>>>> Niclas >> > > > >>>>>>>> >> > > > >>>>>>>> On Wed, Apr 1, 2020 at 12:43 AM Christofer Dutz < >> > > > >>>>>>> christofer.d...@c-ware.de> >> > > > >>>>>>>> wrote: >> > > > >>>>>>>> >> > > > >>>>>>>>> Hi all, >> > > > >>>>>>>>> >> > > > >>>>>>>>> But If I search for uses of that class, it's only in >> the >> > > > >>>>>>>>> >> org.apache.plc4x.java.spi.connection.NettyChannelFactory >> > > > which is >> > > > >>>>>>> in the >> > > > >>>>>>>>> SPI module. >> > > > >>>>>>>>> >> > > > >>>>>>>>> So I am not sure where this is accessed directly from >> the >> > > > outside. >> > > > >>>>>>> I know >> > > > >>>>>>>>> every driver would use the NettyChannelFactory, but >> that >> > > > shouldn't >> > > > >>>>>>> be an >> > > > >>>>>>>>> OSGi type problem as the SPI classes should be able to >> > > access >> > > > >>>>>>> their own >> > > > >>>>>>>>> classes. >> > > > >>>>>>>>> >> > > > >>>>>>>>> Chris >> > > > >>>>>>>>> >> > > > >>>>>>>>> >> > > > >>>>>>>>> >> > > > >>>>>>>>> Am 31.03.20, 16:07 schrieb "Etienne Robinet" < >> > > > 43...@etu.he2b.be>: >> > > > >>>>>>>>> >> > > > >>>>>>>>> Hi, >> > > > >>>>>>>>> From the log the class is called outside the SPI by >> > the >> > > > >>>>>>> transport >> > > > >>>>>>>>> >> > > > >>>>>>>>> Etienne >> > > > >>>>>>>>> >> > > > >>>>>>>>>> Le 31 mars 2020 à 15:24, Julian Feinauer < >> > > > >>>>>>>>> j.feina...@pragmaticminds.de> a écrit : >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> Hi, >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> yes, if ist only needed internally its fine.But why >> does >> > > > >>>>>>> someone >> > > > >>>>>>>>> then get a Class Not Found Exception? >> > > > >>>>>>>>>> This is usually a hint to some class loader issue in >> > OSGi >> > > > >>>>>>> which is >> > > > >>>>>>>>> related to exports/ imports. >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> J >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> Am 31.03.20, 15:23 schrieb "Christofer Dutz" < >> > > > >>>>>>>>> christofer.d...@c-ware.de>: >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> As this package is only referenced from within SPI, >> > > > >>>>>>> couldn't we >> > > > >>>>>>>>> just exclude it from the package exports? >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> Chris >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> Am 31.03.20, 15:17 schrieb "Julian Feinauer" < >> > > > >>>>>>>>> j.feina...@pragmaticminds.de>: >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> Hi, >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> the issue is that if we export it, then we >> break >> > > > >>>>>>> Nettys OSGi >> > > > >>>>>>>>> integration as we get a split package situation (two >> > > bundles >> > > > >>>>>>> exporting the >> > > > >>>>>>>>> same package, which is forbidden in OSGi). >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> So I see no easy solution (but had to do the >> same >> > > > >>>>>>> once as >> > > > >>>>>>>>> Netty is pretty... private). >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> J >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> Am 31.03.20, 15:15 schrieb "Christofer Dutz" < >> > > > >>>>>>>>> christofer.d...@c-ware.de>: >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> Hi all, >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> I just discussed this issue with Etienne >> and I >> > > > >>>>>>> thought it >> > > > >>>>>>>>> was important for all, so I asked him to bring it >> here. >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> In my effort to get the EmbeddedChannel >> > working >> > > > >>>>>>> as a full >> > > > >>>>>>>>> "transport" module, I had to override the Netty >> Bootstrap >> > > > >>>>>>> mechanism. >> > > > >>>>>>>>>> Unfortunately in order to do so, I need to >> > call >> > > > >>>>>>> "init" >> > > > >>>>>>>>> from the derived class. Unfortunately this is package >> > > > private in >> > > > >>>>>>> Netty so I >> > > > >>>>>>>>> had >> > > > >>>>>>>>>> To add it to the same package. >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> Would it help to just not export these >> > packages >> > > > >>>>>>> to OSGi? >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> But I'm also open for alternatives (Please >> > none >> > > > >>>>>>> involving >> > > > >>>>>>>>> mega-evil reflection hackery). >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> Chris >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> Am 31.03.20, 15:10 schrieb "Etienne >> Robinet" < >> > > > >>>>>>>>> erobi...@apache.org>: >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> Hi all, >> > > > >>>>>>>>>> I've been working on the Camel >> Component >> > and >> > > > >>>>>>> decided >> > > > >>>>>>>>> to test it inside Karaf, but I noticed that I've got >> this >> > > > error >> > > > >>>>>>> now: >> > > > >>>>>>>>>> https://i.imgur.com/kUZPwZ5.png >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> Seems like this class is not exported >> by >> > the >> > > > >>>>>>> bundle >> > > > >>>>>>>>> so it can not be found. Anyone has an idea on how we >> > could >> > > > solve >> > > > >>>>>>> this? >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> Etienne >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> >> > > > >>>>>>>>>> >> > > > >>>>>>>>> >> > > > >>>>>>>>> >> > > > >>>>>>>>> >> > > > >>>>>>>> >> > > > >>>>>>> >> > > > >>>>>>> >> > > > >>>>>>> >> > > > >>>>>> >> > > > >>>>>> -- >> > > > >>>>>> -- >> > > > >>>>>> Christian Schneider >> > > > >>>>>> http://www.liquid-reality.de >> > > > >>>>>> >> > > > >>>>>> Computer Scientist >> > > > >>>>>> http://www.adobe.com >> > > > >>>>>> >> > > > >>>> >> > > > >>> >> > > > >> > > > >> > > > >> > > >> > >> >