Hey Jon- Interesting where you're going with this one, but IMO the need for this particular Factory pattern calls for a more thorough reworking of the JsLibrary/JsFeatureLoader/GadgetFeature implementation to better accommodate extensions to the feature.xml mechanism.
The main tactical trouble I see with JsLibraryFactory is that its methods are A) largely duplicative (what's the difference between create1 and create2?), B) somewhat unnecessary (create1 needn't have HttpFetcher passed in; that can be @Inject'ed), and C) above all, these are just glorified wrappers for resource loading. The class/interface's raison d'etre isn't clear - what does it do? Loads a JsLibrary? What is a JsLibrary? A sub-resource in a <gadget> or <container> clause in a feature.xml? A full JS-based feature.xml itself? Something else? Much of this is naming, I'll admit, but I guess what I'm getting at goes back to fundamental changes. This discussion, as well as one I've had with Jas regarding Caja's tamings.js inclusion, has inspired me to do a rewrite of the JS feature system I've long wanted to do anyway. I just sent you the relevant CL, but for reference it's here: http://codereview.appspot.com/143046 I'd love to hear your thoughts. I apologize for not getting this out to you sooner; I'll now take a look at the patch you just sent today. Hopefully it will be easy to adapt to the new proposed extension model. Cheers, John On Mon, Oct 19, 2009 at 2:48 PM, <[email protected]> wrote: > For option B there are actually 2 "public/protected static create" > methods, plus some other private/protected methods that could become > protected member methods, If we go the whole way I propose (we could > skip the interface if people like): > > public interface JsLibraryFactory { > > public JsLibrary create(Type type, String content, String feature, > HttpFetcher fetcher) > > public JsLibrary create(String feature, Type type, String content, > String debugContent) > > } > > public class DefaultJsLibraryFactory { > > public JsLibrary create(Type type, String content, String feature, > HttpFetcher fetcher) > > public JsLibrary create(String feature, Type type, String content, > String debugContent) > > protected void loadOptimizedAndDebugData(String content, Type type, > StringBuffer opt, StringBuffer dbg) > > Might even be good to do loadFile, loadResource, loadData, > loadDataFromUrl as protected. > > Looks like someone tried to do these as "protected static" methods. > These cannot be @Overridden, so not sure the full intent of them. > > } > > -- > > This is what we do, and why I'm interested: > > 1) Some of our JS libraries are different from Shindig source by a few > lines. For maintainability we reference the original source and "patch" > the libraries at load time. > > 2) We don't use mvn, so JS minimization is also done a load time. > > 3) For development of features, there is a small hook in the code to > load the libraries dynamically - rather than once. > > > > > http://codereview.appspot.com/135048 >

