Created
April 25, 2011 18:51
-
-
Save paykroyd/940998 to your computer and use it in GitHub Desktop.
GWT Cache Manifest Linker
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // Specify the LinkerOrder as Post... this does not replace the regular GWT linker and runs after it. | |
| @LinkerOrder(LinkerOrder.Order.POST) | |
| public class GwtAppCacheLinker extends AbstractLinker { | |
| public String getDescription() { | |
| return "to create an HTML5 application cache manifest JSP template."; | |
| } | |
| public ArtifactSet link(TreeLogger logger, LinkerContext context, ArtifactSet artifacts) throws UnableToCompleteException { | |
| ArtifactSet newArtifacts = new ArtifactSet(artifacts); | |
| // search through each of the compilation results to find the one for Safari. Then | |
| // generate application cache for that file | |
| for (CompilationResult compilationResult : artifacts.find(CompilationResult.class)) { | |
| // Only emit the safari version | |
| for (SelectionProperty property : context.getProperties()) { | |
| if (property.getName().equals("user.agent")) { | |
| String value = property.tryGetValue(); | |
| // we only care about the Safari user agent in this case | |
| if (value != null && value.equals("safari")) { | |
| newArtifacts.add(createCache(logger, context, compilationResult)); | |
| break; | |
| } | |
| } | |
| } | |
| } | |
| return newArtifacts; | |
| } | |
| private SyntheticArtifact createCache(TreeLogger logger, LinkerContext context, CompilationResult result) | |
| throws UnableToCompleteException { | |
| try { | |
| logger.log(TreeLogger.Type.INFO, "Using the Safari user agent for the manifest file."); | |
| // load a template JSP file into a string. This contains all of the files that we want in our cache | |
| // manifest and a placeholder for the GWT javascript file, which will replace with the actual file next | |
| String manifest = IOUtils.toString(getClass().getResourceAsStream("cache.template.manifest")); | |
| // replace the placeholder with the real file name | |
| manifest = manifest.replace("$SAFARI_HTML_FILE_CHECKSUM$", result.getStrongName()); | |
| // return the Artifact named as the file we want to call it | |
| return emitString(logger, manifest, "cache.manifest."); | |
| } catch (IOException e) { | |
| logger.log(TreeLogger.ERROR, "Couldn't read cache manifest template.", e); | |
| throw new UnableToCompleteException(); | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment