On a sidenote, "Check out these lines in AppModule" should be: "Check out these lines in TapestryModule". As for the directory vs. file expectation, you're correct: note the definitions in TapestryModule below: tapestry.blackbird.path is the path to the blackbird install, and is a directory. tapestry.blackbird is then the asset pointing to said directory. Sorry about that.
Robert On Jul 23, 2010, at 7/233:33 PM , Rich wrote: >> >> 4) Sorry, I jumped into this thread late, but, if all you're looking to do >> is to override the version/location of blackbird, there's a much easier way >> to do it. :) >> >> Tapestry resolves the blackbird location via symbol. Check out these lines >> in AppModule: >> >> public static void contributeFactoryDefaults(MappedConfiguration<String, >> String> configuration) >> { >> ... >> configuration.add("tapestry.blackbird.path", >> "org/apache/tapestry5/blackbird_1_0"); >> configuration.add("tapestry.blackbird", >> "classpath:${tapestry.blackbird.path}"); >> ... >> } >> >> You can easily override those values (the most important one is >> tapestry.blackbird, since that is the symbol tapestry uses everywhere else >> to resolve the component library): >> >> public static void contributeApplicationDefaults(MappedConfiguration<String, >> String> configuration) { >> configuration.add("tapestry.blackbird", >> "context:/scripts/blackbird_1_0/blackbird.js"); >> > yay, just what i was looking for. One minor adjustment though is that it > thinks blackbird.js is a directory not a file, so I had to copy all of the > blackbird files to /scripts/blackbird_1_0/ to get it to load properly, but > that was an easy fix. >> } >> >> Voila! No nasty recursions, no services to implement, now tapestry uses >> your customized version of blackbird. >> >> Cheers! >> >> Robert >> > > Thanks! > > Rich > >> On Jul 23, 2010, at 7/239:24 AM , Rich wrote: >> >> >>> Whoops. Seems I spoke too soon. After looking at that code out of context >>> it looked like the @InjectService and @Core are at stakes in the AppModule, >>> and removing @InjectService allowed @Core to resolve through properly. >>> Seems to be working alright now. Thanks Jim and Robert for the help. >>> >>> Regards, >>> Rich >>> >>> Rich wrote: >>> >>>> Sure, here is the current code from AppModule and MyClientInfrastructure. >>>> >>>> AppModule >>>> >>>> |public static ClientInfrastructure >>>> decorateClientInfrastructure(@InjectService("ClientInfrastructure") @Core >>>> ClientInfrastructure original, @InjectService("AssetSource") AssetSource >>>> assetSource) { >>>> return new MyClientInfrastructure(original, assetSource); >>>> } | >>>> >>>> MyClientInfrastructure >>>> >>>> |public class MyClientInfrastructure implements ClientInfrastructure { >>>> >>>> private ClientInfrastructure clientInfrastructure; >>>> @Inject private AssetSource assetSource; >>>> private List jsStack = new ArrayList(); >>>> public MyClientInfrastructure(ClientInfrastructure original, >>>> AssetSource asource){ >>>> this.assetSource = asource; this.clientInfrastructure = >>>> original; >>>> System.out.println("ClientInfrastructure -> " + >>>> clientInfrastructure); >>>> List assets = this.clientInfrastructure.getJavascriptStack(); >>>> for (Iterator i = assets.iterator(); i.hasNext();) { >>>> Asset asset = (Asset) i.next(); >>>> if (!asset.toString().contains("blackbird.js")) { >>>> jsStack.add(asset); >>>> } else { >>>> jsStack.add(assetSource.getAsset(null, >>>> "context:/scripts/blackbird_1_0/blackbird.js", null)); >>>> } >>>> } >>>> } >>>> public List<Asset> getJavascriptStack() { >>>> return jsStack; >>>> } >>>> >>>> public List<Asset> getStylesheetStack() { >>>> return clientInfrastructure.getStylesheetStack(); >>>> } >>>> >>>> } >>>> >>>> |||At this point I still get a recursion issue on ClientInfrastructure >>>> class. I chose this permutation because that recursion seems potentially >>>> 'easier' to solve than one on Alias or AliasOverrides. >>>> >>>> -Rich >>>> >>>> Robert Zeigler wrote: >>>> >>>>> Hey Rich, >>>>> >>>>> Can you post the code for your various attempts? I know you said earlier >>>>> you were having issues posting the code... if it still fails, you can try >>>>> e-mailing me directly with the code. In any event, if you're basing your >>>>> code on Jim's code that he posted below, the main thing that stands out >>>>> to me is that messing with AliasOverrides is tricky because it's used in >>>>> /so/ many places, particularly if you're not /very/ explicit about which >>>>> service you want to inject. One thing you could try is to mark, as >>>>> appropriate, the various injections of the ClientInfrastructure with >>>>> @Core or @Local, as the case may be: when you want tapestry's native >>>>> service injected, use @Core; when you want your version of the service, >>>>> use @Local. You might try that and see if it helps with the issues where >>>>> tapestry is complaining about recursion. Theoretically, specifying the >>>>> serviceid (@InjectService("somesersviceid")) should be sufficient, as >>>>> well, but I've found I have better success using the Marker annotations. >>>>> >>>>> HTH >>>>> >>>>> Robert >>>>> >>>>> On Jul 22, 2010, at 7/223:30 PM , Rich wrote: >>>>> >>>>> >>>>> >>>>>> No problem, I appreciate the time and effort. I've got the code using >>>>>> Tapestry 1.5.0.5. I suppose this isn't the biggest bug in the world and >>>>>> with 5.2 on the horizon it might be worth just waiting, but I've also >>>>>> got my curiosity piqued as to the whole service decoration stuff now. >>>>>> I'm still trying to be able to intelligibly build on tapestry rather >>>>>> than just using it, and concepts like this seem to be vital components >>>>>> to that progress. >>>>>> >>>>>> Regards, >>>>>> Rich >>>>>> >>>>>> Jim O'Callaghan wrote: >>>>>> >>>>>>> Sorry I can't be of more help Rich - we've migrated over to T5.2.0 so I >>>>>>> don't have a pre T5.2.0 environment I can test this under at the moment. >>>>>>> You're right though it shouldn't be difficult at all - I've found a lot >>>>>>> of >>>>>>> these minor things have me banging my head on the desk until someone >>>>>>> chips >>>>>>> in with the solution, before having the 'ahhh' moment. Hopefully >>>>>>> someone >>>>>>> here can steer you straight - what exact version of Tapestry are you >>>>>>> using? >>>>>>> >>>>>>> Regards, >>>>>>> Jim. >>>>>>> >>>>>>> -----Original Message----- >>>>>>> From: Rich [mailto:rich...@moremagic.com] Sent: 22 July 2010 20:51 >>>>>>> To: Tapestry users >>>>>>> Subject: Re: blackbird.js and IE breaking fixed CSS background image >>>>>>> >>>>>>> No luck still =/ >>>>>>> >>>>>>> I tried it many ways: >>>>>>> decorateClientInfrastructure with contributeAliasOverride with bind: >>>>>>> java.lang.IllegalStateException: Construction of service >>>>>>> 'AliasOverrides' has failed due to recursion: the service depends on >>>>>>> itself in some way. Please check >>>>>>> org.apache.tapestry5.internal.services.AliasManagerImpl(Logger, >>>>>>> Collection) (at AliasManagerImpl.java:32) via >>>>>>> org.apache.tapestry5.services.TapestryModule.bind(ServiceBinder) (at >>>>>>> TapestryModule.java:251) for references to another service that is >>>>>>> itself dependent on service 'AliasOverrides'. >>>>>>> >>>>>>> decorateClientInfrastructure without contributeAliasOverride without >>>>>>> bind: >>>>>>> java.lang.IllegalStateException: Construction of service >>>>>>> 'ClientInfrastructure' has failed due to recursion: the service depends >>>>>>> on itself in some way. Please check >>>>>>> org.apache.tapestry5.internal.services.ClientInfrastructureImpl(SymbolSource >>>>>>> , AssetSource, ThreadLocale) (at ClientInfrastructureImpl.java:64) via >>>>>>> org.apache.tapestry5.services.TapestryModule.bind(ServiceBinder) (at >>>>>>> TapestryModule.java:251) for references to another service that is >>>>>>> itself dependent on service 'ClientInfrastructure'. >>>>>>> >>>>>>> decorateClientInfrastructure without contributeAliasOverride with bind: >>>>>>> java.lang.RuntimeException: Service interface >>>>>>> org.apache.tapestry5.services.ClientInfrastructure is matched by 2 >>>>>>> services: ClientInfrastructure, MyClientInfrastructure. Automatic >>>>>>> dependency resolution requires that exactly one service implement the >>>>>>> interface. >>>>>>> >>>>>>> buildMyClientInfrastructure with contributeAlias: >>>>>>> java.lang.IllegalStateException: Construction of service 'Alias' has >>>>>>> failed due to recursion: the service depends on itself in some way. >>>>>>> Please check >>>>>>> org.apache.tapestry5.services.TapestryModule.buildAlias(Logger, String, >>>>>>> AliasManager, Collection) (at TapestryModule.java:325) for references >>>>>>> to another service that is itself dependent on service 'Alias'. >>>>>>> >>>>>>> >>>>>>> buildMyClientInfrastructure without contributeAlias: >>>>>>> java.lang.RuntimeException: Service interface >>>>>>> org.apache.tapestry5.services.ClientInfrastructure is matched by 2 >>>>>>> services: ClientInfrastructure, MyClientInfrastructure. Automatic >>>>>>> dependency resolution requires that exactly one service implement the >>>>>>> interface. >>>>>>> >>>>>>> buildMyClientInfrastructure with contributeAliasOverrides: >>>>>>> java.lang.IllegalStateException: Construction of service >>>>>>> 'AliasOverrides' has failed due to recursion: the service depends on >>>>>>> itself in some way. Please check >>>>>>> org.apache.tapestry5.internal.services.AliasManagerImpl(Logger, >>>>>>> Collection) (at AliasManagerImpl.java:32) via >>>>>>> org.apache.tapestry5.services.TapestryModule.bind(ServiceBinder) (at >>>>>>> TapestryModule.java:251) for references to another service that is >>>>>>> itself dependent on service 'AliasOverrides'. >>>>>>> >>>>>>> Errors were pretty similar, and this was about as many permutations as >>>>>>> I could imagine. Can anyone shed some light towards a reasonable way to >>>>>>> decorate the ClientInfrastructure so I can swap the blackbird.js? I >>>>>>> find it hard to believe decoration is this complicated. >>>>>>> >>>>>>> Thanks, >>>>>>> Rich >>>>>>> >>>>>>> Jim O'Callaghan wrote: >>>>>>> >>>>>>>> Rich, >>>>>>>> >>>>>>>> I'm on T5.2.0 so the code has been updated accordingly - looking >>>>>>>> through >>>>>>>> >>>>>>> my >>>>>>> >>>>>>>> file history, I have: >>>>>>>> >>>>>>>> public static MyClientInfrastructure >>>>>>>> buildMyClientInfrastructure(@InjectService("ClientInfrastructure") >>>>>>>> ClientInfrastructure original, @InjectService("AssetSource") >>>>>>>> AssetSource >>>>>>>> assetSource) >>>>>>>> { >>>>>>>> return new MyClientInfrastructure(original, >>>>>>>> assetSource); >>>>>>>> } public static void contributeAlias( >>>>>>>> @InjectService("MyClientInfrastructure") >>>>>>>> ClientInfrastructure cInfraService, >>>>>>>> org.apache.tapestry5.ioc.Configuration<AliasContribution> >>>>>>>> configuration) { >>>>>>>> >>>>>>>> configuration.add(AliasContribution.create(ClientInfrastructure.class, >>>>>>>> cInfraService)); >>>>>>>> } >>>>>>>> >>>>>>>> ... in my AppModule. It's been a while since I looked at it so can't >>>>>>>> say >>>>>>>> for sure but perhaps this is more in line with what is required for >>>>>>>> T5.1.0.x. I think ClientInfrastructure is deprecated in T5.2.0. Hope >>>>>>>> >>>>>>> this >>>>>>> >>>>>>>> is of use. >>>>>>>> >>>>>>>> Regards, >>>>>>>> Jim. >>>>>>>> >>>>>>>> -----Original Message----- >>>>>>>> From: Rich [mailto:rich...@moremagic.com] Sent: 22 July 2010 16:32 >>>>>>>> To: Tapestry users >>>>>>>> Subject: Re: blackbird.js and IE breaking fixed CSS background image >>>>>>>> >>>>>>>> Hi, >>>>>>>> >>>>>>>> attempt 6 at getting through spam blocker. I used the code mentioned >>>>>>>> but the "original" object from the decorate method is always null. I'm >>>>>>>> not sure what to do about that? >>>>>>>> >>>>>>>> -Rich >>>>>>>> >>>>>>>> Jim O'Callaghan wrote: >>>>>>>> >>>>>>>>> Hi Rich, >>>>>>>>> >>>>>>>>> Yep same guy, guilty as charged. This may not be the best solution, >>>>>>>>> you >>>>>>>>> >>>>>>>> may >>>>>>>> >>>>>>>>> get some better advice from some of the more experienced Tapestry >>>>>>>>> people >>>>>>>>> >>>>>>>> on >>>>>>>> >>>>>>>>> the forum, but it's the approach I used. The post I included earlier >>>>>>>>> was >>>>>>>>> indeed about just ensuring a specific order was enforced in the js >>>>>>>>> >>>>>>>> includes >>>>>>>> >>>>>>>>> for the ClientInfrastructure, but I have used a variation on it to >>>>>>>>> >>>>>>> include >>>>>>> >>>>>>>>> my local version of blackbird.js, rather than the one that comes with >>>>>>>>> T5.1.0.5. The code is as follows: >>>>>>>>> >>>>>>>>> AppModule.java: >>>>>>>>> public ClientInfrastructure >>>>>>>>> decorateClientInfrastructure(ClientInfrastructure original, >>>>>>>>> @InjectService("AssetSource") AssetSource assetSource) { >>>>>>>>> return new MyClientInfrastructure(original, assetSource); >>>>>>>>> } >>>>>>>>> >>>>>>>>> >>>>>>>>> MyClientInfrastructure.java: >>>>>>>>> public class MyClientInfrastructure implements ClientInfrastructure { >>>>>>>>> >>>>>>>>> @Inject >>>>>>>>> AssetSource assetSource; >>>>>>>>> ClientInfrastructure clientInfrastructure; >>>>>>>>> List javascriptStack = new ArrayList(); >>>>>>>>> @SuppressWarnings("unchecked") >>>>>>>>> public MyClientInfrastructure(ClientInfrastructure >>>>>>>>> clientInfrastructure, AssetSource assetSource) { >>>>>>>>> this.assetSource = assetSource; >>>>>>>>> this.clientInfrastructure = clientInfrastructure; >>>>>>>>> // Add jQuery assets in ahead of Prototype - IE8 was burping >>>>>>>>> otherwise, despite jQuery.noConflict being set >>>>>>>>> javascriptStack.add(assetSource.getAsset(null, >>>>>>>>> "context:/scripts/jquery-1.4.2.min.js", null)); >>>>>>>>> javascriptStack.add(assetSource.getAsset(null, >>>>>>>>> "context:/scripts/jquery-ui-1.8.1.custom.min.js", null)); >>>>>>>>> >>>>>>>>> List assets = this.clientInfrastructure.getJavascriptStack(); >>>>>>>>> for (Iterator i = assets.iterator(); i.hasNext();) { >>>>>>>>> Asset asset = (Asset) i.next(); >>>>>>>>> if (!asset.toString().contains("blackbird.js")) { >>>>>>>>> javascriptStack.add(asset); >>>>>>>>> } else { >>>>>>>>> javascriptStack.add(assetSource.getAsset(null, >>>>>>>>> "context:/scripts/blackbird_1_0/blackbird.js", null)); >>>>>>>>> } >>>>>>>>> } >>>>>>>>> } >>>>>>>>> >>>>>>>>> public List<Asset> getJavascriptStack() { >>>>>>>>> //return clientInfrastructure.getJavascriptStack(); >>>>>>>>> return javascriptStack; >>>>>>>>> } >>>>>>>>> >>>>>>>>> public List<Asset> getStylesheetStack() { >>>>>>>>> return clientInfrastructure.getStylesheetStack(); >>>>>>>>> } >>>>>>>>> } >>>>>>>>> >>>>>>>>> I have my local blackbird.js physically located in the project under >>>>>>>>> src\main\webapp\scripts\blackbird_1_0\blackbird.js. >>>>>>>>> >>>>>>>>> Obviously the jQuery ordering is not relevant to your specific >>>>>>>>> problem, >>>>>>>>> >>>>>>>> just >>>>>>>> >>>>>>>>> the replacement of blackbird.js is. Probably could be more >>>>>>>>> elegant/efficient, but it's just called once at startup so I wasn't >>>>>>>>> too >>>>>>>>> concerned about it. >>>>>>>>> >>>>>>>>> Hope this get things working for you <and I don't get chewed by the >>>>>>>>> more >>>>>>>>> enlightened forum members!>. >>>>>>>>> >>>>>>>>> Regards, >>>>>>>>> Jim. >>>>>>>>> >>>>>>>>>> -----Original Message----- >>>>>>>>>> From: Rich [mailto:rich...@moremagic.com] Sent: 20 July 2010 17:25 >>>>>>>>>> To: users@tapestry.apache.org >>>>>>>>>> Subject: blackbird.js and IE breaking fixed CSS background image >>>>>>>>>> >>>>>>>>>> Hi, >>>>>>>>>> >>>>>>>>>> I'm aware blackbird.js is not directly Tapestry code, but I'm >>>>>>>>>> looking for advice on how to handle an issue with the blackbird.js >>>>>>>>>> file. I had been having problems with getting the fixed background >>>>>>>>>> image in my tapestry webapp to stay fixed in Internet Explorer. I'd >>>>>>>>>> given up searching for a solution (it appeared to be beyond the CSS >>>>>>>>>> I was using) until someone recently pointed out that a line of code >>>>>>>>>> in blackbird.js breaks the fixed background for IE. >>>>>>>>>> >>>>>>>>>> I went and re-jared the tapestry-core with the line of code >>>>>>>>>> commented out and it now works in internet explorer. However, having >>>>>>>>>> to manage my own version of the tapestry-core jar to fix an IE bug >>>>>>>>>> does not seem like >>>>>>>>>> >>>>>>> >>>>>>>>>> a good idea. Is there a way to exclude blackbird from my projects >>>>>>>>>> all together? Or maybe there is some other, better solution? >>>>>>>>>> >>>>>>>>>> Regards, >>>>>>>>>> Rich >>>>>>>>>> >>>>>>>>>> >>>>>>>> --------------------------------------------------------------------- >>>>>>>> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org >>>>>>>> For additional commands, e-mail: users-h...@tapestry.apache.org >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> --------------------------------------------------------------------- >>>>>>>> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org >>>>>>>> For additional commands, e-mail: users-h...@tapestry.apache.org >>>>>>>> >>>>>>>> >>>>>>> --------------------------------------------------------------------- >>>>>>> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org >>>>>>> For additional commands, e-mail: users-h...@tapestry.apache.org >>>>>>> >>>>>>> >>>>>>> >>>>>>> --------------------------------------------------------------------- >>>>>>> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org >>>>>>> For additional commands, e-mail: users-h...@tapestry.apache.org >>>>>>> >>>>>>> >>>>>> --------------------------------------------------------------------- >>>>>> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org >>>>>> For additional commands, e-mail: users-h...@tapestry.apache.org >>>>>> >>>>> --------------------------------------------------------------------- >>>>> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org >>>>> For additional commands, e-mail: users-h...@tapestry.apache.org >>>>> >>>>> >>>> --------------------------------------------------------------------- >>>> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org >>>> For additional commands, e-mail: users-h...@tapestry.apache.org >>>> >>>> >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org >>> For additional commands, e-mail: users-h...@tapestry.apache.org >>> >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org >> For additional commands, e-mail: users-h...@tapestry.apache.org >> >> > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org > For additional commands, e-mail: users-h...@tapestry.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org For additional commands, e-mail: users-h...@tapestry.apache.org