Re: JI-9056801 : Scene: Allow to add a stylesheet using a typed URL, not a stringified URL
[you replied offlist but I guess that was an oversight so I bring it back] Reading through the document I don't see what concept is not working, but indeed the URL-constructor says that the protocol handler is resolved when constructing the URL. Does OneJar rely on that fact? The Stackoverflow problem who talks about Felix is strange as Felix returns in the toExternalForm() approach a custom protocol (bundle:) and Felix like eg Equinox installs an URLHandler for that protocol. URL-Handlers work prefectly fine - I know that because I maintain e(fx)clipse who is based on Equinox and we there make extensive usage of that and never had any trouble. I also found: http://one-jar.sourceforge.net/index.php?page=frameworks who talks about a custom protocol supported by OneJar but as I've never used OneJar (we use maven-shade for stuff like this) I don't know if this applies to this problem. Tom On 16.09.18 05:24, Michael Binz wrote: > Hi, > > actually this is not a problem with a particular tool we use. The > problem is that some of the concepts described in [1] that are used for > resource loading do not longer work. This impacts all tools that base > their functionality on this, See [2] for other situations where > classloader-based resource-loading fails. > > Michael. > > [1] > https://docs.oracle.com/javase/8/docs/technotes/guides/lang/resources.html > [2] > https://stackoverflow.com/questions/2897/javafx-stylesheets-inside-osgi-bundle > > > Am Sa., 15. Sep. 2018 um 20:40 Uhr schrieb Tom Schindl > mailto:tom.schi...@bestsolution.at>>: > > Hi, > > I don't understand why something should be lost but anyways I don't > think JavaFX API is not the right place to fix a short coming of OneJar. > As Nir pointed out it is next to impossible to retrofit the JavaFX API > to URL with breaking it. > > Tom > > On 22.08.18 20:47, Michael Binz wrote: > > Hi all, > > > > I opened a proposal for an extension of the javafx.scene.Scene API > to allow > > to add a stylesheet using a typed java.net.URL. > > > > Currently the Scene class offers a list of stylesheet URLs in their > > stringified representation accessible by Scene.getStylesheets(). > > > > The problem is that in some cases an URL instance encapsulates > internal > > state that gets lost in the conversion into its external form and > back into > > an URL instance, namely information on an URL handler. This ultimately > > results in a failure (IOException file not found) when the Screen > class > > tries to load a stylesheet though code that loads the file > contents using > > URL#openStream() on the original URL instance can read the file > contents > > successfully. > > > > In my case the problem showed up when creating an executable jar file > > containing my JavaFX application (using OneJar). The application > startup > > in this case installs a customized Classloader that implements special > > logic for accessing the jars contained classes, This works > transparently > > for classes and resources, but the URLs returned by > Class#getResource( name > > ) do not survive the conversion to string and back because of the > described > > reason. > > > > There is a workaround that caches the resource in a temporary file and > > passes this file's URL to the Scene's list of stylesheets, but > this poses > > other problems. > > As a remark, other APIs in JavaFX use the same pattern of expecting > > stringified URLs like the Image() constructor and have the same > problem, > > but offer alternative constructors accepting a stream which allows > to solve > > the problem nicely. > > > > Please discuss and decide if the proposal can be added as a change > request > > for JavaFX. > > > > Best wishes, > > Michael. > > > > -- > Tom Schindl, CTO > BestSolution.at EDV Systemhaus GmbH > Eduard-Bodem-Gasse 5-7. A-6020 Innsbruck > Reg. Nr. FN 222302s am Firmenbuchgericht Innsbruck > -- Tom Schindl, CTO BestSolution.at EDV Systemhaus GmbH Eduard-Bodem-Gasse 5-7. A-6020 Innsbruck Reg. Nr. FN 222302s am Firmenbuchgericht Innsbruck
Re: JI-9056801 : Scene: Allow to add a stylesheet using a typed URL, not a stringified URL
I think this needs to be discussed with a project lead - Kevin or Johan. On Sun, Sep 16, 2018 at 6:07 AM Michael Binz wrote: > Hi Nir, > > I understand that switching the API to use net.URL is not trivial. > > The only idea that comes to mind is to offer two list properties, the one > existing as today, holding stringified URLs for backwards compatibility, > and a second one that holds typed .net.URLs. The existing version can be > deprecated in favour of the typed version. > > Before starting such an effort it would be interesting if it is common > understanding that an URL instance is preferrable over a string URL. > Was there a special reason that JavaFX uses in its interfaces in many > places stringified URLs instead of the existing java.net.URL? > > Best wishes, > Michael. > > > Am Fr., 14. Sep. 2018 um 14:23 Uhr schrieb Nir Lisker : > >> Hi Michael, >> >> The issue in the JBS is JDK-8209921 [1]. >> >> getStylesheets() returns an ObservableList, it cannot be changed >> to ObservableList. What solution do you propose? >> >> [1] https://bugs.openjdk.java.net/browse/JDK-8209921 >> >> - Nir >> >> On Wed, Aug 22, 2018 at 9:47 PM Michael Binz wrote: >> >>> Hi all, >>> >>> I opened a proposal for an extension of the javafx.scene.Scene API to >>> allow >>> to add a stylesheet using a typed java.net.URL. >>> >>> Currently the Scene class offers a list of stylesheet URLs in their >>> stringified representation accessible by Scene.getStylesheets(). >>> >>> The problem is that in some cases an URL instance encapsulates internal >>> state that gets lost in the conversion into its external form and back >>> into >>> an URL instance, namely information on an URL handler. This ultimately >>> results in a failure (IOException file not found) when the Screen class >>> tries to load a stylesheet though code that loads the file contents using >>> URL#openStream() on the original URL instance can read the file contents >>> successfully. >>> >>> In my case the problem showed up when creating an executable jar file >>> containing my JavaFX application (using OneJar). The application startup >>> in this case installs a customized Classloader that implements special >>> logic for accessing the jars contained classes, This works transparently >>> for classes and resources, but the URLs returned by Class#getResource( >>> name >>> ) do not survive the conversion to string and back because of the >>> described >>> reason. >>> >>> There is a workaround that caches the resource in a temporary file and >>> passes this file's URL to the Scene's list of stylesheets, but this poses >>> other problems. >>> As a remark, other APIs in JavaFX use the same pattern of expecting >>> stringified URLs like the Image() constructor and have the same problem, >>> but offer alternative constructors accepting a stream which allows to >>> solve >>> the problem nicely. >>> >>> Please discuss and decide if the proposal can be added as a change >>> request >>> for JavaFX. >>> >>> Best wishes, >>> Michael. >>> >>
Re: JI-9056801 : Scene: Allow to add a stylesheet using a typed URL, not a stringified URL
Hi, I don't understand why something should be lost but anyways I don't think JavaFX API is not the right place to fix a short coming of OneJar. As Nir pointed out it is next to impossible to retrofit the JavaFX API to URL with breaking it. Tom On 22.08.18 20:47, Michael Binz wrote: > Hi all, > > I opened a proposal for an extension of the javafx.scene.Scene API to allow > to add a stylesheet using a typed java.net.URL. > > Currently the Scene class offers a list of stylesheet URLs in their > stringified representation accessible by Scene.getStylesheets(). > > The problem is that in some cases an URL instance encapsulates internal > state that gets lost in the conversion into its external form and back into > an URL instance, namely information on an URL handler. This ultimately > results in a failure (IOException file not found) when the Screen class > tries to load a stylesheet though code that loads the file contents using > URL#openStream() on the original URL instance can read the file contents > successfully. > > In my case the problem showed up when creating an executable jar file > containing my JavaFX application (using OneJar). The application startup > in this case installs a customized Classloader that implements special > logic for accessing the jars contained classes, This works transparently > for classes and resources, but the URLs returned by Class#getResource( name > ) do not survive the conversion to string and back because of the described > reason. > > There is a workaround that caches the resource in a temporary file and > passes this file's URL to the Scene's list of stylesheets, but this poses > other problems. > As a remark, other APIs in JavaFX use the same pattern of expecting > stringified URLs like the Image() constructor and have the same problem, > but offer alternative constructors accepting a stream which allows to solve > the problem nicely. > > Please discuss and decide if the proposal can be added as a change request > for JavaFX. > > Best wishes, > Michael. > -- Tom Schindl, CTO BestSolution.at EDV Systemhaus GmbH Eduard-Bodem-Gasse 5-7. A-6020 Innsbruck Reg. Nr. FN 222302s am Firmenbuchgericht Innsbruck
Re: JI-9056801 : Scene: Allow to add a stylesheet using a typed URL, not a stringified URL
Hi Michael, The issue in the JBS is JDK-8209921 [1]. getStylesheets() returns an ObservableList, it cannot be changed to ObservableList. What solution do you propose? [1] https://bugs.openjdk.java.net/browse/JDK-8209921 - Nir On Wed, Aug 22, 2018 at 9:47 PM Michael Binz wrote: > Hi all, > > I opened a proposal for an extension of the javafx.scene.Scene API to allow > to add a stylesheet using a typed java.net.URL. > > Currently the Scene class offers a list of stylesheet URLs in their > stringified representation accessible by Scene.getStylesheets(). > > The problem is that in some cases an URL instance encapsulates internal > state that gets lost in the conversion into its external form and back into > an URL instance, namely information on an URL handler. This ultimately > results in a failure (IOException file not found) when the Screen class > tries to load a stylesheet though code that loads the file contents using > URL#openStream() on the original URL instance can read the file contents > successfully. > > In my case the problem showed up when creating an executable jar file > containing my JavaFX application (using OneJar). The application startup > in this case installs a customized Classloader that implements special > logic for accessing the jars contained classes, This works transparently > for classes and resources, but the URLs returned by Class#getResource( name > ) do not survive the conversion to string and back because of the described > reason. > > There is a workaround that caches the resource in a temporary file and > passes this file's URL to the Scene's list of stylesheets, but this poses > other problems. > As a remark, other APIs in JavaFX use the same pattern of expecting > stringified URLs like the Image() constructor and have the same problem, > but offer alternative constructors accepting a stream which allows to solve > the problem nicely. > > Please discuss and decide if the proposal can be added as a change request > for JavaFX. > > Best wishes, > Michael. >