//$Id$
package org.exist.cluster.cocoon;
import java.io.IOException;
import org.apache.cocoon.generation.AbstractGenerator;
import org.exist.cluster.ClusterComunication;
import org.exist.cluster.ClusterException;
import org.exist.cluster.journal.JournalManager;
import org.exist.storage.report.XMLStatistics;
import org.exist.util.Configuration;
import org.jgroups.Address;
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 ClusterInfoGenerator extends AbstractGenerator {
public final static String NAMESPACE = "http://exist.sourceforge.net/generators/cluster";
public final static String PREFIX = "cluster";
XMLStatistics stats;
public ClusterInfoGenerator() {
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");
genInfos();
this.contentHandler.endElement(NAMESPACE,"page",PREFIX+":page");
this.contentHandler.endPrefixMapping(PREFIX);
this.contentHandler.endPrefixMapping("ci");
this.contentHandler.endDocument();
}
private void genInfos() throws SAXException
{
ClusterComunication cluster = ClusterComunication.getInstance();
if (cluster == null)
return;
try {
boolean coordinator = cluster.isCoordinator();
Address localaddress = cluster.getAddress();
int[][] headers = cluster.getHeaders();
AttributesImpl atts = new AttributesImpl();
AttributesImpl inner = new AttributesImpl();
atts.addAttribute("", "ismaster", "ismaster", "CDATA", ""+coordinator);
atts.addAttribute("", "name", "name", "CDATA", ""+localaddress);
this.contentHandler.startElement(NAMESPACE, "node", PREFIX + ":node", atts);
atts = new AttributesImpl();
atts.addAttribute("", "type", "type", "CDATA", "headers");
this.contentHandler.startElement(NAMESPACE, "info", PREFIX + ":info", atts);
inner.addAttribute("", "name", "name", "CDATA", "lastId");
inner.addAttribute("", "value", "value", "CDATA", ""+headers[0][0]);
this.contentHandler.startElement(NAMESPACE, "data", PREFIX + ":data", inner);
this.contentHandler.endElement(NAMESPACE, "data", PREFIX + ":data");
inner = new AttributesImpl();
inner.addAttribute("", "name", "name", "CDATA", "maxId");
inner.addAttribute("", "value", "value", "CDATA", ""+headers[0][1]);
this.contentHandler.startElement(NAMESPACE, "data", PREFIX + ":data", inner);
this.contentHandler.endElement(NAMESPACE, "data", PREFIX + ":data");
inner = new AttributesImpl();
inner.addAttribute("", "name", "name", "CDATA", "counter");
inner.addAttribute("", "value", "value", "CDATA", ""+headers[0][2]);
this.contentHandler.startElement(NAMESPACE, "data", PREFIX + ":data", inner);
this.contentHandler.endElement(NAMESPACE, "data", PREFIX + ":data");
this.contentHandler.endElement(NAMESPACE, "info", PREFIX + ":info");
if(!coordinator){
atts = new AttributesImpl();
atts.addAttribute("", "type", "type", "CDATA", "master-headers");
this.contentHandler.startElement(NAMESPACE, "info", PREFIX + ":info", atts);
inner = new AttributesImpl();
inner.addAttribute("", "name", "name", "CDATA", "lastId");
inner.addAttribute("", "value", "value", "CDATA", ""+headers[1][0]);
this.contentHandler.startElement(NAMESPACE, "data", PREFIX + ":data", inner);
this.contentHandler.endElement(NAMESPACE, "data", PREFIX + ":data");
inner = new AttributesImpl();
inner.addAttribute("", "name", "name", "CDATA", "maxId");
inner.addAttribute("", "value", "value", "CDATA", ""+headers[1][1]);
this.contentHandler.startElement(NAMESPACE, "data", PREFIX + ":data", inner);
this.contentHandler.endElement(NAMESPACE, "data", PREFIX + ":data");
inner = new AttributesImpl();
inner.addAttribute("", "name", "name", "CDATA", "counter");
inner.addAttribute("", "value", "value", "CDATA", ""+headers[1][2]);
this.contentHandler.startElement(NAMESPACE, "data", PREFIX + ":data", inner);
this.contentHandler.endElement(NAMESPACE, "data", PREFIX + ":data");
this.contentHandler.endElement(NAMESPACE, "info", PREFIX + ":info");
}
Configuration conf = cluster.getConfiguration();
atts = new AttributesImpl();
atts.addAttribute("", "type", "type", "CDATA", "jgroups");
this.contentHandler.startElement(NAMESPACE, "info", PREFIX + ":info", atts);
inner = new AttributesImpl();
inner.addAttribute("", "name", "name", "CDATA", "protocol");
String protocol = (String) conf.getProperty(ClusterComunication.PROPERTY_CLUSTER_PROTOCOL);
if(protocol==null)
protocol = ClusterComunication.DEFAULT_PROTOCOL_STACK;
StringBuffer prot = new StringBuffer();
for(int i=0;i<protocol.length();i+=70){
prot.append(protocol.substring(i,Math.min(i+70,protocol.length())));
prot.append(" ");
}
inner.addAttribute("", "value", "value", "CDATA", prot.toString());
this.contentHandler.startElement(NAMESPACE, "data", PREFIX + ":data", inner);
this.contentHandler.endElement(NAMESPACE, "data", PREFIX + ":data");
this.contentHandler.endElement(NAMESPACE, "info", PREFIX + ":info");
atts = new AttributesImpl();
atts.addAttribute("", "type", "type", "CDATA", "journal");
this.contentHandler.startElement(NAMESPACE, "info", PREFIX + ":info", atts);
inner = new AttributesImpl();
inner.addAttribute("", "name", "name", "CDATA", "journal-dir");
inner.addAttribute("", "value", "value", "CDATA", ""+conf.getProperty(JournalManager.PROPERTY_JOURNAL_DIR));
this.contentHandler.startElement(NAMESPACE, "data", PREFIX + ":data", inner);
this.contentHandler.endElement(NAMESPACE, "data", PREFIX + ":data");
inner = new AttributesImpl();
inner.addAttribute("", "name", "name", "CDATA", "exclude-dir");
inner.addAttribute("", "value", "value", "CDATA", ""+conf.getProperty(ClusterComunication.PROPERTY_CLUSTER_EXCLUDED_COLLECTIONS));
this.contentHandler.startElement(NAMESPACE, "data", PREFIX + ":data", inner);
this.contentHandler.endElement(NAMESPACE, "data", PREFIX + ":data");
inner = new AttributesImpl();
inner.addAttribute("", "name", "name", "CDATA", "max-item");
inner.addAttribute("", "value", "value", "CDATA", ""+conf.getProperty(JournalManager.PROPERTY_CLUSTER_JOURNAL_MAXSTORE));
this.contentHandler.startElement(NAMESPACE, "data", PREFIX + ":data", inner);
this.contentHandler.endElement(NAMESPACE, "data", PREFIX + ":data");
inner = new AttributesImpl();
inner.addAttribute("", "name", "name", "CDATA", "coordinator-shift");
inner.addAttribute("", "value", "value", "CDATA", ""+conf.getProperty(JournalManager.PROPERTY_CLUSTER_JOURNAL_SHIFT));
this.contentHandler.startElement(NAMESPACE, "data", PREFIX + ":data", inner);
this.contentHandler.endElement(NAMESPACE, "data", PREFIX + ":data");
this.contentHandler.endElement(NAMESPACE, "info", PREFIX + ":info");
} catch (ClusterException e) {
e.printStackTrace();
throw new SAXException("ERROR CREATING INFOS ", e);
}
}
/**
* @param elem
* @param value
* @throws org.xml.sax.SAXException
*/
private void addValue(String elem, String value) throws SAXException {
stats.addValue(elem, value);
}
}