package gov.nist.registry.ws.serviceclasses;
import gov.nist.registry.common2.exception.XdsException;
import gov.nist.registry.common2.exception.XdsInternalException;
import gov.nist.registry.common2.registry.MetadataSupport;
import gov.nist.registry.common2.registry.RegistryUtility;
import gov.nist.registry.ws.testvalidator.LogModel;
import gov.nist.registry.ws.testvalidator.Response;
import java.util.Arrays;
import java.util.List;
import javax.xml.namespace.QName;
import org.apache.axiom.om.OMElement;
import org.openhealthtools.openxds.log.LoggerException;
public class TestValidator extends XdsService {
boolean log;
public boolean success;
int test;
public OMElement ValidateTestRequest(OMElement request) {
this.beginTransaction("TestValidator", request, REGISTRY_ACTOR);
log_message.setTestMessage("TestValidator");
return validate(request);
}
public TestValidator() { log = true; success = true; }
public TestValidator(boolean log) {
this.log = log;
success = true;
}
public OMElement validate(OMElement request) {
OMElement test_ele = MetadataSupport.firstChildWithLocalName(request, "Test");
if (test_ele == null) return fatal_error("Test element not present in request");
String test_str = test_ele.getText();
if (test_str == null) return fatal_error("Test element does not contain a test number");
test = 0;
try {
test = Integer.parseInt(test_str);
}
catch (NumberFormatException e) {
return fatal_error("Test number, " + test_str + ", is not an integer");
}
List<OMElement> logs = MetadataSupport.childrenWithLocalName(request, "Log");
LogModel lm = new LogModel(test_str);
for (OMElement log : logs) {
OMElement test_result = log.getFirstChildWithName(new QName("TestResults"));
if (test_result == null)
test_result = log.getFirstChildWithName(new QName("XdsEvsResult"));
try {
lm.addLog(test_result);
}
catch (XdsInternalException e) {
return fatal_error(RegistryUtility.exception_details(e));
}
catch (XdsException e) {
return error(RegistryUtility.exception_details(e));
}
}
try {
if (log)
log_message.addOtherParam("testnum", test_str);
} catch (LoggerException e) {}
return evaluateTestDetails(test_str, lm);
}
private OMElement evaluateTestDetails(String test_str, LogModel lm) {
try {
String errors = "";
switch (test) {
case 11733:
case 11735:
case 11751:
case 11879:
case 11880:
case 11877:
case 11885:
case 11883:
case 11827:
case 11982:
case 11990:
case 11991:
case 11999:
case 12000:
case 11997:
case 12004:
case 12084:
case 11966:
case 11979:
case 11983:
errors = eval_basic(lm, Arrays.asList("submit", "eval"));
break;
case 12048:
errors = eval_basic(lm, Arrays.asList("submit", "apnd"));
break;
case 11875:
case 11878:
case 11992:
case 11995:
errors = eval_basic(lm, Arrays.asList("submit", "rplc", "eval"));
break;
case 11:
errors = eval_basic(lm, Arrays.asList("submit", "retrieve"));
break;
case 12021:
case 12024:
case 12028:
case 12029:
case 12045:
case 12088:
case 12089:
errors = eval_basic(lm, Arrays.asList("submit", "query", "retrieve"));
break;
case 11873:
case 11993:
case 12022:
errors = eval_basic(lm, Arrays.asList("submit", "rplc", "apnd", "eval"));
break;
case 11874:
case 11994:
errors = eval_basic(lm, Arrays.asList("submit", "rplc", "xfrm", "eval"));
break;
case 11871:
errors = eval_basic(lm, Arrays.asList("submit", "rplc", "rpl2", "eval"));
break;
case 11881:
case 11882:
case 12001:
case 12002:
case 12325:
case 12326:
errors = eval_basic(lm, Arrays.asList("create_folder", "add_to_folder", "eval"));
break;
case 11897:
case 11898:
case 11903:
case 11905:
case 11906:
errors = eval_basic(lm, Arrays.asList("SOAP12"));
break;
case 12321:
errors = eval_basic(lm, Arrays.asList("optimized", "unoptimized"));
break;
case 11746:
case 11728:
case 11729:
case 11730:
case 11801:
case 11802:
case 11876:
case 11887:
case 11901:
case 11904:
case 11909:
case 11980:
case 11996:
case 12049:
case 12047:
case 11970:
case 11981:
case 11969:
case 11972:
case 11973:
case 11974:
case 11986:
case 11907:
case 11908:
case 11902:
case 11899:
case 12038:
case 12083:
case 12093:
case 12309:
case 12310:
case 12311:
case 12312:
case 12320:
case 12322:
case 12323:
case 12324:
case 12327:
case 12328:
case 12051:
case 12052:
case 12053:
case 12054:
case 12055:
case 12087:
errors = eval_basic(lm, Arrays.asList(test_str));
break;
case 11734:
return success();
default:
return not_implemented();
}
if (errors.length() != 0)
return error(errors);
return success();
}
catch (XdsInternalException e) {
return fatal_error(RegistryUtility.exception_details(e));
}
catch (XdsException e) {
return error(RegistryUtility.exception_details(e));
}
}
OMElement error(String msg) {
Response res = new Response();
res.addError(msg);
if (log)
this.addError(msg);
if (log)
this.endTransaction(false);
success = false;
return res.toXml();
}
OMElement fatal_error(String msg) {
Response res = new Response();
res.addFatalError(msg);
if (log)
this.addError(msg);
if (log)
this.endTransaction(false);
success = false;
return res.toXml();
}
OMElement not_implemented() {
Response res = new Response();
res.setNotImplemented();
if (log)
this.addOther("status", Response.status_notimplemented);
if (log)
log_message.setPass(true);
if (log)
this.endTransaction(true);
success = false;
return res.toXml();
}
OMElement success() {
Response res = new Response();
if (log)
this.addOther("status", Response.status_success);
if (log)
log_message.setPass(true);
if (log)
this.endTransaction(true);
success = true;
return res.toXml();
}
String eval_basic(LogModel lm, List<String> subtests) throws XdsInternalException, XdsException {
StringBuffer sb = new StringBuffer();
for (String subtest : subtests) {
lm.checkFatalError(subtest);
if ( !lm.hasSubtest(subtest)) sb.append("Log for sub-test " + subtest + " not found\n");
if ( !lm.isPass(subtest)) sb.append("Log for sub-test " + subtest + " shows failure");
}
return sb.toString();
}
}