package com.alu.gwt.server;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileFilter;
import java.io.FileReader;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class GearManifestFilter implements Filter {
public static final String EXTENSIONS = "extensions";
public static final String MANIFEST_VERSION = "manifestVersion";
public static final String OPERA_PATTERN = "'opera'],";
public static final String SAFARI_PATTERN = "'safari'],";
public static final String GECKO1_8_PATTERN = "'gecko1_8'],";
public static final String GECKO_PATTERN = "'gecko'],";
public static final String IE6_PATTERN = "'ie6'],";
public static final String OPERA = "opera";
public static final String SAFARI = "safari";
public static final String GECKO1_8 = "gecko1_8";
public static final String GECKO = "gecko";
public static final String IE6 = "ie6";
protected String _operaCacheFilename;
protected String _safariCacheFilename;
protected String _gecko1_8CacheFilename;
protected String _geckoCacheFilename;
protected String _ie6CacheFilename;
protected String _extensions;
protected String _manifestVersion = "1.0";
protected Map _manifestMap = new HashMap();
public static class GearRegexpFilenameFilter implements FilenameFilter {
private String _regexpFilter;
private Pattern _regexpPattern;
GearRegexpFilenameFilter(String regexpFilter) {
_regexpFilter = regexpFilter;
_regexpPattern = Pattern.compile(_regexpFilter);
}
public boolean accept(File dir, String name) {
if ((name.indexOf(".cache.") == -1) &&
(name.indexOf("-xs.nocache.") == -1)) {
Matcher matcher = _regexpPattern.matcher(name);
return matcher.find();
} else
return false;
}
}
public static class GearResourcesExplorer {
List _result = new ArrayList();
public GearResourcesExplorer() {
}
public List list(File directory, FilenameFilter filter,
boolean recursive, boolean root) {
if (recursive) {
File[] dirs = directory.listFiles(new FileFilter() {
public boolean accept(File pathname) {
if (pathname.isDirectory())
return true;
return false;
}
});
for (int i=0; i < dirs.length; i++)
list(dirs[i], filter, recursive, false);
}
String[] res = directory.list(filter);
for (int i = 0; i < res.length; i++) {
if (root) {
_result.add(res[i]);
} else {
_result.add(directory.getName() + File.separator + res[i]);
}
}
return _result;
}
}
public GearManifestFilter() {
}
public void init(FilterConfig filterConfig) {
_extensions = filterConfig.getInitParameter(EXTENSIONS);
_manifestVersion = filterConfig.getInitParameter(MANIFEST_VERSION);
System.out.println("Extensions: " + _extensions);
String realPath = filterConfig.getServletContext().getRealPath("/");
System.out.println("Path:" + realPath);
File dir = new File(realPath);
List resourceFilenames = new GearResourcesExplorer().list(dir, new GearRegexpFilenameFilter(_extensions), true, true);
for (int i = 0; i < resourceFilenames.size(); i++) {
System.out.println("File: " + resourceFilenames.get(i));
}
FilenameFilter noCacheFilter = new FilenameFilter() {
public boolean accept(File dir, String name) {
if (name.endsWith(".nocache.js") &&
!name.endsWith("-xs.nocache.js"))
return true;
return false;
}
};
String[] noCacheFilenames = dir.list(noCacheFilter);
if (noCacheFilenames.length != 1) {
System.out.println("Error !!");
} else {
getResourcesAccordingUserAgent(realPath + noCacheFilenames[0]);
}
_manifestMap.put(SAFARI,
createManifest(_safariCacheFilename, _manifestVersion,
resourceFilenames));
_manifestMap.put(GECKO,
createManifest(_geckoCacheFilename, _manifestVersion,
resourceFilenames));
_manifestMap.put(GECKO1_8,
createManifest(_gecko1_8CacheFilename, _manifestVersion,
resourceFilenames));
_manifestMap.put(OPERA,
createManifest(_operaCacheFilename, _manifestVersion,
resourceFilenames));
_manifestMap.put(IE6,
createManifest(_ie6CacheFilename, _manifestVersion,
resourceFilenames));
}
protected void getResourcesAccordingUserAgent(String noCacheFilename) {
System.out.println(noCacheFilename);
BufferedReader in = null;
StringBuffer buffer = new StringBuffer();
try {
in = new BufferedReader(new FileReader(noCacheFilename));
String currentLine;
while ((currentLine = in.readLine()) != null) {
buffer.append(currentLine);
}
in.close();
} catch (IOException e) {
System.out.println("Error");
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
_operaCacheFilename = getFilename(buffer, OPERA_PATTERN);
_geckoCacheFilename = getFilename(buffer, GECKO_PATTERN);
_gecko1_8CacheFilename = getFilename(buffer, GECKO1_8_PATTERN);
_safariCacheFilename = getFilename(buffer, SAFARI_PATTERN);
_ie6CacheFilename = getFilename(buffer, IE6_PATTERN);
System.out.println("OperaFilename: " + _operaCacheFilename);
System.out.println("GeckoFilename: " + _geckoCacheFilename);
System.out.println("Gecko1_8Filename: " + _gecko1_8CacheFilename);
System.out.println("SafariFilename: " + _safariCacheFilename);
System.out.println("IE6Filename: " + _ie6CacheFilename);
}
protected String getFilename(StringBuffer noCacheStringBuffer,
String agentPattern) {
String noCacheString = noCacheStringBuffer.toString();
int beginIndex =
noCacheString.indexOf(agentPattern) + agentPattern.length() + 1;
int endIndex = noCacheString.indexOf("'", beginIndex);
String filename = noCacheString.substring(beginIndex, endIndex);
return filename;
}
protected String createManifest(String userAgentHash, String version,
List resourceFilenames) {
StringBuffer manifestBuffer = new StringBuffer("{\n");
manifestBuffer.append("\"betaManifestVersion\": 1,\n");
manifestBuffer.append("\"version\": \"");
manifestBuffer.append(version);
manifestBuffer.append("\",\n");
manifestBuffer.append("\"entries\": [\n");
manifestBuffer.append("{ \"url\": \"");
manifestBuffer.append(userAgentHash + ".cache.js\"");
manifestBuffer.append("},\n");
manifestBuffer.append("{ \"url\": \"");
manifestBuffer.append(userAgentHash + ".cache.html\"");
manifestBuffer.append("},\n");
for (int i = 0; i < resourceFilenames.size() - 1; i++) {
manifestBuffer.append("{ \"url\": \"");
manifestBuffer.append(resourceFilenames.get(i));
manifestBuffer.append("\"},\n");
}
manifestBuffer.append("{ \"url\": \"");
manifestBuffer.append(resourceFilenames.get(resourceFilenames.size() - 1));
manifestBuffer.append("\"}\n");
manifestBuffer.append("]\n");
manifestBuffer.append("}\n");
System.out.println("Manifest: " + manifestBuffer.toString());
return manifestBuffer.toString();
}
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse,
FilterChain filterChain) throws IOException,
ServletException {
HttpServletRequest request = ((HttpServletRequest)servletRequest);
String userAgentString = request.getHeader("user-agent");
System.out.println("UserAgent: " + userAgentString);
String userAgent = getUserAgent(userAgentString);
ServletOutputStream out = servletResponse.getOutputStream();
HttpServletResponse response = (HttpServletResponse)servletResponse;
response.setContentType("application/jsonrequest");
out.println((String)_manifestMap.get(userAgent));
}
protected String getUserAgent(String userAgentString) {
if (userAgentString.indexOf("IE6") != -1 ||
userAgentString.indexOf("MSIE 7") != -1) {
System.out.println("IE6 or more detected");
return IE6;
} else if (userAgentString.indexOf("MOZILLA") != -1) {
System.out.println("MOZILLA detected");
return GECKO;
} else if (userAgentString.indexOf("MOZILLA") != -1) {
System.out.println("MOZILLA detected");
return IE6;
}
return SAFARI;
}
public void destroy() {
}
}