/***************************************************
* *
* Mobicents: The Open Source VoIP Platform *
* *
* Distributable under LGPL license. *
* See terms of license at gnu.org. *
* *
***************************************************/
package org.mobicents.ant.sbbconfigurator;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.apache.tools.ant.BuildException;
import org.mobicents.util.XMLParser;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentType;
import org.w3c.dom.Element;
import org.mobicents.ant.SleeDTDResolver;
/**
* Ant subtask for SbbConfigurator that configures sbb descriptor's env entry elements.
* @author Eduardo Martins / 2006 PT Inova��o (www.ptinovacao.pt)
*/
public class SetEnvEntrySubTask implements SubTask {
// Obtain a suitable logger.
private static Logger logger = Logger.getLogger(org.mobicents.ant.sbbconfigurator.SetEnvEntrySubTask.class.getName());
// Does all the work, that is, sets a new type and/or new value on a existent env-entry.
public void run(File sbbDescriptor) {
if (envEntryType == null && envEntryValue == null) {
// Log the warning
logger.log(Level.WARNING, "Skiping sbb description configuration of env-entry with name "+envEntryName+". Reason: new Type and new Value not defined.");
}
else {
try {
try {
Document sbbjarDoc = XMLParser.getDocument(sbbDescriptor.toURL(), entityResolver);
Element sbbRoot = sbbjarDoc.getDocumentElement(); // <sbb-jar>
List sbbNodes = XMLParser.getElementsByTagName(sbbRoot, "sbb"); // <sbb>
boolean updateXml = false;
for (Iterator i = sbbNodes.iterator(); i.hasNext(); ) {
// get sbb node
Element sbbNode = (Element)i.next();
// check sbb node
if (sbbName != null) {
Element sbbNameNode = XMLParser.getUniqueElement(sbbNode, "sbb-name"); // <sbb-name>
if (!sbbNameNode.getFirstChild().getNodeValue().equals(sbbName))
continue;
};
if (sbbVendor != null) {
Element sbbVendorNode = XMLParser.getUniqueElement(sbbNode, "sbb-vendor"); // <sbb-vendor>
if (!sbbVendorNode.getFirstChild().getNodeValue().equals(sbbVendor))
continue;
};
if (sbbVersion != null) {
Element sbbVersionNode = XMLParser.getUniqueElement(sbbNode, "sbb-version"); // <sbb-version>
if (!sbbVersionNode.getFirstChild().getNodeValue().equals(sbbVersion))
continue;
};
List envEntries = XMLParser.getElementsByTagName(sbbNode, "env-entry"); // <env-entry>
for (Iterator j = envEntries.iterator(); j.hasNext(); ) {
// get env entry node
Element envEntryNode = (Element)j.next();
// check env entry node
Element envEntryNameNode = XMLParser.getUniqueElement(envEntryNode, "env-entry-name"); // <env-entry-name>
if (!envEntryNameNode.getFirstChild().getNodeValue().equals(envEntryName))
continue;
// set env entry type?
if (envEntryType != null) {
Element envEntryTypeNode = XMLParser.getUniqueElement(envEntryNode, "env-entry-type"); // <env-entry-type>
if (!envEntryTypeNode.hasChildNodes()) {
envEntryTypeNode.appendChild(sbbjarDoc.createTextNode(envEntryType));
}
else {
envEntryTypeNode.getFirstChild().setNodeValue(envEntryType);
}
updateXml = true;
}
// set env entry value?
if (envEntryValue != null) {
Element envEntryValueNode = XMLParser.getUniqueElement(envEntryNode, "env-entry-value"); // <env-entry-value>
if (!envEntryValueNode.hasChildNodes()) {
envEntryValueNode.appendChild(sbbjarDoc.createTextNode(envEntryValue));
}
else {
envEntryValueNode.getFirstChild().setNodeValue(envEntryValue);
}
updateXml = true;
}
}
}
// write updated descriptor file?
if (updateXml) {
Source source = new DOMSource(sbbjarDoc);
Result result = new StreamResult(sbbDescriptor);
Transformer xformer = TransformerFactory.newInstance().newTransformer();
DocumentType docType = sbbjarDoc.getDoctype();
if (docType != null) {
String publicId = docType.getPublicId();
if(publicId != null) {
xformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, publicId);
}
String systemId = docType.getSystemId();
if(systemId != null) {
xformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, systemId);
}
//FIXME should we check more properties?
}
else {
logger.warning("sbb descriptor with null doctype");
}
xformer.transform(source, result);
}
} catch (IOException e) {
throw new BuildException(e);
}
}
catch (Exception ex) {
// Log the error
logger.log(Level.WARNING, "Bad result: " + ex.getCause().toString());
}
}
}
// The setter for the "name" attribute
public void setName(String name) {
this.envEntryName = name;
}
// The setter for the "newType" attribute
public void setNewType(String newType) {
this.envEntryType = newType;
}
// The setter for the "newValue" attribute
public void setNewValue(String newValue) {
this.envEntryValue = newValue;
}
// The setter for the "sbbName" attribute
public void setSbbName(String sbbName) {
this.sbbName = sbbName;
}
// The setter for the "sbbVendor" attribute
public void setSbbVendor(String sbbVendor) {
this.sbbVendor = sbbVendor;
}
// The setter for the "sbbVersion" attribute
public void setSbbVersion(String sbbVersion) {
this.sbbVersion = sbbVersion;
}
private String envEntryName = null;
private String envEntryType = null;
private String envEntryValue = null;
private String sbbName = null;
private String sbbVendor = null;
private String sbbVersion = null;
private static final SleeDTDResolver entityResolver = new SleeDTDResolver();
}