package com.owera.xaps.tr069.xml; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import com.owera.xaps.tr069.xml.ParameterValueStruct; /** * The class is responsible for parsing the ParameterList entity and populating the * ParameterList which is a list of ParameterValueStruct or ParameterInfoStruct objects * (which depends on the RPC method performed). * * * @author knut petter * */ public class ParameterListHandler extends DefaultHandler { private enum ParameterType { VALUE, INFO, ATTRIBUTE; } public static final String PARAMETER_LIST_TAG = "ParameterList"; public static final String PARAMETER_VALUE_STRUCT_TAG = "ParameterValueStruct"; public static final String PARAMETER_INFO_STRUCT_TAG = "ParameterInfoStruct"; public static final String PARAMETER_ATTRIBUTE_STRUCT_TAG = "ParameterAttributeStruct"; public static final String NAME_TAG = "Name"; public static final String VALUE_TAG = "Value"; public static final String WRITABLE_TAG = "Writable"; public static final String NOTIFICATION_TAG = "Notification"; private Parser owner; private ParameterList params; private ParameterValueStruct pvs; private ParameterInfoStruct pis; private ParameterAttributeStruct pas; private StringBuilder currTextContent = new StringBuilder(); private ParameterType parameterType = null; public ParameterListHandler(ParameterList params, Parser owner) { this.owner = owner; this.params = params; } public void startElement(String namespaceURI, String localName, String qualifiedName, Attributes attributes) throws SAXException { currTextContent = new StringBuilder(); if (PARAMETER_VALUE_STRUCT_TAG.equals(localName)) { parameterType = ParameterType.VALUE; pvs = new ParameterValueStruct(); } else if (PARAMETER_INFO_STRUCT_TAG.equals(localName)) { parameterType = ParameterType.INFO; pis = new ParameterInfoStruct(); } else if (PARAMETER_ATTRIBUTE_STRUCT_TAG.equals(localName)) { parameterType = ParameterType.ATTRIBUTE; pas = new ParameterAttributeStruct(); } else if (VALUE_TAG.equals(localName) && pvs != null && attributes != null) { for (int i = 0; i < attributes.getLength(); i++) { if (attributes.getQName(i).indexOf(":type") > -1) { pvs.setType(attributes.getValue(i)); break; } } } } public void endElement(String namespaceURI, String localName, String qualifiedName) throws SAXException { if (PARAMETER_LIST_TAG.equals(localName)) { owner.getXMLReader().setContentHandler(owner); } else if (PARAMETER_VALUE_STRUCT_TAG.equals(localName)) { this.params.addParameterValueStruct(pvs); } else if (PARAMETER_INFO_STRUCT_TAG.equals(localName)) { this.params.addParameterInfoStruct(pis); } else if (PARAMETER_ATTRIBUTE_STRUCT_TAG.equals(localName)) { this.params.addParameterAttributeStruct(pas); } else if (NAME_TAG.equals(localName)) { if (parameterType == ParameterType.VALUE) { pvs.setName(new String(currTextContent)); } else if (parameterType == ParameterType.INFO) { pis.setName(new String(currTextContent)); } else if (parameterType == ParameterType.ATTRIBUTE) { pas.setName(new String(currTextContent)); } } else if (VALUE_TAG.equals(localName)) { pvs.setValue(new String(currTextContent)); } else if (WRITABLE_TAG.equals(localName)) { String ct = new String(currTextContent); pis.setWritable((ct.equals("0") || ct.equals("false")) ? false : true); } else if (NOTIFICATION_TAG.equals(localName)) { String ct = new String(currTextContent); try { pas.setNotifcation(Integer.parseInt(ct)); } catch (NumberFormatException nfe) { throw new SAXException("The notification was not a number (" + ct + ")"); } } } public void characters(char[] ch, int start, int length) throws SAXException { String content = String.valueOf(ch).substring(start, (start + length)); currTextContent.append(content.trim()); } }