package com.ausregistry.jtoolkit2.se;
import java.io.Serializable;
import java.util.GregorianCalendar;
import javax.xml.xpath.XPathExpressionException;
import com.ausregistry.jtoolkit2.EPPDateFormatter;
import com.ausregistry.jtoolkit2.xml.XMLDocument;
/**
* Provides access to EPP server parameters as published in an EPP greeting
* service element.
*
*/
public final class Greeting extends ReceiveSE {
private static final long serialVersionUID = 4358903746268469400L;
private static final String GREETING_EXPR = "/e:epp/e:greeting";
private static final String DCP_EXPR = GREETING_EXPR + "/e:dcp";
private static final String SVID_EXPR = GREETING_EXPR + "/e:svID/text()";
private static final String SVDATE_EXPR = GREETING_EXPR + "/e:svDate/text()";
private static final String VERSIONS_EXPR = GREETING_EXPR + "/e:svcMenu/e:version";
private static final String LANGS_EXPR = GREETING_EXPR + "/e:svcMenu/e:lang";
private static final String OBJ_URIS_EXPR = GREETING_EXPR + "/e:svcMenu/e:objURI";
private static final String EXT_URIS_EXPR = GREETING_EXPR + "/e:svcMenu/e:svcExtension/e:extURI";
private static final String ACCESS_EXPR = DCP_EXPR + "/e:access/*[1]";
private static final String EXPIRY_EXPR = DCP_EXPR + "/e:expiry/*[1]";
private static final String STMT_COUNT_EXPR = "count(" + DCP_EXPR + "/e:statement)";
private static final String STMT_IND_EXPR = DCP_EXPR + "/e:statement[IDX]";
private static final String PURPOSE_EXPR = "/e:purpose";
private static final String RECIPIENT_EXPR = "/e:recipient";
private static final String RETENTION_EXPR = "/e:retention/*[1]";
private String svID;
private GregorianCalendar svDate;
private String[] versions;
private String[] langs;
private String[] objURIs;
private String[] extURIs;
private String dcpAccess;
private String dcpExpiry;
private DCPStatement[] dcpStatements;
public Greeting() {
super();
}
public String getServerID() {
return svID;
}
public GregorianCalendar getServerDateTime() {
return svDate;
}
public String[] getProtocolVersions() {
return versions;
}
public String[] getLanguages() {
return langs;
}
public String[] objURIs() {
return objURIs;
}
public String[] extURIs() {
return extURIs;
}
public String dcpAccess() {
return dcpAccess;
}
public String dcpExpiry() {
// Known limitation: actual expiry date or period is not available.
return dcpExpiry;
}
public DCPStatement[] getDataCollectionPolicyStatements() {
return dcpStatements;
}
@Override
public String toString() {
String versionString = arrayToString(versions, ",");
String langString = arrayToString(langs, ",");
String objURIString = arrayToString(objURIs, ",");
String retval = "(svID = " + getServerID() + ")" + "(svDate = "
+ getServerDateTime() + ")" + "(versions = (" + versionString
+ "))" + "(languages = (" + langString + "))" + "(objURIs = ("
+ objURIString + "))";
return retval;
}
@Override
public void fromXML(XMLDocument xmlDoc) {
debugLogger.finest("enter");
try {
debugLogger.info(xmlDoc.toString());
svID = xmlDoc.getNodeValue(SVID_EXPR);
String svDateText = xmlDoc.getNodeValue(SVDATE_EXPR);
svDate = EPPDateFormatter.fromXSDateTime(svDateText);
versions = xmlDoc.getNodeValues(VERSIONS_EXPR);
langs = xmlDoc.getNodeValues(LANGS_EXPR);
objURIs = xmlDoc.getNodeValues(OBJ_URIS_EXPR);
extURIs = xmlDoc.getNodeValues(EXT_URIS_EXPR);
dcpAccess = xmlDoc.getNodeName(ACCESS_EXPR);
dcpExpiry = xmlDoc.getNodeName(EXPIRY_EXPR);
int dcpStmtCount = xmlDoc.getNodeCount(STMT_COUNT_EXPR);
dcpStatements = new DCPStatement[dcpStmtCount];
for (int i = 0; i < dcpStmtCount; i++) {
String qry = ReceiveSE.replaceIndex(STMT_IND_EXPR, i + 1);
dcpStatements[i] = new DCPStatement(xmlDoc.getChildNames(qry
+ PURPOSE_EXPR), xmlDoc.getChildNames(qry
+ RECIPIENT_EXPR), xmlDoc.getNodeName(qry
+ RETENTION_EXPR));
}
} catch (XPathExpressionException xpee) {
maintLogger.warning(xpee.getMessage());
}
debugLogger.info(toString());
debugLogger.finest("exit");
}
/**
* Provides access to the data collection policy statement parameter values
* reported by an EPP server in a Greeting compliant with the greeting
* specification in RFC5730.
*/
public static final class DCPStatement implements Serializable {
private static final long serialVersionUID = -589856890805744448L;
private String[] purposes;
private String[] recipients;
private String retention;
DCPStatement(String[] purposes, String[] recipients,
String retentionPolicy) {
this.purposes = purposes;
this.recipients = recipients;
this.retention = retentionPolicy;
}
public String[] getPurpose() {
return purposes;
}
public String[] getRecipients() {
// Known limitation: the recDesc child of 'ours' is not recorded.
return recipients;
}
public String getRetentionPolicy() {
return retention;
}
}
}