package gov.samhsa.spirit.pep.wsclient;
import gov.samhsa.spirit.pep.util.SpiritPepUtil;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSOutput;
import org.w3c.dom.ls.LSSerializer;
import com.spirit.ehr.ws.client.generated.EhrException;
import com.spirit.ehr.ws.client.generated.EhrException_Exception;
import com.spirit.ehr.ws.client.generated.EhrPolicySubmitOrUpdateRq;
import com.spirit.ehr.ws.client.generated.EhrPolicySubmitOrUpdateRsp;
import com.spirit.ehr.ws.client.generated.EhrWsEmptyReq;
import com.spirit.ehr.ws.client.generated.NiUserRequest;
import com.spirit.ehr.ws.client.generated.SpiritSimpleLoginRequest;
import com.spirit.ehr.ws.client.generated.SpiritUserClientDto;
import com.spirit.ehr.ws.client.generated.SpiritUserResponse;
import com.spirit.ehr.ws.interfaces.InterfaceFactory;
import com.spirit.ehr.ws.interfaces.SpiritEhrWsClientRqRspInterface;
public class SpiritPublishConsentClient {
// Declare the SpiritEhrWsClientRqRspInterface
private static SpiritEhrWsClientRqRspInterface webService;
private SpiritPepUtil spiritPepUtil = new SpiritPepUtil();
/** The logger. */
private static Logger logger = LoggerFactory
.getLogger(SpiritPublishConsentClient.class);
// Constructor which gets the endpoint address of the EhrWsRemote
public SpiritPublishConsentClient(String endpointUrl) {
// Initialize via InterfaceFactory
webService = InterfaceFactory.createEhrWsRqRspInterface(endpointUrl);
}
/**
* @param usrName
* - the usrName used for login
* @param role
* - the role to login for
* @param org
* - the organisation to log into
* @param addAttibXml
* - the SAML2-xml-file holding some additional attributes
* @return
* @throws Exception
*/
public SpiritUserClientDto initUser(String usrName, String role,
String org, File addAttibXml) throws Exception {
try {
// Parse an xml holding saml2-attributes
Element[] additionalAttributes = SpiritPepUtil.parse(addAttibXml);
NiUserRequest rq = new NiUserRequest();
rq.setUsername(usrName);
rq.setRole(role);
rq.setOrganisation(org);
if (additionalAttributes != null) {
Document document = spiritPepUtil
.elementArrayToDocument(additionalAttributes);
DOMImplementationLS domImplementation = (DOMImplementationLS) document
.getImplementation();
LSOutput lsOutput = domImplementation.createLSOutput();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
lsOutput.setByteStream(byteArrayOutputStream);
try {
LSSerializer lsSerializer = domImplementation
.createLSSerializer();
lsSerializer.write(document, lsOutput);
} catch (Exception e) {
e.printStackTrace();
throw new EhrException_Exception(e.getMessage(),
new EhrException(), e);
}
rq.setAdditionalAttributes(byteArrayOutputStream.toByteArray());
}
// Init User
SpiritUserClientDto usr = webService.initUser(rq).getUser();
logger.info("initUser: SUCCESS");
return usr;
} catch (Exception e) {
logger.error("initUser: FAILED", e);
throw e;
}
}
/**
* @param userName
* - The user name used for login
* @param userPassword
* - The password of this user
* @param organisation
* - The organisation of the user
* @param role
* - The role of the user
* @return SpiritUserClientDto
* @throws Exception
*/
public String usrLogin(String userName, String userPassword,
String organisation, String role) throws Exception {
try {
// Print status
logger.info("One-step-usrLogin: START");
// Print used login data
logger.debug("One-step-usrLogin: Used login data: " + userName
+ " / " + "**********");
// Create a SimpleLoginRequest (needed to send the login)
SpiritSimpleLoginRequest loginRequest = new SpiritSimpleLoginRequest();
// Set login information: username, password, role and organization
loginRequest.setUser(userName);
loginRequest.setPwd(userPassword);
loginRequest.setRol(role);
loginRequest.setOrg(organisation);
// Print status
logger.debug("One-step-usrLogin: Logging in...");
// Send the SimpleLoginRequest to the webservice
SpiritUserResponse userResponse = webService.usrLogin(loginRequest);
// Print status
logger.debug("One-step-usrLogin: Login successful!");
logger.debug("One-step-usrLogin: userDN = "
+ userResponse.getUser().getUserDN());
logger.debug("One-step-usrLogin: stateId= "
+ userResponse.getStateID());
// Print status
logger.info("One-step-usrLogin: SUCCESS");
// Return the logged-in user
return userResponse.getStateID();
} catch (Exception e) {
logger.error("One-step-usrLogin: FAILED", e);
throw e;
}
}
/**
* @param spiritSimpleLoginRequest
* - Filled SpiritSimpleLoginRequest
* @return SpiritUserClientDto
* @throws Exception
*/
public String usrLogin(SpiritSimpleLoginRequest spiritSimpleLoginRequest)
throws Exception {
try {
// Print status
logger.info("One-step-usrLogin: START");
// Print used login data
logger.debug("One-step-usrLogin: Used login data: "
+ spiritSimpleLoginRequest.getUser() + " / "
+ spiritSimpleLoginRequest.getPwd());
// Print status
logger.debug("One-step-usrLogin: Logging in...");
// Send the SimpleLoginRequest to the webservice
SpiritUserResponse userResponse = webService
.usrLogin(spiritSimpleLoginRequest);
// Print status
logger.debug("One-step-usrLogin: Login successful!");
logger.debug("One-step-usrLogin: userDN = "
+ userResponse.getUser().getUserDN());
logger.debug("One-step-usrLogin: stateId= "
+ userResponse.getStateID());
// Print status
logger.info("One-step-usrLogin: SUCCESS");
// Return the logged-in user
return userResponse.getStateID();
} catch (Exception e) {
logger.error("One-step-usrLogin: FAILED", e);
throw e;
}
}
/**
* @param policyList
* - A list of policies to update or submit
* @return EhrPolicyUpdateRsp
* @throws Exception
*/
public EhrPolicySubmitOrUpdateRsp submitOrUpdatePolicies(
List<byte[]> policyList, String stateId) throws Exception {
try {
// Print status
logger.info("submitOrUpdatePolicies: START");
// Create a request
EhrPolicySubmitOrUpdateRq ehrPolicySubmitOrUpdateRq = new EhrPolicySubmitOrUpdateRq();
// Add the required information of the request
// Add policies to submit or update
ehrPolicySubmitOrUpdateRq.getPolicyList().addAll(policyList);
ehrPolicySubmitOrUpdateRq.setStateID(stateId);
// Call the webservice-method submitOrUpdatePolicies with the
// created request
EhrPolicySubmitOrUpdateRsp ehrPolicySubmitOrUpdateRsp = webService
.submitOrUpdatePolicies(ehrPolicySubmitOrUpdateRq);
// Print status
logger.info("submitOrUpdatePolicies: SUCCESS");
// Return the response
return ehrPolicySubmitOrUpdateRsp;
} catch (Exception e) {
logger.info("submitOrUpdatePolicies: FAILED", e);
throw e;
}
}
/**
* @throws Exception
*/
public void usrLogout() throws Exception {
try {
webService.usrLogout(new EhrWsEmptyReq());
logger.info("usrLogout: SUCCESS");
} catch (Exception e) {
logger.error("usrLogout: FAILED", e);
throw e;
}
}
/**
*
* Main-Method
*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
try {
// Instance the client class and pass the endpoint address
String endpointUrlAndPort = "http://216.59.44.169:8181";
SpiritPublishConsentClient myEhrClient = new SpiritPublishConsentClient(
endpointUrlAndPort);
// Print status
logger.info("usrLoginExampleWorkflow: START");
// /////////////////////////////////////////////////////////////////////////////////////
// (1) Login (usrLogin_1_Step)
// /////////////////////////////////////////////////////////////////////////////////////
// Print status
logger.info("usrLoginExampleWorkflow: Calling usrLogin_1_Step");
// UsrLogin_1_Step
String stateId = myEhrClient.usrLogin("wsAdmin", "spirit4c2s",
"C2S Health", "Admin");
/*
* // UsrLogin_1_Step ClassLoader classloader1 =
* Thread.currentThread() .getContextClassLoader(); URL resource1 =
* classloader1.getResource("SamlAttributesSample.xml"); File
* addAttrFile = new File(resource1.toURI());
*
* SpiritUserClientDto loggedInUser =
* myEhrClient.initUser("wsAdmin", "Admin", "C2S Health",
* addAttrFile);
*
* // Print status logger.info("initUserExampleWorkflow: Success" +
* loggedInUser.getBase64IdentityAssertion());
*
* byte[] decodeds1 =
* DatatypeConverter.parseBase64Binary(loggedInUser
* .getBase64IdentityAssertion());
*
* // Print status logger.info("decoded string : " + new
* String(decodeds1));
*/
// /////////////////////////////////////////////////////////////////////////////////////
// (2) Load the PAP-Configuration (loadPapConfiguration)
// /////////////////////////////////////////////////////////////////////////////////////
// Print status
logger.info("submitOrUpdatePoliciesExampleWorkflow: Calling loadPapConfiguration");
// Load the PAP-Configuration
ClassLoader classloader = Thread.currentThread()
.getContextClassLoader();
URL resource2 = classloader.getResource("XACMLPolicy.xml");
// File xacmlFile = new File(resource2.toURI());
Path path = Paths.get(resource2.toURI());
byte[] policiesToSubmitOrUpdate = Files.readAllBytes(path);
// List<byte[]> policiesToSubmitOrUpdate = xacmlFile.rea
// /////////////////////////////////////////////////////////////////////////////////////
// (3) Submit Or Update Policies (submitOrUpdatePolicies)
// /////////////////////////////////////////////////////////////////////////////////////
// Print status
logger.info("submitOrUpdatePoliciesExampleWorkflow: Calling submitOrUpdatePolicies");
// SubmitOrUpdatePolicies
EhrPolicySubmitOrUpdateRsp ehrPolicySubmitOrUpdateRsp = myEhrClient
.submitOrUpdatePolicies(
Arrays.asList(policiesToSubmitOrUpdate), stateId);
// Print status
logger.info("ehrPolicySubmitOrUpdateRsp:"
+ ehrPolicySubmitOrUpdateRsp.getStateID());
// /////////////////////////////////////////////////////////////////////////////////////
// (4) Logout (usrLogout)
// /////////////////////////////////////////////////////////////////////////////////////
// Print status
logger.info("submitOrUpdatePoliciesExampleWorkflow: Calling usrLogout");
// UsrLogout
myEhrClient.usrLogout();
// Print status
logger.info("submitOrUpdatePoliciesExampleWorkflow: SUCCESS");
} catch (Exception e) {
logger.error("initUserExampleWorkflow: FAILED", e);
throw e;
}
}
}