Package org.apache.felix.inventory.impl

Source Code of org.apache.felix.inventory.impl.AbstractWebConsolePlugin

/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
package org.apache.felix.inventory.impl;

import java.io.IOException;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.felix.inventory.Format;
import org.apache.felix.inventory.impl.helper.ConfigurationWriter;
import org.apache.felix.inventory.impl.helper.HtmlConfigurationWriter;
import org.apache.felix.inventory.impl.helper.JSONConfigurationWriter;
import org.apache.felix.inventory.impl.helper.PlainTextConfigurationWriter;
import org.apache.felix.inventory.impl.helper.ZipConfigurationWriter;

/**
* The web console plugin for a inventory printer.
*/
public abstract class AbstractWebConsolePlugin extends HttpServlet
{

    private static final long serialVersionUID = 1L;

    /** The inventory printer manager. */
    protected final InventoryPrinterManagerImpl inventoryPrinterManager;

    /**
     * Constructor
     *
     * @param inventoryPrinterManager The manager
     */
    AbstractWebConsolePlugin(final InventoryPrinterManagerImpl inventoryPrinterManager)
    {
        this.inventoryPrinterManager = inventoryPrinterManager;
    }

    protected abstract InventoryPrinterHandler getInventoryPrinterHandler();

    private void printConfigurationInventory(final ConfigurationWriter pw, final Format format,
        final InventoryPrinterHandler handler) throws IOException
    {
        if (handler == null)
        {
            final InventoryPrinterHandler[] adapters = this.inventoryPrinterManager.getHandlers(format);
            for (int i = 0; i < adapters.length; i++)
            {
                pw.printInventory(format, adapters[i]);
            }
        }
        else
        {
            if (format == null || handler.supports(format))
            {
                pw.printInventory(format, handler);
            }
        }
    }

    /**
     * Sets response headers to force the client to not cache the response
     * sent back. This method must be called before the response is committed
     * otherwise it will have no effect.
     * <p>
     * This method sets the <code>Cache-Control</code>, <code>Expires</code>,
     * and <code>Pragma</code> headers.
     *
     * @param response The response for which to set the cache prevention
     */
    private final void setNoCache(final HttpServletResponse response)
    {
        response.setHeader("Cache-Control", "no-cache"); //$NON-NLS-1$ //$NON-NLS-2$
        response.addHeader("Cache-Control", "no-store"); //$NON-NLS-1$ //$NON-NLS-2$
        response.addHeader("Cache-Control", "must-revalidate"); //$NON-NLS-1$ //$NON-NLS-2$
        response.addHeader("Cache-Control", "max-age=0"); //$NON-NLS-1$ //$NON-NLS-2$
        response.setHeader("Expires", "Thu, 01 Jan 1970 01:00:00 GMT"); //$NON-NLS-1$ //$NON-NLS-2$
        response.setHeader("Pragma", "no-cache"); //$NON-NLS-1$ //$NON-NLS-2$
    }

    protected InventoryPrinterHandler getInventoryPrinterHandler(final String label)
    {
        return null; // all by default
    }

    protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws IOException
    {
        this.setNoCache(response);

        // full request?
        final InventoryPrinterHandler handler;
        final String pathInfo = request.getPathInfo();
        final int lastSlash = pathInfo.lastIndexOf('/');
        if (lastSlash > 0)
        {
            final int lastDot = pathInfo.lastIndexOf('.');
            final String label = (lastDot < lastSlash ? pathInfo.substring(lastSlash + 1) : pathInfo.substring(lastSlash + 1, lastDot));
            handler = this.getInventoryPrinterHandler(label); // usually all;
        }
        else
        {
            handler = this.getInventoryPrinterHandler();
            if (handler == null)
            {
                response.sendError(HttpServletResponse.SC_NOT_FOUND);
                return;
            }
        }

        if (request.getPathInfo().endsWith(".txt")) { //$NON-NLS-2$
            response.setContentType("text/plain; charset=utf-8"); //$NON-NLS-2$
            final ConfigurationWriter pw = new PlainTextConfigurationWriter(response.getWriter());
            printConfigurationInventory(pw, Format.TEXT, handler);
            pw.flush();
        }
        else if (request.getPathInfo().endsWith(".zip")) { //$NON-NLS-2$
            String type = getServletContext().getMimeType(request.getPathInfo());
            if (type == null)
            {
                type = "application/x-zip"; //$NON-NLS-2$
            }
            response.setContentType(type);

            final ZipConfigurationWriter pw = ZipConfigurationWriter.create(response.getOutputStream());
            printConfigurationInventory(pw, null, handler);
            pw.finish();
        }
        else if (request.getPathInfo().endsWith(".nfo"))
        {
            if (handler == null)
            {
                response.sendError(HttpServletResponse.SC_NOT_FOUND);
                return;
            }
            response.setContentType("text/html; charset=utf-8");

            final HtmlConfigurationWriter pw = new HtmlConfigurationWriter(response.getWriter());
            pw.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"");
            pw.println("  \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">");
            pw.println("<html xmlns=\"http://www.w3.org/1999/xhtml\">");
            pw.println("<head><title>dummy</title></head><body><div>");

            if (handler.supports(Format.HTML))
            {
                handler.print(pw, Format.HTML, false);
            }
            else if (handler.supports(Format.TEXT))
            {
                pw.enableFilter(true);
                handler.print(pw, Format.TEXT, false);
                pw.enableFilter(false);
            }
            else
            {
                pw.enableFilter(true);
                handler.print(pw, Format.JSON, false);
                pw.enableFilter(false);
            }
            pw.println("</div></body></html>");
            return;
        }
        else if (request.getPathInfo().endsWith(".json"))
        {
            if (handler == null)
            {
                response.sendError(HttpServletResponse.SC_NOT_FOUND);
                return;
            }
            response.setContentType("application/json"); //$NON-NLS-1$
            response.setCharacterEncoding("UTF-8"); //$NON-NLS-1$

            final JSONConfigurationWriter jcw = new JSONConfigurationWriter(response.getWriter());
            final Format format;
            if (handler.supports(Format.JSON))
            {
                format = Format.JSON;
            }
            else
            {
                format = Format.TEXT;
                jcw.startJSONWrapper();
            }
            printConfigurationInventory(jcw, format, handler);
            jcw.endJSONWrapper();
            jcw.flush();
        }
        else
        {
            if (handler == null)
            {
                response.sendError(HttpServletResponse.SC_NOT_FOUND);
                return;
            }
            final HtmlConfigurationWriter pw = new HtmlConfigurationWriter(response.getWriter());
            pw.println("<script type=\"text/javascript\">");
            pw.println("// <![CDATA[");
            pw.println("function pad(value) { if ( value < 10 ) { return '0' + value;} return '' + value;}");
            pw.println("function downloadDump(ext, full) {");
            pw.println("  if (full) {");
            pw.println("    var now = new Date();");
            pw.println("    var name = \"configuration-status-\" + now.getUTCFullYear() + pad(now.getUTCMonth() + 1) + pad(now.getUTCDate()) + \"-\" + pad(now.getUTCHours()) + pad(now.getUTCMinutes()) + pad(now.getUTCSeconds()) + \".\";");
            pw.println("    location.href = location.href + \"/\" + name + ext;");
            pw.println("  } else {");
            pw.println("    location.href = location.href + '.' + ext;");
            pw.println("  }");
            pw.println("}");

            pw.println("$(document).ready(function() {");
            pw.println("    $('.downloadTxt').click(function() { downloadDump('txt', false)});");
            pw.println("    $('.downloadJson').click(function() { downloadDump('json', false)});");
            pw.println("    $('.downloadZip').click(function() { downloadDump('zip', false)});");
            pw.println("    $('.downloadFullZip').click(function() { downloadDump('zip', true)});");
            pw.println("    $('.downloadFullTxt').click(function() { downloadDump('txt', true)});");
            pw.println("});");
            pw.println("// ]]>");
            pw.println("</script>");
            pw.println("<br/><p class=\"statline\">");

            pw.print("Date: ");
            pw.println(DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, Locale.US).format(new Date()));

            pw.print("<button type=\"button\" class=\"downloadFullZip\" style=\"float: right; margin-right: 30px; margin-top: 5px;\">Download Full Zip</button>");
            pw.print("<button type=\"button\" class=\"downloadFullTxt\" style=\"float: right; margin-right: 30px; margin-top: 5px;\">Download Full Text</button>");

            if (handler.supports(Format.JSON))
            {
                pw.print("<button type=\"button\" class=\"downloadJson\" style=\"float: right; margin-right: 30px; margin-top: 5px;\">Download As JSON</button>");
            }
            pw.print("<button type=\"button\" class=\"downloadZip\" style=\"float: right; margin-right: 30px; margin-top: 5px;\">Download As Zip</button>");
            if (handler.supports(Format.TEXT))
            {
                pw.print("<button type=\"button\" class=\"downloadTxt\" style=\"float: right; margin-right: 30px; margin-top: 5px;\">Download As Text</button>");
            }

            pw.println("<br/>&nbsp;</p>"); // status line
            pw.print("<div>");

            final boolean filter;
            final Format format;
            if (handler.supports(Format.HTML))
            {
                filter = false;
                format = Format.HTML;
            }
            else if (handler.supports(Format.TEXT))
            {
                // prefer TEXT of JSON if available
                filter = true;
                format = Format.TEXT;
            }
            else if (handler.supports(Format.JSON))
            {
                filter = true;
                format = Format.JSON;
            }
            else
            {
                // fallback to TEXT (if unknown format)
                filter = true;
                format = Format.TEXT;
            }

            pw.enableFilter(filter);
            handler.print(pw, format, false);
            pw.enableFilter(false);

            pw.print("</div>");
        }
    }

}
TOP

Related Classes of org.apache.felix.inventory.impl.AbstractWebConsolePlugin

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.