Hi, I am a newbie in GWT. I have tried extending the SelectionScriptLinker class to apply stylesheet based on some condition. But after successful compilation of the code, when I run the main html file it appears to go in infinite loop. The browser keeps on trying opening the html, but it could not open it. Following is my code:
--------------------------------------------------------------------------------------------------------------------------------------------------------------- @LinkerOrder(LinkerOrder.Order.PRIMARY) public class StyleSheetLinker extends SelectionScriptLinker { @Override protected String generateStylesheetInjector(String stylesheetUrl) { if (stylesheetUrl.endsWith("styles1.css")) { System.out.println("Using different style styles2.css"); stylesheetUrl = "styles2.css"; } String hrefExpr = "'" + stylesheetUrl + "'"; if (isRelativeURL(stylesheetUrl)) { hrefExpr = "base + " + hrefExpr; } return "if (!__gwt_stylesLoaded['" + stylesheetUrl + "']) {\n " + " var l = $doc.createElement('link'); \n " + " __gwt_stylesLoaded['" + stylesheetUrl + "'] = l;\n " + " l.setAttribute('rel', 'stylesheet'); \n " + " l.setAttribute('href', " + hrefExpr + ");\n " + " $doc.getElementsByTagName('head')[0].appendChild(l); \n " + "}\n"; } @Override public ArtifactSet link(TreeLogger logger, LinkerContext context, ArtifactSet artifacts) throws UnableToCompleteException { ArtifactSet toReturn = new ArtifactSet(artifacts); for (CompilationResult compilation : toReturn .find(CompilationResult.class)) { System.out.println("calling doEmitCompilation"); toReturn.add(doEmitCompilation(logger, context, compilation)); } toReturn.add(emitSelectionScript(logger, context, artifacts)); return toReturn; } @Override protected EmittedArtifact emitSelectionScript(TreeLogger logger, LinkerContext context, ArtifactSet artifacts) throws UnableToCompleteException { DefaultTextOutput out = new DefaultTextOutput(true); // Emit the selection script in a function closure. out.print("(function () {"); out.newlineOpt(); String bootstrap = generateSelectionScript(logger, context, artifacts); bootstrap = context.optimizeJavaScript(logger, bootstrap); out.print(bootstrap); out.print("})();"); out.newlineOpt(); byte[] selectionScriptBytes = Util.getBytes(out.toString()); return emitBytes(logger, selectionScriptBytes, context.getModuleName () + ".nocache.js"); } @Override protected String generateSelectionScript(TreeLogger logger, LinkerContext context, ArtifactSet artifacts) throws UnableToCompleteException { StringBuffer selectionScript; try { selectionScript = new StringBuffer(Utility .getFileFromClassPath(getSelectionScriptTemplate(logger, context))); } catch (IOException e) { logger.log(TreeLogger.ERROR, "Unable to read selection script template", e); throw new UnableToCompleteException(); } replaceAll(selectionScript, "__MODULE_FUNC__", context .getModuleFunctionName()); replaceAll(selectionScript, "__MODULE_NAME__", context.getModuleName ()); int startPos; // Add external dependencies startPos = selectionScript.indexOf("// __MODULE_STYLES_END__"); if (startPos != -1) { for (StylesheetReference resource : artifacts .find(StylesheetReference.class)) { String text = generateStylesheetInjector(resource.getSrc()); //System.out.println("StylesheetInjector\n"+text); selectionScript.insert(startPos, text); startPos += text.length(); } } startPos = selectionScript.indexOf("// __MODULE_SCRIPTS_END__"); if (startPos != -1) { for (ScriptReference resource : artifacts .find(ScriptReference.class)) { String text = generateScriptInjector(resource.getSrc()); selectionScript.insert(startPos, text); startPos += text.length(); } } // Add property providers startPos = selectionScript.indexOf("// __PROPERTIES_END__"); if (startPos != -1) { for (SelectionProperty p : context.getProperties()) { String text = generatePropertyProvider(p); selectionScript.insert(startPos, text); startPos += text.length(); } } // Possibly add permutations SortedSet<CompilationResult> compilations = artifacts .find(CompilationResult.class); startPos = selectionScript.indexOf("// __PERMUTATIONS_END__"); if (startPos != -1) { StringBuffer text = new StringBuffer(); if (compilations.size() == 0) { // We'll see this when running in Hosted Mode. The way the // selection // templates are structured is such that this line won't be // executed text.append("strongName = null;"); } else if (compilations.size() == 1) { // Just one distinct compilation; no need to evaluate properties Iterator<CompilationResult> iter = compilations.iterator(); CompilationResult result = iter.next(); text.append("strongName = null;"); // + compilationPartialPaths.get(result) + "';"); } else { for (CompilationResult r : compilations) { for (Map<SelectionProperty, String> propertyMap : r .getPropertyMap()) { // unflatten([v1, v2, v3], 'strongName'); text.append("unflattenKeylistIntoAnswers(["); boolean needsComma = false; for (SelectionProperty p : context.getProperties()) { if (!propertyMap.containsKey(p)) { continue; } if (needsComma) { text.append(","); } else { needsComma = true; } text.append("'" + propertyMap.get(p) + "'"); } text.append("], '").append("');\n"); } } // strongName = answers[compute('p1')][compute('p2')]; text.append("strongName = answers["); boolean needsIndexMarkers = false; for (SelectionProperty p : context.getProperties()) { if (p.tryGetValue() != null) { continue; } if (needsIndexMarkers) { text.append("]["); } else { needsIndexMarkers = true; } text.append("computePropValue('" + p.getName() + "')"); } text.append("];"); } selectionScript.insert(startPos, text); } return selectionScript.toString(); } @Override protected String getCompilationExtension(TreeLogger logger, LinkerContext context) throws UnableToCompleteException { return ".cache.html"; } @Override protected String getModulePrefix(TreeLogger logger, LinkerContext context) throws UnableToCompleteException { DefaultTextOutput out = new DefaultTextOutput(context.isOutputCompact ()); out.print("<!-- Nothing to print -->"); //out.newlineOpt(); /*// Setup the well-known variables. out.print("<head><script>"); out.newlineOpt(); out.print("var $gwt_version = \"" + About.GWT_VERSION_NUM + "\";"); out.newlineOpt(); out.print("var $wnd = parent;"); out.newlineOpt(); out.print("var $doc = $wnd.document;"); out.newlineOpt(); out.print("var $moduleName, $moduleBase;"); out.newlineOpt(); if (supportRunAsync) { out.print("function __gwtStartLoadingFragment(frag) {"); out.newlineOpt(); out.indentIn(); out.print(" var script = document.createElement('script');"); out.newlineOpt(); out.print(" script.src = '" + FRAGMENT_SUBDIR + "/" + strongName + "/' + frag + '" + FRAGMENT_EXTENSION + "';"); out .print(" document.getElementsByTagName('head').item (0).appendChild(script);"); out.indentOut(); out.newlineOpt(); out.print("};"); out.newlineOpt(); } out .print("var $stats = $wnd.__gwtStatsEvent ? function(a) {return $wnd.__gwtStatsEvent(a);} : null;"); out.newlineOpt(); out.print("$stats && $stats({moduleName:'" + context.getModuleName() + "',subSystem:'startup',evtGroup:'moduleStartup'" + ",millis:(new Date()).getTime(),type:'moduleEvalStart'});"); out.newlineOpt(); out.print("</script></head>"); out.newlineOpt(); out.print("<body>"); out.newlineOpt(); // Begin a script block inside the body. It's commented out so that the // browser won't mistake strings containing "<script>" for actual // script. out.print("<script><!--"); */ out.newline(); return out.toString(); } @Override protected String getModuleSuffix(TreeLogger logger, LinkerContext context) throws UnableToCompleteException { DefaultTextOutput out = new DefaultTextOutput(context.isOutputCompact ()); /*out.print("$stats && $stats({moduleName:'" + context.getModuleName () + "',subSystem:'startup',evtGroup:'moduleStartup'" + ",millis:(new Date()).getTime(),type:'moduleEvalEnd'});"); // Generate the call to tell the bootstrap code that we're ready to go. out.newlineOpt(); out.print("if ($wnd." + context.getModuleFunctionName() + ") $wnd." + context.getModuleFunctionName() + ".onScriptLoad();"); out.newline(); out.print("--></script></body></html>"); out.newlineOpt();*/ out.print("<!-- Nothing to print -->"); return out.toString(); } @Override protected String getSelectionScriptTemplate(TreeLogger logger, LinkerContext context) throws UnableToCompleteException { return "com/google/gwt/core/ext/linker/impl/HostedModeTemplate.js"; } @Override public String getDescription() { // TODO Auto-generated method stub return "StyleSheet"; } } ------------------------------------------------------------------------------------------------------------------------------------------------------------- I am able to see the script file name changed to styles2.css in the generated nocache.js file. Also this linker class has no affect on hosted mode. (?) Please clear my doubts and let me know what needs to be done to achieve the desired functionality. Regards, Kamlesh --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group. To post to this group, send email to Google-Web-Toolkit@googlegroups.com To unsubscribe from this group, send email to google-web-toolkit+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/Google-Web-Toolkit?hl=en -~----------~----~----~----~------~----~------~--~---