Awesome! Thank you!
Tobias

On 25 Aug 2014, at 20:03, Curtis Rueden <ctrue...@wisc.edu> wrote:

> Hi Tobias,
> 
> > This is a critical bug in SJC which I will work on resolving today if
> > possible.
> 
> Latest released versions of the SciJava software stack now have this bug 
> fixed.
> 
> You can get the needed component versions by using pom-imagej 2.49 as parent.
> 
> Regards,
> Curtis
> 
> 
> On Fri, Aug 22, 2014 at 11:51 AM, Curtis Rueden <ctrue...@wisc.edu> wrote:
> Hi Tobias,
> 
> > I imagine that in many cases it would be helpful to somehow produce an
> > explicit list of transitive (runtime) dependencies at compile time.
> > But this is probably not possible because these dependencies are
> > specified as interfaces and there is no way of knowing beforehand the
> > dependencies of the implementing class that will be used at runtime.
> 
> Actually, you can do it either way. If you ask for an interface, it adds all 
> concrete service plugins that implement that interface. If you ask for a 
> concrete class, you get that concrete class only. But it is true that 
> whenever you ask for an interface, you will also transitively bring in all 
> dependencies of all implementing classes.
> 
> > In the present case it is even worse, because, if I understand
> > correctly, simply put the problem was not a missing dependency is
> > missing but additional stuff being present?
> 
> Right. There was an additional AppEventService that had a dependency on the 
> most problematic and limited ImageJ service: the DefaultLegacyService.
> 
> Another way I plan to (eventually!) mitigate that is to make the 
> DefaultLegacyService less crabby: I want it to be possible to have more than 
> one, that simply ends up referencing the same instance of ImageJ 1.x. This 
> shouldn't be too hard to do but haven't had to time explore that yet. This 
> would "paper over" the problem you had in that you wouldn't have received an 
> exception, but still would have brought in a whole bunch of unneeded service 
> dependencies for the purposes of ImgOpener.
> 
> The real fix here is to retool the AppEvent API as described here:
> https://github.com/scijava/scijava-common/commit/852f05cf1dbfb3ce99ccd416fee64573a0692764
> 
> This is a critical bug in SJC which I will work on resolving today if 
> possible.
> 
> Regards,
> Curtis
> 
> 
> 
> On Fri, Aug 22, 2014 at 11:45 AM, Tobias Pietzsch <pietz...@mpi-cbg.de> wrote:
> Hi Curtis,
> 
> On 22 Aug 2014, at 16:51, Curtis Rueden <ctrue...@wisc.edu> wrote:
> 
>> Hi Tobias,
>> 
>> > Except now all dependencies are not there anymore because now there
>> > are non-obvious (to me) implicit runtime dependencies.
>> >
>> > I find this unfortunate.
>> 
>> I agree that this is a two-edged sword. We have more types of plugins now, 
>> which can alter the runtime behavior in more ways, so of course it becomes 
>> possible for ill-behaved plugins to bring down the system.
>> 
>> This is already true in ImageJ 1.x though, because it is extensible at 
>> runtime: any plugin class could have a static initializer block that hoses 
>> up the JVM however it can imagine. It is just easier to do now.
>> 
>> IMO, it would not be worth it to eliminate these powerful extension points 
>> just because of this possibility. The flexibility gained outweighs any 
>> disadvantages.
> 
> I agree that it is very powerful and I’m not proposing to eliminate it.
> 
> I’m happy that my problem is just a quirk and that I will be able to continue 
> just calling new ImgOpener(), in blissfull ignorance of what is going on 
> behind the scenes.
> 
>> We have already taken great pains to mitigate the issue with services in the 
>> context: when you create a new ImgOpener without specifying an SJC context, 
>> it uses _only_ relevant service types: things that implement the 
>> SciJavaService and SCIFIOService interfaces. In other words: _not_ 
>> ImageJServices or other service types. The reason LegacyService is being 
>> (erroneously!) pulled in here is due to a bug in the design of the SJC 
>> AppEventService, as I said. I introduced a "LegacyAppEventService" which is 
>> a SciJavaService but depends on the ImageJ LegacyService. Hence, any Context 
>> that asks for SciJavaServices now pulls in a DefaultLegacyService whenever 
>> the LegacyAppEventService is on the classpath. The fix is to stop doing that.
>> 
>> Anyway, if it still bothers you that any ol' developer can add something to 
>> the classpath which hoses up your programs, then you can stop it: create a 
>> more carefully controlled SJC Context and pass that to the ImgOpener. 
>> Alternately, we could change ImgOpener to be even more conservative in which 
>> services it uses. Of course, there are downsides there: any additional file 
>> format plugins, codec plugins, etc., might not be work properly if they do 
>> not have access to the services they need.
>> 
>> I am very open to ideas for mitigating the extensibility issues here.
> 
> I currently have only limited knowledge of the workings of scijava-common so 
> I admit that I have no ideas here.
> 
> I imagine that in many cases it would be helpful to somehow produce an 
> explicit list of transitive (runtime) dependencies at compile time. But this 
> is probably not possible because these dependencies are specified as 
> interfaces and there is no way of knowing beforehand the dependencies of the 
> implementing class that will be used at runtime.
> In the present case it is even worse, because, if I understand correctly, 
> simply put the problem was not a missing dependency is missing but additional 
> stuff being present?
> 
> best regards,
> Tobias
> 
>> 
>> Regards,
>> Curtis
>> 
>> 
>> On Fri, Aug 22, 2014 at 9:35 AM, Tobias Pietzsch <pietz...@mpi-cbg.de> wrote:
>> Hi Johannes,
>> 
>> On 22 Aug 2014, at 09:04, Johannes Schindelin <johannes.schinde...@gmx.de> 
>> wrote:
>> 
>>> Hi Tobias,
>>> 
>>> On Fri, 22 Aug 2014, Tobias Pietzsch wrote:
>>> 
>>>> Currently
>>>> new io.scif.img.ImgOpener();
>>>> fails with
>>>> java.lang.IllegalArgumentException: Invalid service: 
>>>> net.imagej.legacy.LegacyAppEventService
>>> 
>>> Yep, the explanation is very easy:
>>> 
>>>> [...]
>>>> Caused by: java.lang.UnsupportedOperationException: Cannot instantiate 
>>>> more than one DefaultLegacyService
>>>> […]
>> 
>> I missed that...
>> 
>>> 
>>> There is already a context, including a legacy service. Unfortunately, the
>>> best way to get at this context from an *ImageJ 1.x plugin* that I could
>>> come up with is:
>>> 
>>>     import org.scijava.Context;
>>> 
>>>     ...
>>> 
>>>     final Context context = (Context)
>>>             IJ.runPlugIn(Context.class.getName(), "");
>>>     final ImgOpener opener = new ImgOpener(context);
>>> 
>>> (There is no way to make that more convenient without letting SCIFIO
>>> depend on ImageJ 1.x, which is of course a big no-no).
>> 
>> The problem with this solution you suggested is that it does not work in 
>> Eclipse:
>> Exception in thread "main" java.lang.IllegalArgumentException: Invalid 
>> service: net.imagej.legacy.DefaultLegacyService
>> 
>> As much as I understand the need for the runtime service discovery used by 
>> the scijava stack, there are certainly downsides to it.
>> My feeling is that in some ways it undermines the advantages that we have 
>> gained by switching to maven.
>> I can import a maven project into my Eclipse, and all the dependencies are 
>> there, explicitly and automatically, which is really very convenient.
>> Except now all dependencies are not there anymore because now there are 
>> non-obvious (to me) implicit runtime dependencies.
>> I find this unfortunate.
>> 
>> That being said, I found a solution that works for now, both in Eclipse and 
>> in Fiji
>>     final ImgOpener opener = new ImgOpener( new Context( 
>> SCIFIOService.class, AppService.class, StatusService.class ) );
>> This avoids requiring the net.imagej.legacy.LegacyAppEventService.
>> It seems to work, but I’m not sure: Are there any downsides to that?
>> 
>> best regards,
>> Tobias
>> 
>>> 
>>> Of course, you could also turn your plugin into an ImageJ2 plugin -- which
>>> is handled properly in Fiji thanks to Fiji Just Being ImageJ2 -- and then
>>> it would become as easy as:
>>> 
>>>             @Parameter
>>>             private IOService io;
>>> 
>>>             ...
>>>                     // use the IOService (which lets SCIFIO handle
>>>                     // things) to open your dataset
>>> 
>>> Ciao,
>>> Johannes
>>> 
>>> -- 
>>> -- 
>>> Please avoid top-posting, and please make sure to reply-to-all!
>>> 
>>> Mailing list web interface: http://groups.google.com/group/fiji-devel
>>> 
>>> --- 
>>> You received this message because you are subscribed to the Google Groups 
>>> "Fiji-devel" group.
>>> To unsubscribe from this group and stop receiving emails from it, send an 
>>> email to fiji-devel+unsubscr...@googlegroups.com.
>>> For more options, visit https://groups.google.com/d/optout.
>> 
>> 
> 
> 
> 

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

_______________________________________________
ImageJ-devel mailing list
ImageJ-devel@imagej.net
http://imagej.net/mailman/listinfo/imagej-devel

Reply via email to