diff --git a/java/com.sap.sailing.gwt.ui/WEB-INF/web.xml b/java/com.sap.sailing.gwt.ui/WEB-INF/web.xml index 834dd55789a..31c2e291d95 100755 --- a/java/com.sap.sailing.gwt.ui/WEB-INF/web.xml +++ b/java/com.sap.sailing.gwt.ui/WEB-INF/web.xml @@ -61,6 +61,16 @@ *.html + + ClientConfigurationFilter + com.sap.sse.debranding.ClientConfigurationFilter + + + ClientConfigurationFilter + *.html + + + Status Status diff --git a/java/com.sap.sse.debranding/src/com/sap/sse/debranding/ClientConfigurationFilter.java b/java/com.sap.sse.debranding/src/com/sap/sse/debranding/ClientConfigurationFilter.java new file mode 100644 index 00000000000..8beb3934b04 --- /dev/null +++ b/java/com.sap.sse.debranding/src/com/sap/sse/debranding/ClientConfigurationFilter.java @@ -0,0 +1,196 @@ +package com.sap.sse.debranding; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; + +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.WriteListener; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpServletResponseWrapper; + +public class ClientConfigurationFilter implements Filter { + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + // intentionally left blank + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + HttpServletResponseWrapper wrappedResponse = new CharResponseWrapper((HttpServletResponse) response); + HttpServletRequestWrapper wrappedRequest = new HeadersRequestWrapper((HttpServletRequest) request); + chain.doFilter(wrappedRequest, wrappedResponse); + String body = wrappedResponse.toString(); + String replaced = new String(body); + System.setProperty(ClientConfigurationServlet.DEBRANDING_PROPERTY_NAME, "true"); + final boolean deBrandingActive = Boolean + .valueOf(System.getProperty(ClientConfigurationServlet.DEBRANDING_PROPERTY_NAME, "false")); + for (Map.Entry item : createReplacementMap(deBrandingActive).entrySet()) { + replaced = replaced.replace("${" + item.getKey() + "}", item.getValue()); + } + response.getWriter().write(replaced); + } + + private Map createReplacementMap(boolean deBrandingActive) { + final Map map = new HashMap<>(); + final String title; + final String whitelabeled; + if (deBrandingActive) { + title = ""; + whitelabeled = "-whitelabeled"; + } else { + title = "SAP "; + whitelabeled = ""; + } + map.put("SAP", title); + map.put("debrandingActive", Boolean.toString(deBrandingActive)); + map.put("whitelabeled", whitelabeled); + return map; + } + + @Override + public void destroy() { + // intentionally left blank + } + + private static class HeadersRequestWrapper extends HttpServletRequestWrapper { + private HeadersRequestWrapper(HttpServletRequest request) { + super(request); + } + + @Override + public String getHeader(String name) { + if (name.equalsIgnoreCase("Cache-Control")) { + return "no-cache"; + } + if (name.equalsIgnoreCase("If-Modified-Since")) { + return "Thu, 1. Jan 1970 00:00:00 GMT"; + } + return super.getHeader(name); + } + + @Override + public Enumeration getHeaders(String name) { + if (name.equalsIgnoreCase("Cache-Control")) { + return new OneElementEnum("no-cache"); + } + if (name.equalsIgnoreCase("If-Modified-Since")) { + return new OneElementEnum("Thu, 1. Jan 1970 00:00:00 GMT"); + } + return super.getHeaders(name); + } + + @Override + public long getDateHeader(String name) { + if (name.equalsIgnoreCase("If-Modified-Since")) { + return 0; + } + return super.getDateHeader(name); + } + + } + + private static class OneElementEnum implements Enumeration { + private boolean delivered = false; + private String value; + + public OneElementEnum(String value) { + this.value = value; + } + + @Override + public boolean hasMoreElements() { + return !delivered; + } + + @Override + public String nextElement() { + delivered = true; + return value; + } + } + + private static class CharResponseWrapper extends HttpServletResponseWrapper { + private ByteArrayOutputStream output; + + public String toString() { + return output.toString(); + } + + public CharResponseWrapper(HttpServletResponse response) { + super(response); + response.setBufferSize(0); // prevent buffering here to not need to think about it later + output = new ByteArrayOutputStream(); + } + + public PrintWriter getWriter() { + return new PrintWriter(output); + } + + @Override + public void setResponse(ServletResponse response) { + super.setResponse(response); + } + + @Override + public void setBufferSize(int size) { + super.setBufferSize(0); + } + + @Override + public int getBufferSize() { + return 0; + } + + @Override + public void flushBuffer() throws IOException { +// super.flushBuffer(); + } + + @Override + public void reset() { +// super.reset(); + } + + @Override + public void resetBuffer() { +// super.resetBuffer(); + } + + @Override + public ServletOutputStream getOutputStream() throws IOException { + return new ServletOutputStream() { + + @Override + public void write(int arg0) throws IOException { + output.write(arg0); + } + + @Override + public void setWriteListener(WriteListener writeListener) { + throw new IllegalStateException("not supported by ClientConfigurationServlet"); + } + + @Override + public boolean isReady() { + return true; + } + }; + } + + } + +}