package gov.samhsa.acs.trypolicy;
import gov.samhsa.acs.brms.domain.SubjectPurposeOfUse;
import gov.samhsa.acs.brms.domain.XacmlResult;
import gov.samhsa.acs.common.dto.PdpRequestResponse;
import gov.samhsa.acs.common.dto.XacmlRequest;
import gov.samhsa.acs.common.dto.XacmlResponse;
import gov.samhsa.acs.common.tool.SimpleMarshaller;
import gov.samhsa.acs.contexthandler.ContextHandler;
import gov.samhsa.acs.dss.ws.schema.DSSRequest;
import gov.samhsa.acs.dss.ws.schema.DSSResponse;
import gov.samhsa.acs.dss.wsclient.DSSWebServiceClient;
import gov.samhsa.acs.trypolicy.exception.TryPolicyException;
import java.util.UUID;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PolicyTryingImpl implements PolicyTrying {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
public static final boolean AUDITED = false;
public static final boolean AUDIT_FAILURE_BY_PASS = true;
private final ContextHandler contextHandler;
private final SimpleMarshaller marshaller;
private final DSSWebServiceClient documentSegmentation;
public PolicyTryingImpl(ContextHandler contextHandler,
SimpleMarshaller marshaller,
DSSWebServiceClient documentSegmentation) {
super();
this.contextHandler = contextHandler;
this.marshaller = marshaller;
this.documentSegmentation = documentSegmentation;
}
@Override
public String tryPolicy(String c32Xml, String xacmlPolicy,
String purposeOfUse) throws TryPolicyException {
final String messageId = UUID.randomUUID().toString();
DSSResponse segmentDocumentResponse;
try {
final PdpRequestResponse pdpRequestResponse = contextHandler
.makeDecisionForTryingPolicy(xacmlPolicy, purposeOfUse);
final XacmlResponse xacmlResponse = pdpRequestResponse
.getXacmlResponse();
final XacmlRequest xacmlRequest = pdpRequestResponse
.getXacmlRequest();
final XacmlResult xacmlResult = createXacmlResult(xacmlRequest,
xacmlResponse);
final String enforcementPolicies = marshaller.marshal(xacmlResult);
final DSSRequest request = new DSSRequest();
request.setDocumentXml(c32Xml);
request.setEnforcementPoliciesXml(enforcementPolicies);
request.setAudited(AUDITED);
request.setAuditFailureByPass(AUDIT_FAILURE_BY_PASS);
request.setEnableTryPolicyResponse(Boolean.TRUE);
segmentDocumentResponse = documentSegmentation
.segmentDocument(request);
} catch (final Throwable t) {
logger.error(messageId, "Error in tryPolicy", t);
throw new TryPolicyException(t);
}
return segmentDocumentResponse.getTryPolicyDocumentXml();
}
private XacmlResult createXacmlResult(XacmlRequest xacmlRequest,
XacmlResponse xacmlResponse) {
final XacmlResult xacmlResult = new XacmlResult();
xacmlResult.setHomeCommunityId(xacmlRequest.getHomeCommunityId());
xacmlResult.setMessageId(xacmlRequest.getMessageId());
xacmlResult.setPdpDecision(xacmlResponse.getPdpDecision());
xacmlResult.setPdpObligations(xacmlResponse.getPdpObligation());
xacmlResult.setSubjectPurposeOfUse(SubjectPurposeOfUse
.fromAbbreviation(xacmlRequest.getPurposeOfUse()));
xacmlResult.setPatientId(xacmlRequest.getPatientId());
return xacmlResult;
}
}