package com.ausregistry.jtoolkit2.se.secdns; import java.util.ArrayList; import javax.xml.xpath.XPathExpressionException; import com.ausregistry.jtoolkit2.se.ResponseExtension; import com.ausregistry.jtoolkit2.xml.XMLDocument; /** * Process the <infData> element as documented in RFC5910. */ public class SecDnsDomainInfoResponseExtension extends ResponseExtension { private static final long serialVersionUID = 5997664658231558327L; private static final String DS_DATA_LIST_EXPR = ResponseExtension.EXTENSION_EXPR + "/" + SecDNSXMLUtil.SEC_DNS_PREFIX + ":infData/" + SecDNSXMLUtil.SEC_DNS_PREFIX + ":dsData"; private static final String KEY_DATA_LIST_EXPR = ResponseExtension.EXTENSION_EXPR + "/" + SecDNSXMLUtil.SEC_DNS_PREFIX + ":infData/" + SecDNSXMLUtil.SEC_DNS_PREFIX + ":keyData"; private static final String MAXSIGLIFE_EXPR = ResponseExtension.EXTENSION_EXPR + "/" + SecDNSXMLUtil.SEC_DNS_PREFIX + ":infData/" + SecDNSXMLUtil.SEC_DNS_PREFIX + ":maxSigLife"; private DSOrKeyType infData; private boolean initialised; @Override public void fromXML(final XMLDocument xmlDoc) throws XPathExpressionException { infData = new DSOrKeyType(); if (xmlDoc.getNodeCount("count(" + MAXSIGLIFE_EXPR + ")") > 0) { MaxSigLifeType maxSigLife = new MaxSigLifeType(); maxSigLife.setMaxSigLife(Integer.parseInt(xmlDoc.getNodeValue(MAXSIGLIFE_EXPR))); infData.setMaxSigLife(maxSigLife); } int secDnsCount = getResponseDsData(xmlDoc); initialised = (infData.getDsDataList() != null) && (infData.getDsDataList().size() == secDnsCount); if (!initialised) { secDnsCount = getResponseKeyData(xmlDoc); initialised = (infData.getKeyDataList() != null) && (infData.getKeyDataList().size() == secDnsCount); } } private int getResponseDsData(final XMLDocument xmlDoc) throws XPathExpressionException { final int secDnsCount = xmlDoc.getNodeCount("count(" + DS_DATA_LIST_EXPR + ")"); if (secDnsCount > 0) { ArrayList<DSData> dsDataList = new ArrayList<DSData>(); try { for (int i = 0; i < secDnsCount; i++) { dsDataList.add(DSData.fromXML(xmlDoc, DS_DATA_LIST_EXPR + "[" + (i + 1) + "]")); } } catch (final Exception e) { dsDataList = null; throw new XPathExpressionException(e); } infData.setDsDataList(dsDataList); } return secDnsCount; } private int getResponseKeyData(final XMLDocument xmlDoc) throws XPathExpressionException { final int secDnsCount = xmlDoc.getNodeCount("count(" + KEY_DATA_LIST_EXPR + ")"); if (secDnsCount > 0) { ArrayList<KeyData> keyDataList = new ArrayList<KeyData>(); try { for (int i = 0; i < secDnsCount; i++) { keyDataList.add(KeyData.fromXML(xmlDoc, KEY_DATA_LIST_EXPR + "[" + (i + 1) + "]")); } } catch (final Exception e) { keyDataList = null; throw new XPathExpressionException(e); } infData.setKeyDataList(keyDataList); } return secDnsCount; } @Override public boolean isInitialised() { return initialised; } public final DSOrKeyType getInfData() { return infData; } }