//$Id$ package org.exist.cluster.cocoon; import java.io.IOException; import java.util.HashMap; import java.util.Vector; import org.apache.cocoon.generation.AbstractGenerator; import org.exist.cluster.ClusterComunication; import org.exist.storage.report.XMLStatistics; import org.jgroups.Address; import org.jgroups.stack.IpAddress; import org.xml.sax.SAXException; import org.xml.sax.helpers.AttributesImpl; /** * A Cocoon Generator which generates status information about running database instances, * buffer usage and the like. * Created by Nicola Breda. * * @author Nicola Breda aka maiale * @author David Frontini aka spider * Date: 05-aug-2005 * Time: 18.09.08 * Revision $Revision$ */ public class ClusterGenerator extends AbstractGenerator { public final static String NAMESPACE = "http://exist.sourceforge.net/generators/cluster"; public final static String PREFIX = "cluster"; XMLStatistics stats; public ClusterGenerator() { super(); } /** * @see org.apache.cocoon.generation.Generator#generate() */ public void generate() throws IOException, SAXException { this.contentHandler.startDocument(); this.contentHandler.startPrefixMapping(PREFIX, NAMESPACE); this.contentHandler.startPrefixMapping("ci", "http://apache.org/cocoon/include/1.0"); this.contentHandler.startElement(NAMESPACE,"page",PREFIX+":page",new AttributesImpl()); AttributesImpl attr = new AttributesImpl(); attr.addAttribute("", "src", "src", "CDATA", "sidebar.xml"); this.contentHandler.startElement("http://apache.org/cocoon/include/1.0","include","ci:include",attr); this.contentHandler.endElement("http://apache.org/cocoon/include/1.0","include","ci:include"); this.contentHandler.startElement(NAMESPACE, "cluster", PREFIX + ":cluster", new AttributesImpl()); genNodes(); this.contentHandler.endElement(NAMESPACE, "cluster", PREFIX + ":cluster"); this.contentHandler.endPrefixMapping(PREFIX); this.contentHandler.endElement(NAMESPACE,"page",PREFIX+":page"); this.contentHandler.endDocument(); } private void genNodes() throws SAXException { ClusterComunication cluster = ClusterComunication.getInstance(); if (cluster == null) return; AttributesImpl atts = new AttributesImpl(); atts.addAttribute("", "address", "address", "CDATA", cluster.getAddress().toString()); atts.addAttribute("", "type", "type", "CDATA", cluster.isCoordinator() ? "local-master" : "local-node"); atts.addAttribute("", "console-address", "console-address", "CDATA", ""); this.contentHandler.startElement(NAMESPACE, "node", PREFIX + ":node", atts); this.contentHandler.endElement(NAMESPACE, "node", PREFIX + ":node"); if (!cluster.isCoordinator()) { String consoleAddr = "no-ip-found"; Address addr = cluster.getCoordinator(); if ( addr instanceof IpAddress ) { IpAddress ipA = (IpAddress)addr; consoleAddr = ipA.getIpAddress().getHostAddress() ; } Vector v = new Vector(); v.add(addr); ConsoleInfo info = (ConsoleInfo) cluster.getConsoleInfos(v).get(addr.toString()); atts = new AttributesImpl(); atts.addAttribute("", "address", "address", "CDATA", addr.toString()); atts.addAttribute("", "type", "type", "CDATA", "remote-master"); if(info!=null) atts.addAttribute("", "console-address", "console-address", "CDATA", "http://"+ consoleAddr + ":" + info.getProperty("port") +"/exist/cluster"); this.contentHandler.startElement(NAMESPACE, "node", PREFIX + ":node", atts); this.contentHandler.endElement(NAMESPACE, "node", PREFIX + ":node"); } Vector members = cluster.getMembersNoCoordinator(); HashMap infos = cluster.getConsoleInfos(members); for(int i=0;i<members.size();i++){ String consoleAddr = "no-ip-found"; ConsoleInfo info = (ConsoleInfo) infos.get(members.get(i).toString()); if ( members.get(i) instanceof IpAddress ) { IpAddress ipA = (IpAddress)members.get(i); consoleAddr = ipA.getIpAddress().getHostAddress() ; } atts = new AttributesImpl(); atts.addAttribute("", "address", "address", "CDATA", members.get(i).toString()); atts.addAttribute("", "type", "type", "CDATA", "remote-node"); if(info!=null) atts.addAttribute("", "console-address", "console-address", "CDATA", "http://"+ consoleAddr + ":" + info.getProperty("port") +"/exist/cluster"); this.contentHandler.startElement(NAMESPACE, "node", PREFIX + ":node", atts); this.contentHandler.endElement(NAMESPACE, "node", PREFIX + ":node"); } } /** * @param elem * @param value * @throws org.xml.sax.SAXException */ private void addValue(String elem, String value) throws SAXException { stats.addValue(elem, value); } }