/******************************************************************************* * Copyright (c) 2011, 2016 Eurotech and/or its affiliates * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Eurotech *******************************************************************************/ package org.eclipse.kura.web.server.servlet; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.eclipse.kura.system.SystemService; import org.eclipse.kura.web.server.util.ServiceLocator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SkinServlet extends HttpServlet { private static final long serialVersionUID = -556598856721497972L; private static Logger s_logger = LoggerFactory.getLogger(SkinServlet.class); @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String resourceName = request.getPathInfo(); if (resourceName.endsWith(".css")) { response.setContentType("text/css"); streamText(resourceName, response.getWriter()); } else if (resourceName.endsWith(".js")) { response.setContentType("text/javascript"); streamText(resourceName, response.getWriter()); } else if (resourceName.endsWith(".jpg") || resourceName.endsWith(".png")) { response.setContentType("image/png"); streamBinary(resourceName, response.getOutputStream()); } } private void streamText(String resourceName, PrintWriter w) throws ServletException, IOException { FileReader fr = null; try { // check to see if we have an external resource directory configured SystemService systemService = ServiceLocator.getInstance().getService(SystemService.class); File fResourceDir = checkDir(systemService.getKuraStyleDirectory()); if (fResourceDir == null) { return; } File fResourceFile = checkFile(fResourceDir, resourceName); if (fResourceFile == null) { return; } // write the requested resource fr = new FileReader(fResourceFile); char[] buffer = new char[1024]; int iRead = fr.read(buffer); while (iRead != -1) { w.write(buffer, 0, iRead); iRead = fr.read(buffer); } } catch (Exception e) { s_logger.error("Error loading skin resource", e); } finally { if (fr != null) { fr.close(); } if (w != null) { w.close(); } } } private void streamBinary(String resourceName, OutputStream o) throws ServletException, IOException { FileInputStream in = null; try { // check to see if we have an external resource directory configured SystemService systemService = ServiceLocator.getInstance().getService(SystemService.class); File fResourceDir = checkDir(systemService.getKuraStyleDirectory()); if (fResourceDir == null) { return; } File fResourceFile = checkFile(fResourceDir, resourceName); if (fResourceFile == null) { return; } // write the requested resource in = new FileInputStream(fResourceFile); byte[] buf = new byte[1024]; int len = 0; while ((len = in.read(buf)) >= 0) { o.write(buf, 0, len); } } catch (Exception e) { s_logger.error("Error loading skin resource", e); } finally { if (in != null) { in.close(); } if (o != null) { o.close(); } } } private File checkDir(String resourceDir) { File fResourceDir = null; if (resourceDir != null && resourceDir.trim().length() != 0) { fResourceDir = new File(resourceDir); if (!fResourceDir.exists()) { s_logger.warn("Resource Directory {} does not exist", fResourceDir.getAbsolutePath()); fResourceDir = null; return fResourceDir; } } return fResourceDir; } private File checkFile(File resourceDir, String resourceName) { File fResourceFile = new File(resourceDir, resourceName); if (!fResourceFile.exists()) { s_logger.warn("Resource File {} does not exist", fResourceFile.getAbsolutePath()); fResourceFile = null; return fResourceFile; } return fResourceFile; } }