Java tutorial
/* * Weblounge: Web Content Management System * Copyright (c) 2003 - 2011 The Weblounge Team * http://entwinemedia.com/weblounge * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package ch.entwine.weblounge.kernel.webconsole; import ch.entwine.weblounge.common.site.Site; import ch.entwine.weblounge.kernel.shared.WebloungeSharedResources; import org.apache.commons.io.IOUtils; import org.apache.felix.webconsole.AbstractWebConsolePlugin; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * This class implements plugin for the felix webconsole that provides access to * weblounge functionality as well as sites. */ public class WebConsolePlugin extends AbstractWebConsolePlugin { /** Serial version uid */ private static final long serialVersionUID = 868658142169523757L; /** Plugin uri */ private static final String URI = "weblounge"; /** Plugin name */ private static final String TITLE = "Weblounge"; /** Path to the main index */ private static final String INDEX = "/webconsole/index.html"; /** Template key for the sites data */ private static final String SITES_DATA_KEY = "sites-data"; /** Template key for the total sites count */ private static final String SITES_COUNT_KEY = "sites-count"; /** Template key for the number of active sites */ private static final String SITES_ACTIVE_COUNT_KEY = "sites-active"; /** Template key for the number of inactive sites */ private static final String SITES_INACTIVE_COUNT_KEY = "sites-inactive"; /** Template key for the path to the site service rest endpoint */ private static final String SITE_SERVICE_URI = "site-service-uri"; /** Template key for the uri to the weblounge shared resources */ private static final String SHARED_RESOURCES_KEY = "shared-resources"; /** The list of registered sites */ private List<Site> sites = new ArrayList<Site>(); /** Reference to the shared resources */ private WebloungeSharedResources sharedResources = null; /** URI to the site rest service */ // TODO: Make this dynamic, read path property from service private String siteServiceURI = "/system/weblounge/sites"; /** * {@inheritDoc} * * @see org.apache.felix.webconsole.AbstractWebConsolePlugin#getLabel() */ @Override public String getLabel() { return URI; } /** * {@inheritDoc} * * @see org.apache.felix.webconsole.AbstractWebConsolePlugin#getTitle() */ @Override public String getTitle() { return TITLE; } /** * {@inheritDoc} * * @see org.apache.felix.webconsole.AbstractWebConsolePlugin#doGet(javax.servlet.http.HttpServletRequest, * javax.servlet.http.HttpServletResponse) */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if (request.getPathInfo().endsWith("/index.json")) { response.setContentType("text/json"); String json = addSitesData("${" + SITES_DATA_KEY + "}"); response.getWriter().print(json); return; } else { super.doGet(request, response); } } /** * {@inheritDoc} * * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub super.doPost(req, resp); } /** * {@inheritDoc} * * @see org.apache.felix.webconsole.AbstractWebConsolePlugin#renderContent(javax.servlet.http.HttpServletRequest, * javax.servlet.http.HttpServletResponse) */ @Override protected void renderContent(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { if ("/index.json".equals(req.getRequestURI())) { res.setContentType("text/json"); String json = addSitesData("${" + SITES_DATA_KEY + "}"); res.getWriter().print(json); } else { InputStream is = null; try { is = getClass().getResourceAsStream(INDEX); String template = IOUtils.toString(is); // Process the template template = addSharedResourcesMountpoint(template); template = addSitesData(template); // Write the template to the output res.setContentType("text/html"); res.getWriter().print(template); } finally { IOUtils.closeQuietly(is); } } } /** * Returns the replacement for <code>sites-data</code> in the template. * * @param the * template * @return the sites data */ protected String addSharedResourcesMountpoint(String template) { String uri = null; if (sharedResources != null) uri = sharedResources.getResourcesMountpoint(); else uri = WebloungeSharedResources.DEFAULT_RESOURCES_MOUNTPOINT; template = template.replace("${" + SHARED_RESOURCES_KEY + "}", uri); return template; } /** * Returns the replacement for <code>sites-data</code> in the template. * * @param the * template * @return the sites data */ protected String addSitesData(String template) { int activeSites = 0; int inactiveSites = 0; // Collect and process the site data StringBuffer sitesData = new StringBuffer(); synchronized (sites) { int i = 1; for (Site site : sites) { String state = site.isOnline() ? "active" : "inactive"; int stateRaw = site.isOnline() ? 1 : 0; activeSites += site.isOnline() ? 1 : 0; inactiveSites += !site.isOnline() ? 1 : 0; if (i > 1) sitesData.append(","); sitesData.append("{"); sitesData.append("\"id\":\"").append(site.getIdentifier()).append("\","); sitesData.append("\"name\":\"").append(site.getName()).append("\","); sitesData.append("\"version\":\"").append("-").append("\","); sitesData.append("\"state\":\"").append(state).append("\","); sitesData.append("\"state\":\"").append(state).append("\","); sitesData.append("\"stateRaw\":\"").append(stateRaw).append("\""); sitesData.append("}"); i++; } } template = template.replace("${" + SITES_DATA_KEY + "}", sitesData.toString()); // Path to site manager REST endpoint template = template.replace("${" + SITE_SERVICE_URI + "}", siteServiceURI); // Total number of sites template = template.replace("${" + SITES_COUNT_KEY + "}", Integer.toString(sites.size())); // Number of active sites template = template.replace("${" + SITES_ACTIVE_COUNT_KEY + "}", Integer.toString(activeSites)); // Number of inactive sites template = template.replace("${" + SITES_INACTIVE_COUNT_KEY + "}", Integer.toString(inactiveSites)); return template; } /** * Adds a site to the list of registered sites. * * @param site * the site to add */ void addSite(Site site) { synchronized (sites) { sites.add(site); } } /** * Removes a site from the list of registered sites. * * @param site * the site to remove */ void removeSite(Site site) { synchronized (sites) { sites.remove(site); } } /** * Sets a reference to the shared resources. * * @param sharedResources * the shared resources */ void setSharedResources(WebloungeSharedResources sharedResources) { this.sharedResources = sharedResources; } }