package gov.nist.registry.ws.evs;
import gov.nist.registry.common2.exception.XdsInternalException;
import gov.nist.registry.common2.registry.MetadataSupport;
import gov.nist.registry.ws.serviceclasses.XdsService;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import javax.xml.namespace.QName;
import org.apache.axiom.om.OMElement;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openhealthtools.openxds.log.LoggerException;
import org.openhealthtools.openxds.log.Message;
public class Evs extends XdsService {
private static final Log logger = LogFactory.getLog(Evs.class);
void init() throws LoggerException { startTransactionLog(); }
void done() { stopTransactionLog(); }
public String getReport(String messageId) {
String reportTxt = null;
try {
init();
Message m = log.readMessage(messageId);
OMElement report = buildReport(m);
reportTxt = report.toString();
done();
} catch (Exception e) {
if (reportTxt == null)
reportTxt = "<XdsEvsResult><InternalError>" + e.getMessage() + "</InternalError></XdsEvsResult>";
}
finally {
done();
}
return reportTxt;
}
boolean verifyTables(Message m) {
HashSet <String> tableList = m.getTableList();
boolean hasMain = tableList.contains("main");
boolean hasOther = tableList.contains("other");
boolean hasHttp = tableList.contains("http");
boolean hasSoap = tableList.contains("soap");
boolean hasError = tableList.contains("error");
return hasMain && hasOther && hasHttp && hasSoap && hasError;
}
String index(Message m) {
HashMap<String, HashMap<String, Object>> mm = m.toHashMap();
StringBuffer buf = new StringBuffer();
for (String key : mm.keySet()) {
buf.append("\n" + key + "\n" + mm.get(key).keySet());
}
return buf.toString();
}
Object getParm(HashMap<String, HashMap<String, Object>> mm,String section, String parm) {
return mm.get(section).get(parm);
}
void addParm(OMElement report, HashMap<String, HashMap<String, Object>> mm, String name, String section, String parm) {
Object value = getParm(mm, section, parm);
if (value instanceof String) {
OMElement ele = MetadataSupport.om_factory.createOMElement(new QName(name));
String txt = (String) value;
txt = extractPrefix(txt);
ele.setText(txt);
report.addChild(ele);
} else {
ArrayList<String> txts = (ArrayList<String>) value;
for (String txt : txts) {
OMElement ele = MetadataSupport.om_factory.createOMElement(new QName(name));
txt = extractPrefix(txt);
ele.setText(txt);
report.addChild(ele);
}
}
}
private String extractPrefix(String txt) {
int colonI = txt.indexOf(':');
if (colonI != -1) {
if (txt.charAt(colonI+1) == ' ' || txt.charAt(colonI+1) == '\t')
txt = txt.substring(colonI+2).trim();
}
return txt;
}
OMElement buildReport(Message m) throws XdsInternalException {
if (!verifyTables(m)) {
throw new XdsInternalException("Missing Table");
}
if (logger.isDebugEnabled()) {
logger.debug(index(m));
}
HashMap<String, HashMap<String, Object>> mm = m.toHashMap();
OMElement report = MetadataSupport.om_factory.createOMElement(new QName("XdsEvsResult"));
addParm(report, mm, "Test", "other", "Service");
addParm(report, mm, "Date", "main", "Timestamp");
addParm(report, mm, "Source", "http", "IP_address_From");
OMElement ele = MetadataSupport.om_factory.createOMElement(new QName("Target"));
ele.setText(localIPAddress());
report.addChild(ele);
addParm(report, mm, "Endpoint", "http", "URI_To");
addParm(report, mm, "Result", "main", "Pass");
addParm(report, mm, "LogEvent", "main", "MessageId");
addParm(report, mm, "Error", "error", "Error");
logger.error("errors are:\n" + mm.get("error"));
return report;
}
public static void main(String[] args) {
if (args.length != 1) {
System.out.println("Usage: Evs messageId");
System.exit(-1);
}
String messageId = args[0];
Evs evs = new Evs();
System.out.println(evs.getReport(messageId));
}
String localIPAddress() {
try
{
java.net.InetAddress localMachine =
java.net.InetAddress.getLocalHost();
return localMachine.getHostAddress();
}
catch(java.net.UnknownHostException uhe)
{
//handle exception
}
return "unknown";
}
}