Created
October 4, 2012 08:36
-
-
Save warmuuh/3832272 to your computer and use it in GitHub Desktop.
resource editing filter
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
package wrm.web.filter; | |
import java.io.BufferedReader; | |
import java.io.ByteArrayOutputStream; | |
import java.io.IOException; | |
import java.io.InputStream; | |
import java.io.InputStreamReader; | |
import java.io.OutputStreamWriter; | |
import java.io.PrintWriter; | |
import java.util.HashMap; | |
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.HttpServletRequestWrapper; | |
import javax.servlet.http.HttpServletResponse; | |
import javax.servlet.http.HttpServletResponseWrapper; | |
/** | |
* Servlet Filter implementation class ResourceFilter | |
*/ | |
public class ResourceFilter implements Filter { | |
HashMap<String, String> cache = new HashMap<String, String>(); | |
HashMap<String, String> resType = new HashMap<String, String>(); | |
/** | |
* Default constructor. | |
*/ | |
public ResourceFilter() { | |
// TODO Auto-generated constructor stub | |
} | |
/** | |
* @see Filter#destroy() | |
*/ | |
public void destroy() { | |
// TODO Auto-generated method stub | |
} | |
/** | |
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) | |
*/ | |
public void doFilter(ServletRequest request, ServletResponse response, | |
FilterChain chain) throws IOException, ServletException { | |
// rewrite it to normal url: | |
HttpServletRequest req = (HttpServletRequest) request; | |
HttpServletRequest reqWrapper = new HttpServletRequestWrapper(req) { | |
@Override | |
public String getHeader(String name) { | |
if (name.equals("If-None-Match")) // disable caching | |
return null; | |
return super.getHeader(name); | |
} | |
@Override | |
public long getDateHeader(String name) { | |
if (name.equals("If-Modified-Since")) | |
return -1; | |
return super.getDateHeader(name); | |
} | |
}; | |
String url = req.getRequestURI(); | |
if (req.getMethod().equals("POST") | |
&& "overwrite".equals(req.getQueryString())) { | |
// String content = readAll(req.getReader()); | |
String content = req.getParameter("content"); | |
cache.put(url, content); | |
((HttpServletResponse) response).sendRedirect(url + "?edit"); | |
return; | |
} | |
final ByteArrayOutputStream baos = new ByteArrayOutputStream(); | |
final PrintWriter w = new PrintWriter(new OutputStreamWriter(baos, | |
"UTF-8")); | |
HttpServletResponse httpRes = (HttpServletResponse) response; | |
HttpServletResponse resWrapper = new HttpServletResponseWrapper(httpRes) { | |
@Override | |
public ServletOutputStream getOutputStream() throws IOException { | |
return new ServletOutputStream() { | |
@Override | |
public void write(int b) throws IOException { | |
baos.write(b); | |
} | |
}; | |
} | |
@Override | |
public PrintWriter getWriter() throws IOException { | |
return w; | |
} | |
@Override | |
public void setContentLength(int len) { | |
// super.setContentLength(len); | |
} | |
@Override | |
public void setStatus(int sc) { | |
// TODO Auto-generated method stub | |
// super.setStatus(sc); | |
} | |
}; | |
if (cache.containsKey(url)) { | |
System.out.println("Providing cache-edited version of " + url); | |
ServletResponse outRes = "edit".equals(req.getQueryString()) ? resWrapper : response; | |
outRes.getWriter().write(cache.get(url)); | |
if (resType.containsKey(url)) | |
httpRes.setContentType(resType.get(url)); | |
} else | |
{ | |
// pass the request along the filter chain | |
chain.doFilter(reqWrapper, "edit".equals(req.getQueryString()) ? resWrapper : response); | |
resType.put(url, httpRes.getContentType()); | |
} | |
w.flush(); | |
if ("edit".equals(req.getQueryString())) { | |
// load template | |
InputStream stream = getClass().getResourceAsStream( | |
"/wrm/web/filter/template.html"); | |
if (stream == null) { | |
throw new ServletException("Cannot find template"); | |
} | |
String template = convertStreamToString(stream); | |
template = simpleformat(template, url + "?overwrite", | |
baos.toString(), getMode(url), getEditedList()); | |
response.getWriter().write(template); | |
httpRes.setContentType("text/html"); | |
} | |
// else | |
// response.getWriter().write(baos.toString()); | |
httpRes.setStatus(200); | |
httpRes.flushBuffer(); | |
} | |
private String getEditedList() { | |
String list = ""; | |
for (String uri : cache.keySet()) | |
list += "<option>" + uri + "</option>\n"; | |
return list; | |
} | |
private String getMode(String url) { | |
if (url.endsWith(".js")) | |
return "javascript"; | |
if (url.endsWith("html")) // xhtml, html | |
return "html"; | |
if (url.endsWith("xml")) // xhtml, html | |
return "xml"; | |
if (url.endsWith("css")) | |
return "css"; | |
return "plain"; | |
} | |
private String simpleformat(String template, String... args) { | |
for (int i = 0; i < args.length; ++i) { | |
template = template.replace("{" + i + "}", args[i]); | |
} | |
return template; | |
} | |
private String readAll(BufferedReader reader) { | |
StringBuffer buf = new StringBuffer(); | |
String currentLine = null; | |
try { | |
while ((currentLine = reader.readLine()) != null) { | |
buf.append(currentLine + "\n"); | |
} | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
return buf.toString(); | |
} | |
/** | |
* @see Filter#init(FilterConfig) | |
*/ | |
public void init(FilterConfig fConfig) throws ServletException { | |
// TODO Auto-generated method stub | |
} | |
public static String convertStreamToString(InputStream is) { | |
BufferedReader reader = new BufferedReader(new InputStreamReader(is)); | |
StringBuilder sb = new StringBuilder(); | |
String line = null; | |
try { | |
while ((line = reader.readLine()) != null) { | |
sb.append(line + "\n"); | |
} | |
is.close(); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
return sb.toString(); | |
} | |
} |
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
<html lang="en"> | |
<head> | |
<title>Cache Resource Editor</title> | |
<style type="text/css" media="screen"> | |
#editor { | |
position: absolute; | |
top: 25px; | |
bottom: 0; | |
right: 0; | |
left: 0; | |
} | |
#send{ | |
position: absolute; | |
top: 0; | |
left: 0; | |
} | |
#content { | |
display:none; | |
} | |
</style> | |
</head> | |
<body> | |
<div id="editor"></div> | |
<div id="send"> | |
<form id="form" action="{0}" method="post"> | |
<button | |
onclick="save()">Send</button> | |
Cache Resource Editor by wrm | |
<span style="width:100px;display:inline-block"> </span> | |
Edited:<select id="edits" name="edits" size="1" onchange="window.location.href=this.options[this.selectedIndex].value + '?edit'"> | |
<option>Jump to</option> | |
{3} | |
</select> | |
<textarea id="content" name="content" >{1}</textarea> | |
</form> | |
</div> | |
<script src="http://d1n0x3qji82z53.cloudfront.net/src-min-noconflict/ace.js" type="text/javascript" charset="utf-8"></script> | |
<script> | |
function save(){ | |
document.getElementById('content').value = editor.getValue(); | |
document.forms[0].submit(); | |
}; | |
editor = ace.edit("editor"); | |
editor.commands.addCommand({ | |
name: 'save', | |
bindKey: {win: 'Ctrl-S', mac: 'Command-S'}, | |
exec: function(editor) { | |
save(); | |
} | |
}); | |
editor.setTheme("ace/theme/monokai"); | |
editor.getSession().setValue(document.getElementById("content").value); | |
editor.getSession().setMode("ace/mode/{2}"); | |
</script> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment