I'm not able to view the changes to BrowserSpecificFeatureResource.java. The review tool is displaying "error: old chunk mismatch." Do you see the same thing? http://codereview.appspot.com/143046/diff/1/36
On Tue, Oct 27, 2009 at 5:59 PM, <[email protected]> wrote: > Reviewers: shindig.remailer_gmail.com, jasvir, Jon Weygandt, > > Description: > The feature.xml and JS system has served us well, yet various new > requirements/requests have arisen that have stressed the current > implementation. Among them: > * Ability to cleanly represent "code" features and "JS" features in a > dependency tree w/ one another. This allows, for instance, a clean way > for "opensocial" to depend on "security-token" (not yet introduced), > which in turn depends on "locked-domain" to ensure token security. > * Ability to let a gadget opt out of all "core" JavaScript, instead only > including sub-components that are used, to shrink render size. > * Ability to serve JS in a context-sensitive fashion ie. > browser-specific code. > * Ability to serve JS in a feature-sensitive fashion ie. only inject > certain code when feature="caja" is enabled/active. > * Ability in development mode to easily serve JS that changes when edits > are made on it. > > For these and general code-cleanup purposes, I've rewritten the > Feature/JS inclusion implementation as presented in this CL. > > This implementation is functionally 100% backward-compatible with its > predecessor. It is only NOT backward-compatible with existing extensions > (outside of Shindig's code base) that override > JsFeatureLoader/GadgetFeatureRegistry. > > With this change, the unit of extension in the features system becomes > the <script ...> line in a feature.xml. The processor for this line is a > FeatureResourceLoader, for which a default implementation is provided. > Each <script> line yields a FeatureResource object, which is in turn > used to resolve content and debugContent by rendering/JS code. > > Other components are overridable/subclassable as well, but to date I've > yet to hear a JS/features extension use case that does not fit in the > ResourceLoader model (or, in the current model with dynamically > register()'ed features). Hopefully that's right. > > An overview of the implementation follows. > > FeatureRegistry > - Replaces GadgetFeatureRegistry and JsFeatureLoader > - Performs both register() and getFeaturesXXX() functions > - Does NOT implicitly include "core*" APIs anymore! These are included > in the dependency tree. @see GadgetSpec for more below. > - register(...) > + Registers one or more features in the system, incorporating them > into the list of known features and building a validated dependency tree > with them. If a circular dependency exists, an error is thrown. > + Method may be called at ANY time -- the registry is not > programmatically locked. This allows (though this use is not tested!) > for dynamic feature injection at some later point. > - getFeatureResources(...) > + Queries the feature tree for resources matching the specified > context (GADGET || CONTAINER), which satisfy all the needed dependencies > given in the query. Optionally, fills in unknown/unsupported features > from the needed list. > - getFeatures(List<String>) > + Returns feature strings in dependency order that satisfy the given > needed features. > > FeatureResourceLoader > - @Injected into FeatureRegistry, main extension point for feature > system. > - Loads a given FeatureResource from a feature.xml <script src="..."/> > line (inline features are handled by FeatureRegistry). > - Key API: load(URI, Map<String,String> attribs) > + URI is pre-resolved to be absolute by FeatureParser (relative to > parent, if a relative URI in feature.xml) > + "attribs" allows for arbitrary context-sensitive extensions. Example > to come soon: limiting by feature="..." to include Caja tamings.js > per-feature only when Caja is available. > > FeatureParser > - Mostly an implementation detail of FeatureRegistry for now > (package-private). > - Parses a String into an intermediary object for further processing. > - Resolves URIs of Resources relative to parent. > > GadgetSpec > - If no feature is explicitly <Optional> or <Require>'d starting with > "core", automatically inserts the "core" feature for backward > compatibility. > - No way (in this CL) to include "absolutely no core" yet. > > Gadget > - Modified how addFeature and removeFeature work. They now manage a > "directlyRequestedDeps" list, which in turn is used by > rendering/processing code for feature resolution. > > RenderingGadgetRewriter > - Update injectFeatureLibraries(...) to use new API. > - Hopefully more straightforward: obtain resources requested by the > gadget, and resources specified externally. Subtract latter from the > former and inline those. Extern the rest. No "core" assumptions, as > "core" will be included by the GadgetSpec if needed. > > Core features > - Break "core" into core.config, core.json, core.prefs et al. > - "core" now an aggregating feature that has no JS of its own but > includes all sub-libs. > > All other features > - Specific assignment of dependencies on core libs. > > Other > - feature.xml updates, pom.xml updates for separated core libs > - test updates across the board for all affected classes > > > Please review this at http://codereview.appspot.com/143046 > > Affected files: > features/pom.xml > features/src/main/javascript/features/analytics/feature.xml > features/src/main/javascript/features/auth-refresh/feature.xml > features/src/main/javascript/features/core.auth/feature.xml > features/src/main/javascript/features/core.config/feature.xml > features/src/main/javascript/features/core.io/feature.xml > features/src/main/javascript/features/core.json/feature.xml > features/src/main/javascript/features/core.legacy/feature.xml > features/src/main/javascript/features/core.log/feature.xml > features/src/main/javascript/features/core.prefs/feature.xml > features/src/main/javascript/features/core.util/feature.xml > features/src/main/javascript/features/core/auth-init.js > features/src/main/javascript/features/core/auth.js > features/src/main/javascript/features/core/config.js > features/src/main/javascript/features/core/core.js > features/src/main/javascript/features/core/feature.xml > features/src/main/javascript/features/core/json.js > features/src/main/javascript/features/core/legacy.js > features/src/main/javascript/features/core/log.js > features/src/main/javascript/features/core/prefs.js > features/src/main/javascript/features/core/util.js > features/src/main/javascript/features/features.txt > features/src/main/javascript/features/flash/feature.xml > features/src/main/javascript/features/i18n/feature.xml > features/src/main/javascript/features/opensocial-0.6/feature.xml > features/src/main/javascript/features/opensocial-current/feature.xml > features/src/main/javascript/features/opensocial-data/feature.xml > features/src/main/javascript/features/opensocial-jsonrpc/feature.xml > features/src/main/javascript/features/opensocial-reference/feature.xml > features/src/main/javascript/features/osapi/feature.xml > features/src/main/javascript/features/rpc/feature.xml > features/src/main/javascript/features/setprefs/feature.xml > features/src/main/javascript/features/skins/feature.xml > features/src/main/javascript/features/views/feature.xml > java/common/src/main/java/org/apache/shindig/common/Pair.java > java/gadgets/src/main/java/org/apache/shindig/gadgets/BrowserSpecificRpcJsFeatureLoader.java > java/gadgets/src/main/java/org/apache/shindig/gadgets/DefaultUrlGenerator.java > java/gadgets/src/main/java/org/apache/shindig/gadgets/Gadget.java > java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetFeature.java > java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetFeatureRegistry.java > java/gadgets/src/main/java/org/apache/shindig/gadgets/JsFeatureLoader.java > java/gadgets/src/main/java/org/apache/shindig/gadgets/JsLibrary.java > java/gadgets/src/main/java/org/apache/shindig/gadgets/features/BrowserSpecificFeatureResource.java > java/gadgets/src/main/java/org/apache/shindig/gadgets/features/FeatureParser.java > java/gadgets/src/main/java/org/apache/shindig/gadgets/features/FeatureRegistry.java > java/gadgets/src/main/java/org/apache/shindig/gadgets/features/FeatureResource.java > java/gadgets/src/main/java/org/apache/shindig/gadgets/features/FeatureResourceLoader.java > java/gadgets/src/main/java/org/apache/shindig/gadgets/process/Processor.java > java/gadgets/src/main/java/org/apache/shindig/gadgets/render/OpenSocialI18NGadgetRewriter.java > java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingGadgetRewriter.java > java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsServlet.java > java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/Feature.java > java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/ModulePrefs.java > java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/Preload.java > java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/tags/FlashTagHandler.java > java/gadgets/src/test/java/org/apache/shindig/gadgets/BrowserSpecificRpcJsFeatureLoaderTest.java > java/gadgets/src/test/java/org/apache/shindig/gadgets/DefaultUrlGeneratorTest.java > java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetFeatureRegistryTest.java > java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetTest.java > java/gadgets/src/test/java/org/apache/shindig/gadgets/HashLockedDomainServiceTest.java > java/gadgets/src/test/java/org/apache/shindig/gadgets/JsFeatureLoaderTest.java > java/gadgets/src/test/java/org/apache/shindig/gadgets/JsLibraryTest.java > java/gadgets/src/test/java/org/apache/shindig/gadgets/features/FeatureParserTest.java > java/gadgets/src/test/java/org/apache/shindig/gadgets/features/FeatureRegistryTest.java > java/gadgets/src/test/java/org/apache/shindig/gadgets/features/FeatureResourceLoaderTest.java > java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingGadgetRewriterTest.java > java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/PipelineDataGadgetRewriterTest.java > java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/TemplateRewriterTest.java > java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/tags/FlashTagHandlerTest.java > > >

