私が最終的に行ったことは、もう少し調査した結果、マニフェスト参照をホスト ページに追加する代わりに、すべての順列スクリプトに追加できることがわかりました。マニフェスト自体は、一般的な (そして実質的に空の) ファイルにすることができます。
作成者はマニフェストにもメイン ページを含めることをお勧めしますが、実際には、明示的に言及されていなくても、マニフェストを参照したページは自動的にキャッシュされます。(ソース)
したがって、私は簡単に次のように書きましたLinker
。
- オフライン マニフェスト ファイルを作成します
- すべての順列スクリプト
manifest
のタグに属性を追加します ( )。<html>
*.cache.html
Linker
が呼び出され、ManifestLinker
かなり単純です。
package com.example.linker;
// Imports
@LinkerOrder(Order.POST)
public class ManifestLinker extends AbstractLinker {
private static final String MANIFEST_FILE = "manifest.nocache.appcache";
private static final String HTML_FIND = "<html>";
private static final String HTML_REPLACE = "<html manifest=\"" + MANIFEST_FILE + "\">";
/* (non-Javadoc)
* @see com.google.gwt.core.ext.Linker#getDescription()
*/
@Override
public String getDescription() {
return "`Manifest Linker`: Adds AppCache support for static `.cache.html` resources.";
}
@Override
public ArtifactSet link(TreeLogger logger, LinkerContext context, ArtifactSet artifacts) throws UnableToCompleteException {
ArtifactSet output = new ArtifactSet(artifacts);
output.add(buildManifest(logger));
for (EmittedArtifact artifact : artifacts.find(EmittedArtifact.class)) {
if (artifact.getVisibility() == Visibility.Public && artifact.getPartialPath().endsWith(".cache.html")) {
logger.log(TreeLogger.TRACE, "Processing file: " + artifact.getPartialPath());
String cacheHtml = Util.readStreamAsString(artifact.getContents(logger));
if (cacheHtml.startsWith(HTML_FIND)) {
cacheHtml = HTML_REPLACE + cacheHtml.substring(HTML_FIND.length()); // Replace `<html>` tag.
output.replace(copyArtifact(logger, artifact, cacheHtml));
}
}
}
logger.log(TreeLogger.INFO, "Manifest created and linked successfully.");
return output;
}
private EmittedArtifact copyArtifact(TreeLogger logger, EmittedArtifact original, String contents) throws UnableToCompleteException {
EmittedArtifact copy = emitString(logger, contents, original.getPartialPath());
copy.setVisibility(original.getVisibility());
return copy;
}
private EmittedArtifact buildManifest(TreeLogger logger) throws UnableToCompleteException {
StringBuilder builder = new StringBuilder();
builder.append("CACHE MANIFEST\n")
.append("# Generated by ")
.append(getClass().getSimpleName())
.append(": ")
.append(System.currentTimeMillis())
.append(".\n\n")
.append("NETWORK:\n")
.append("*\n");
SyntheticArtifact manifest = emitString(logger, builder.toString(), MANIFEST_FILE);
return manifest;
}
}
私の<module>.gwt.xml
ファイルでは、リンカーを定義して追加します。
<?xml version="1.0" encoding="UTF-8"?>
<module>
...
<define-linker name="manifest" class="com.example.linker.ManifestLinker" />
<add-linker name="manifest" />
...
また、 my を介して適切なコンテンツ タイプが設定されていることを確認しますweb.xml
。
...
<mime-mapping>
<extension>appcache</extension>
<mime-type>text/cache-manifest</mime-type>
</mime-mapping>
...
放出されるmanifest.nocache.appcache
ものも単純です:
CACHE MANIFEST
# Generated by ManifestLinker: 1366702621298.
NETWORK:
*