package com.ausregistry.jtoolkit2.se; import java.util.GregorianCalendar; import java.util.List; import java.util.Vector; import javax.xml.xpath.XPathExpressionException; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import com.ausregistry.jtoolkit2.EPPDateFormatter; import com.ausregistry.jtoolkit2.ErrorPkg; import com.ausregistry.jtoolkit2.xml.XMLDocument; /** * Use this to retrieve the values of attributes common to all EPP response service elements. Unless there is a specific * subclass dedicated to handling a type of response, an instance of this class should be used to handle the response. * The commands which result in a response that should be handled by this class are LoginCommand, LogoutCommand, * subclasses of DeleteCommand and subclasses of UpdateCommand. * * @see com.ausregistry.jtoolkit2.se.LoginCommand * @see com.ausregistry.jtoolkit2.se.LogoutCommand * @see com.ausregistry.jtoolkit2.se.DeleteCommand * @see com.ausregistry.jtoolkit2.se.UpdateCommand */ public class Response extends ReceiveSE { protected static final String RESPONSE_EXPR = "/e:epp/e:response"; private static final long serialVersionUID = -2441248857298156911L; private static final String DEFAULT_LANGUAGE = "en"; private static final String RESULT_COUNT_EXPR = "count(" + RESPONSE_EXPR + "/e:result)"; private static final String RESULT_EXPR = RESPONSE_EXPR + "/e:result[IDX]"; private static final String RESULT_CODE_EXPR = "/@code"; private static final String RESULT_MSG_EXPR = "/e:msg"; private static final String RESULT_VALUE_EXPR = "/e:value"; private static final String RESULT_XVALUE_EXPR = "/e:extValue"; private static final String MSGQ_COUNT_EXPR = RESPONSE_EXPR + "/e:msgQ/@count"; private static final String MSGQ_ID_EXPR = RESPONSE_EXPR + "/e:msgQ/@id"; private static final String MSGQ_QDATE_EXPR = RESPONSE_EXPR + "/e:msgQ/e:qDate/text()"; private static final String MSGQ_MSG_EXPR = RESPONSE_EXPR + "/e:msgQ/e:msg/text()"; private static final String MSGQ_MSG_LANG_EXPR = RESPONSE_EXPR + "/e:msgQ/e:msg/@lang"; private static final String CLTRID_EXPR = RESPONSE_EXPR + "/e:trID/e:clTRID/text()"; private static final String SVTRID_EXPR = RESPONSE_EXPR + "/e:trID/e:svTRID/text()"; protected Result[] resultArray; private String clTRID, svTRID; private int msgCount; private String msgID; private GregorianCalendar qDate; private String msg; private String msgLang = DEFAULT_LANGUAGE; private XMLDocument xmlDoc; private final List<ResponseExtension> extensions; public Response() { extensions = new Vector<ResponseExtension>(1); } /** * Get as Result instances the /epp/response/results elements contained in the EPP response modelled by this object. * * @return /epp/response/result/* */ public Result[] getResults() { return resultArray; } /** * @return /epp/response/trID/clTRID/text() */ public String getCLTRID() { return clTRID; } /** * @return /epp/response/trID/svTRID/text() */ public String getSVTRID() { return svTRID; } /** * @return /epp/response/msgQ/qDate/text() */ public GregorianCalendar getMessageEnqueueDate() { return qDate; } /** * @return /epp/response/msgQ/msg/text() */ public String getMessage() { return msg; } /** * @return /epp/response/msgQ/msg/@lang/text() */ public String getMessageLanguage() { return msgLang; } /** * @return /epp/response/msgQ/@count/text() */ public int getMsgCount() { return msgCount; } /** * @return /epp/response/msgQ/@id/text() */ public String getMsgID() { return msgID; } @Override public void fromXML(final XMLDocument xmlDocArg) { debugLogger.finest("enter"); xmlDoc = xmlDocArg; try { final int resultCount = xmlDoc.getNodeCount(RESULT_COUNT_EXPR); resultArray = new Result[resultCount]; for (int i = 0; i < resultCount; i++) { final String qry = ReceiveSE.replaceIndex(RESULT_EXPR, i + 1); final String code = xmlDoc.getNodeValue(qry + RESULT_CODE_EXPR); final String message = xmlDoc.getNodeValue(qry + RESULT_MSG_EXPR); final NodeList value = xmlDoc.getElements(qry + RESULT_VALUE_EXPR); final NodeList extValues = xmlDoc.getElements(qry + RESULT_XVALUE_EXPR); Node[] valueNodes = null; String[] reasons = null; if (extValues != null) { final int xValCount = extValues.getLength(); valueNodes = new Node[xValCount]; reasons = new String[xValCount]; for (int j = 0; j < xValCount; j++) { final Node extValueNode = extValues.item(j); valueNodes[j] = extValueNode.getFirstChild(); reasons[j] = extValueNode.getLastChild().getTextContent(); } } resultArray[i] = new Result(Integer.parseInt(code), message, value, valueNodes, reasons); debugLogger.finer(resultArray[i].toString()); } final String msgQcount = xmlDoc.getNodeValue(MSGQ_COUNT_EXPR); if (msgQcount != null && msgQcount.length() > 0) { msgCount = Integer.parseInt(msgQcount); } msgID = xmlDoc.getNodeValue(MSGQ_ID_EXPR); final String msgQqDate = xmlDoc.getNodeValue(MSGQ_QDATE_EXPR); if (msgQqDate != null && msgQqDate.length() > 0) { qDate = EPPDateFormatter.fromXSDateTime(msgQqDate); } msg = xmlDoc.getNodeValue(MSGQ_MSG_EXPR); msgLang = xmlDoc.getNodeValue(MSGQ_MSG_LANG_EXPR); clTRID = xmlDoc.getNodeValue(CLTRID_EXPR); svTRID = xmlDoc.getNodeValue(SVTRID_EXPR); for (ResponseExtension extension : extensions) { extension.fromXML(xmlDoc); } } catch (final XPathExpressionException xpee) { String exceptionMessage = xpee.getMessage(); if (exceptionMessage == null) { Throwable cause = xpee.getCause(); if (cause != null) { exceptionMessage = cause.getMessage(); } else { exceptionMessage = "Unknown error"; } } maintLogger.warning(exceptionMessage); userLogger.warning(ErrorPkg.getMessage("Response.fromXML.0", "<<msg>>", exceptionMessage)); } debugLogger.finest("exit"); } public void registerExtension(final ResponseExtension extension) { extensions.add(extension); } @Override public String toString() { String retval = "(msgCount = " + getMsgCount() + ")(msgID = " + getMsgID() + ")(msg = " + msg + ")(qDate = " + getMessageEnqueueDate() + ")(clTRID = " + getCLTRID() + ")(svTRID = " + getSVTRID() + ")"; retval += arrayToString(resultArray, "\n"); return retval; } public String getSourceXMLString() { return xmlDoc.getSourceXMLString(); } }