package ch.unifr.pai.twice.widgets.mpProxyScreenShot.server; /* * Copyright 2013 Oliver Schmid * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import ch.unifr.pai.twice.widgets.mpproxy.server.SimpleHttpUrlConnectionServletFilter; import ch.unifr.pai.twice.widgets.mpproxy.shared.Constants; @WebServlet(urlPatterns = {"/miceScreenShot/manager", "/miceproxy/manager"}) public class ReadOnlyPresentation extends HttpServlet { private static final long serialVersionUID = 1L; private static double scaleFactor = 0.25; private static class Screenshot { private String html; private String url; private int height; private int width; private int top; private int left; public Screenshot(String html, String url, String height, String width, String top, String left) { super(); this.html = html; this.url = url; this.height = Integer.parseInt(height); this.width = Integer.parseInt(width); this.top = Integer.parseInt(top); this.left = Integer.parseInt(left); } } private static Map<String, Screenshot> uuidToScreenshot = Collections .synchronizedMap(new HashMap<String, Screenshot>()); public static String getScreenshotForUUID(String uuid) { if (uuid == null) return null; Screenshot s = uuidToScreenshot.get(uuid); String html = s.html; html = html.replace("<body", "<body style=\"overflow:hidden; zoom: "+scaleFactor+"!important; -moz-transform: scale("+scaleFactor+"); -moz-transform-origin: 0 0;\""); html = html.replaceAll("<div id=\"miceNavigation\".*?</div>", ""); html = html.replaceAll("<div id=\"contentWrapper\".?>", ""); html = html.replace("</div></body>", "</div>"); html = html.replace("</body>", "<script>document.body.scrollTop="+(s.top*scaleFactor)+";document.body.scrollLeft="+(s.left*scaleFactor)+";</script></body>"); return s != null ? html : null; } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter w = resp.getWriter(); for(String uuid : uuidToScreenshot.keySet()){ Screenshot s = uuidToScreenshot.get(uuid); w.print("<div style=\"width:"); w.print((int)Math.ceil((double)s.width*scaleFactor)); w.print("px; height:"); w.print((int)Math.ceil((double)s.height*scaleFactor)); w.print("px; overflow:hidden; display:inline-block;\">"); w.print("<iframe "); w.print("name=\""); w.print(uuid); w.print("\" style=\"width:100%; height:100%;\" src=\""); w.print(SimpleHttpUrlConnectionServletFilter.getServletPath(req)); w.print("/" + s.url + "/"); w.print("miceScreenShot?uuid=" + uuid); w.print("\"></iframe></div>"); } w.flush(); w.close(); return; } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String url = req.getParameter("url"); Object uuidObj = req.getSession().getAttribute(Constants.uuidCookie); String uuid = uuidObj != null ? uuidObj.toString() : null; BufferedReader reader = req.getReader(); ByteArrayOutputStream byteArrOS = new ByteArrayOutputStream(); int b; while ((b = reader.read()) != -1) { byteArrOS.write(b); } byteArrOS.flush(); byteArrOS.close(); reader.close(); String html = new String(byteArrOS.toByteArray(), "UTF-8"); if (!html.isEmpty() && url != null && !url.isEmpty()) uuidToScreenshot.put(uuid, new Screenshot(html, url, req.getParameter("height"), req.getParameter("width"), req.getParameter("top"), req.getParameter("left"))); } }