/** * Copyright (C) 2008 Progress Software, Inc. All rights reserved. * http://fusesource.com * * The software in this package is published under the terms of the AGPL license * a copy of which has been included with this distribution in the license.txt file. */ package org.fusesource.cloudmix.agent.webapp; import java.util.Set; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.fusesource.cloudmix.agent.AgentPoller; import org.fusesource.cloudmix.agent.Bundle; import org.fusesource.cloudmix.agent.RestGridClient; import org.fusesource.cloudmix.agent.dir.DirectoryInstallerAgent; import org.fusesource.cloudmix.common.dto.AgentDetails; public class GridAgentWebapp { public static final String IMAGES_ROOT = "images/"; public static final String STYLESHEET_HREF = "css/main.css"; private static final Log LOGGER = LogFactory.getLog(GridAgentWebapp.class); private RestGridClient gridClient; private DirectoryInstallerAgent agent; private AgentPoller poller; private String servletName; private String serverName; public GridAgentWebapp() { // Complete } public void destroy() { try { LOGGER.info("destroying poller"); agent.setClient(null); poller.destroy(); } catch (Exception e) { LOGGER.warn("Exception destroying poller; " + e); } } public void init(ServletConfig config) throws ServletException { LOGGER.debug("---------------------------------------------"); LOGGER.debug("Initializing Grid Agent"); LOGGER.info("initialising agent"); try { servletName = config.getServletContext().getServletContextName(); serverName = config.getServletContext().getServerInfo(); LOGGER.debug("\nConfiguration:\n"); LOGGER.debug(" Name: " + agent.getAgentName()); LOGGER.debug(" ID: " + agent.getAgentId()); LOGGER.debug(" Profile: " + agent.getProfile()); LOGGER.debug(" Properties File: " + agent.getDetailsPropertyFilePath()); LOGGER.debug(" Max Features: " + agent.getMaxFeatures()); LOGGER.debug(" Link: " + agent.getAgentLink()); LOGGER.debug(" Package Types: " + getAgentPackageTypes()); LOGGER.debug(" Type: " + agent.getContainerType()); LOGGER.debug(" Install Directory: " + agent.getInstallDirectory()); LOGGER.debug(" Repository URI: " + gridClient.getRootUri()); LOGGER.debug(" Agent Username: " + gridClient.getUsername()); LOGGER.debug(" Password Provider: " + gridClient.getPasswordProvider() .getClass().getSimpleName()); LOGGER.debug(" Polling Dealay: " + poller.getInitialPollingDelay()); LOGGER.debug(" Polling Period: " + poller.getPollingPeriod()); LOGGER.debug("\nGrid Agent Ready"); LOGGER.debug("---------------------------------------------"); LOGGER.debug("\n"); //poller.start(); } catch (Exception e) { LOGGER.error("Excepton " + e, e); } } public String getStatus() { // TODO this code is a bit sick! :) // its better to use a template engine instead for doing HTML representions! // see Jersey implicit views or the controller web application's HTML templates AgentDetails details = agent.getAgentDetails(); StringBuilder sb = new StringBuilder() .append("<html><head>\n") .append("<link href=\"") .append(STYLESHEET_HREF) .append("\" rel=\"stylesheet\" type=\"text/css\">\n") .append("<title>").append(servletName).append("</title>\n") .append("</head>\n") .append("<body><img src=\"images/logo.gif\"/>\n") .append("<h1>").append(servletName).append("</h1>\n"); try { sb.append("<h2>Properties</h2>\n") .append("<table>\n") .append("<tr><td><b>Agent Profile</b></td><td><i>\n") .append(agent.getProfile()).append("</i></td></tr>\n") .append("<tr><td><b>Agent Host</b></td><td><i>\n") .append(agent.getHostName()).append("</i></td></tr>\n") .append("<tr><td><b>Agent OS</b></td><td><i>\n") .append(details.getOs()).append("</i></td></tr>\n") .append("<tr><td><b>Agent PID</b></td><td><i>\n") .append(details.getPid()).append("</i></td></tr>\n") .append("<tr><td><b>Agent Link</b></td><td><i>\n") .append(details.getAgentLink()).append("</i></td></tr>\n") .append("<tr><td><b>Agent Container</b></td><td><i>\n") .append(details.getContainerType()).append("</i></td></tr>\n") .append("<tr><td><b>Package types</b></td><td><i>\n"); for (String packageType : details.getSupportPackageTypes()) { sb.append(packageType + " "); } sb.append("</i></td></tr>\n") .append("<tr><td><b>Install Directory</b></td><td><i>") .append(agent.getInstallDirectory()).append("</i></td></tr>\n") .append("<tr><td><b>Temp Suffix</b></td><td><i>") .append(agent.getTempSuffix()).append("</i></td></tr>\n") .append("<tr><td><b>Max Features</b></td><td><i>") .append(agent.getMaxFeatures()).append("</i></td></tr>\n") .append("<tr><td><b>Repository URI</b></td><td><i>") .append(gridClient.getRootUri()).append("</i></td></tr>\n") .append("<tr><td><b>Polling Period</b></td><td><i>") .append(poller.getPollingPeriod()).append("</i></td></tr>\n") .append("<tr><td><b>Initial Polling Delay</b></td><td><i>") .append(poller.getInitialPollingDelay()).append("</i></td></tr>\n") .append("</table>\n") .append("<h2>Features</h2>"); Set<String> features = details.getCurrentFeatures(); if (features == null || features.isEmpty()) { sb.append("<i>No features installed</i>\n"); } else { sb.append("<table>\n"); for (String f : features) { sb.append("<tr><td valign=\"top\"><div id=\"application\">") .append(f) .append("</div></td><td><ul id=\"artifact\">"); for (Bundle bundle : agent.getFeatureBundles(f)) { sb.append("<li>"); String name = bundle.getName(); if (name != null && !"".equals(name)) { sb.append(name).append(", "); } String uri = bundle.getUri(); sb.append("<a href=\"").append(uri).append("\">") .append(uri).append("</a>") .append("</li>\n"); } sb.append("</ul></td></tr>\n"); } sb.append("</table>"); } sb.append("<hr noshade><i>").append(serverName).append("</i></hr>\n"); // TODO : add link for history? } catch (Exception e) { e.printStackTrace(); sb.append("Error! " + e); } sb.append("</body>\n").append("</html>\n"); return sb.toString(); } public void setClient(RestGridClient gridclient) { this.gridClient = gridclient; } public synchronized RestGridClient getClient() { if (gridClient == null) { gridClient = new RestGridClient(); } return gridClient; } public void setAgent(DirectoryInstallerAgent agent) { this.agent = agent; } public DirectoryInstallerAgent getAgent() { return agent != null ? agent : new DirectoryInstallerAgent(); } public void setPoller(AgentPoller poller) { this.poller = poller; } private String getAgentPackageTypes() { StringBuilder sb = new StringBuilder(); boolean first = true; for (String t : agent.getSupportPackageTypes()) { if (!first) { sb.append(", "); } else { first = false; } sb.append(t); } return sb.toString(); } }