I just had to do it the next day at work. As in the previous answer, you just need to add the linker. Here is an example of one that creates a manifest file for a Safari user agent based on a template file.
// 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(); } } }
source share