Skip to content

Instantly share code, notes, and snippets.

@warmuuh
Created October 4, 2012 08:36
Show Gist options
  • Save warmuuh/3832272 to your computer and use it in GitHub Desktop.
Save warmuuh/3832272 to your computer and use it in GitHub Desktop.
resource editing filter
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();
}
}
<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">&nbsp;</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