package com.ausregistry.jtoolkit2.se.extendedAvailability; import com.ausregistry.jtoolkit2.EPPDateFormatter; import com.ausregistry.jtoolkit2.se.ReceiveSE; import com.ausregistry.jtoolkit2.se.ResponseExtension; import com.ausregistry.jtoolkit2.xml.XMLDocument; import javax.xml.xpath.XPathExpressionException; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.Map; /** * <p>Extended Availability Check response extension for EPP Domain Check command.</p> * * <p>Use this to access "state", "reason", "date", "phase" and "variantPrimaryDomainName" information for domains as * provided in an extension to the EPP Domain Check response. Such a service element is sent by a compliant EPP server * in response to a valid Domain Check command with the Extended Availability Check extension.</p> * * <p>For flexibility, this implementation extracts the data from the response using XPath queries, the expressions * for which are defined statically.</p> * * @see com.ausregistry.jtoolkit2.se.extendedAvailability.DomainCheckExtendedAvailabilityCommandExtension * @see <a href="http://ausregistry.github.io/doc/exAvail-1.0/exAvail-1.0.html">Domain Name Check Extended Availability * Extension Mapping for the Extensible Provisioning Protocol (EPP)</a> */ public class DomainCheckExtendedAvailabilityResponseExtension extends ResponseExtension { private static final long serialVersionUID = 5649370730246651621L; private static final String CHKDATA_COUNT_EXPR = "count(" + EXTENSION_EXPR + "/exAvail:chkData/*)"; private static final String CHKDATA_IND_EXPR = EXTENSION_EXPR + "/exAvail:chkData/exAvail:cd[IDX]"; private static final String CHKDATA_DOMAIN_NAME_EXPR = "/exAvail:name/text()"; private static final String CHKDATA_DOMAIN_STATE_EXPR = "/exAvail:state/@s"; private static final String CHKDATA_DOMAIN_STATE_REASON_EXPR = "/exAvail:state/exAvail:reason/text()"; private static final String CHKDATA_DOMAIN_STATE_PHASE_EXPR = "/exAvail:state/exAvail:phase/text()"; private static final String CHKDATA_DOMAIN_STATE_DATE_EXPR = "/exAvail:state/exAvail:date/text()"; private static final String CHKDATA_DOMAIN_STATE_PRIMARY_DOMAIN_NAME_EXPR = "/exAvail:state/exAvail:primaryDomainName/text()"; private Map<String, DomainCheckExtendedAvailabilityDetails> domainExtAvailabilityStateMap = new HashMap<String, DomainCheckExtendedAvailabilityDetails>(); /** * @param xmlDoc the XML to be processed */ @Override public void fromXML(XMLDocument xmlDoc) throws XPathExpressionException { int extAvailStateCount = xmlDoc.getNodeCount(CHKDATA_COUNT_EXPR); for (int i = 0; i < extAvailStateCount; i++) { String qry = ReceiveSE.replaceIndex(CHKDATA_IND_EXPR, i + 1); final String domainName = xmlDoc.getNodeValue(qry + CHKDATA_DOMAIN_NAME_EXPR); String domainState = xmlDoc.getNodeValue(qry + CHKDATA_DOMAIN_STATE_EXPR); GregorianCalendar date = EPPDateFormatter .fromXSDateTime(xmlDoc.getNodeValue(qry + CHKDATA_DOMAIN_STATE_DATE_EXPR)); String reason = xmlDoc.getNodeValue(qry + CHKDATA_DOMAIN_STATE_REASON_EXPR); String phase = xmlDoc.getNodeValue(qry + CHKDATA_DOMAIN_STATE_PHASE_EXPR); String variantPrimaryDomainName = xmlDoc.getNodeValue(qry + CHKDATA_DOMAIN_STATE_PRIMARY_DOMAIN_NAME_EXPR); DomainCheckExtendedAvailabilityDetails extAvailabilityDetails = new DomainCheckExtendedAvailabilityDetails(domainState, reason, date, phase, variantPrimaryDomainName); domainExtAvailabilityStateMap.put(domainName, extAvailabilityDetails); } } @Override public boolean isInitialised() { return false; } /** * @return the extended availability details of all the domains checked for. */ public Map<String, DomainCheckExtendedAvailabilityDetails> getDomainExtAvailabilityStateMap() { return domainExtAvailabilityStateMap; } /** * @param domainName domain name to be checked * @return the extended availability details for the domainName */ public DomainCheckExtendedAvailabilityDetails getStateForDomain(String domainName) { return domainExtAvailabilityStateMap.get(domainName); } }