package com.owera.xaps.tr069.xml;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
/**
* The class is responsible for parsing the SOAP Fault entity received from the CPE.
*
* @author knut petter
*
*/
public class FaultHandler extends DefaultHandler {
public static final String DSLFORUM_NS = "urn:dslforum-org:cwmp-1-0";
public static final String SOAP_ENV_NS = "http://schemas.xmlsoap.org/soap/envelope/";
public static final String FAULT_TAG = "Fault";
public static final String SOAP_FAULT_CODE_TAG = "faultcode";
public static final String SOAP_FAULT_STRING_TAG = "faultstring";
public static final String SOAP_DETAIL_TAG = "detail";
public static final String FAULT_CODE_TAG = "FaultCode";
public static final String FAULT_STRING_TAG = "FaultString";
public static final String SET_PARAMETER_VALUES_FAULT_TAG = "SetParameterValuesFault";
public static final String PARAMETER_NAME_TAG = "ParameterName";
public static final String FAULT_STRUCT_TAG = "FaultStruct";
private SAXParserFactory factory;
private XMLReader reader;
private Fault fault;
private Parser owner;
private StringBuilder currTextContent = new StringBuilder();
public FaultHandler(Fault fault, Parser owner) {
this.fault = fault;
this.owner = owner;
}
public FaultHandler(InputSource xmlSource) {
this.fault = null;
try {
SAXParserFactory factory = getParserFactory();
factory.setNamespaceAware(true);
reader = factory.newSAXParser().getXMLReader();
reader.setContentHandler(this);
reader.setErrorHandler(new SOAPErrorHandler());
reader.parse(xmlSource);
} catch (Exception ex) {
ex.printStackTrace();
}
}
private SAXParserFactory getParserFactory() {
if (factory == null) {
factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
}
return factory;
}
public Fault getFault() {
return this.fault;
}
private boolean isParameterFault = false;
private String faultCode = null;
private String faultString = null;
private String parameterName = null;
public void startElement(String namespaceURI, String localName, String qualifiedName, Attributes attributes) throws SAXException {
currTextContent = new StringBuilder();
if (SOAP_ENV_NS.equals(namespaceURI) && FAULT_TAG.equals(localName)) {
this.fault = new Fault();
} else if (SOAP_FAULT_CODE_TAG.equals(localName)) {
} else if (SOAP_FAULT_STRING_TAG.equals(localName)) {
} else if (SOAP_DETAIL_TAG.equals(localName)) {
} else if (DSLFORUM_NS.equals(namespaceURI) && FAULT_TAG.equals(localName)) {
} else if (FAULT_CODE_TAG.equals(localName)) {
} else if (FAULT_STRING_TAG.equals(localName)) {
} else if (SET_PARAMETER_VALUES_FAULT_TAG.equals(localName)) {
isParameterFault = true;
} else if (PARAMETER_NAME_TAG.equals(localName)) {
}
}
public void endElement(String namespaceURI, String localName, String qualifiedName) {
if (SOAP_ENV_NS.equals(namespaceURI) && FAULT_TAG.equals(localName)) {
}
if (FAULT_STRUCT_TAG.equals(localName)) {
if (owner != null) {
owner.getXMLReader().setContentHandler(owner);
}
} else if (SOAP_FAULT_CODE_TAG.equals(localName)) {
if (this.fault != null) {
this.fault.setSoapFaultCode(new String(currTextContent));
}
} else if (SOAP_FAULT_STRING_TAG.equals(localName)) {
if (this.fault != null) {
this.fault.setSoapFaultString(new String(currTextContent));
}
} else if (SOAP_DETAIL_TAG.equals(localName)) {
} else if (DSLFORUM_NS.equals(namespaceURI) && FAULT_TAG.equals(localName)) {
} else if (FAULT_CODE_TAG.equals(localName)) {
this.faultCode = new String(currTextContent);
if (!isParameterFault) {
this.fault.setFaultCode(this.faultCode);
}
} else if (FAULT_STRING_TAG.equals(localName)) {
this.faultString = new String(currTextContent);
if (!isParameterFault) {
this.fault.setFaultString(this.faultString);
}
} else if (SET_PARAMETER_VALUES_FAULT_TAG.equals(localName)) {
this.fault.addParameterValuesFault(new SetParameterValuesFault(faultCode, faultString, parameterName));
isParameterFault = false;
} else if (PARAMETER_NAME_TAG.equals(localName)) {
this.parameterName = new String(currTextContent);
}
}
public void characters(char[] ch, int start, int length) throws SAXException {
String content = String.valueOf(ch).substring(start, (start + length));
currTextContent.append(content.trim());
}
}