package gov.samhsa.acs.pep.wsclient;
import gov.samhsa.acs.common.tool.SimpleMarshallerImpl;
import gov.samhsa.acs.pep.security.CredentialProvider;
import gov.samhsa.ds4ppilot.contract.pep.PepPortType;
import ihe.iti.xds_b._2007.RetrieveDocumentSetRequest;
import ihe.iti.xds_b._2007.RetrieveDocumentSetResponse;
import java.util.LinkedList;
import java.util.Scanner;
import oasis.names.tc.ebxml_regrep.xsd.query._3.AdhocQueryRequest;
import oasis.names.tc.ebxml_regrep.xsd.query._3.AdhocQueryResponse;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.ws.security.SecurityConstants;
import org.apache.cxf.ws.security.tokenstore.SecurityToken;
import org.apache.cxf.ws.security.tokenstore.TokenStore;
import org.apache.wss4j.common.util.DOM2Writer;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.w3c.dom.Element;
@Configurable
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:/META-INF/spring/applicationContext*.xml")
@ActiveProfiles("test")
public class PepClientIT {
private static Logger logger = LoggerFactory
.getLogger(PepWebServiceClient.class);
@Spy
private PepWebServiceClient client;
@Autowired
private CredentialProvider credentialProvider;
@Before
public void setUp() throws Exception {
final String address = "http://localhost:8080/Pep/services/PepService";
client = new PepWebServiceClient(address, credentialProvider);
MockitoAnnotations.initMocks(this);
}
@Test
public void testPep() throws Exception {
final AdhocQueryResponse response1 = client
.registryStoredQuery(constructAdhocQuery());
// TODO (BU): search alternative way for logging security token
// (ie: cxf logging interceptors?)
// printSecurityToken(client.getPort());
final SimpleMarshallerImpl marshaller = new SimpleMarshallerImpl();
logger.debug("Adhoc Response: " + marshaller.marshal(response1));
final Scanner scan = new Scanner(System.in);
logger.debug("Please enter documentUniqueId:");
final LinkedList<String> documentIds = new LinkedList<String>();
boolean go = false;
while (!go && scan.hasNextLine()) {
final String command = scan.nextLine();
if ("go".equalsIgnoreCase(command)) {
go = true;
} else {
documentIds.add(command);
}
}
scan.close();
RetrieveDocumentSetResponse retrieveDocResp = null;
try {
retrieveDocResp = client
.retrieveDocumentSet(constructRetrieveDocumentRequest(documentIds));
} catch (final Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw e;
}
logger.debug("Retrieve Response: "
+ marshaller.marshal(retrieveDocResp));
if (null == retrieveDocResp.getDocumentResponse()) {
logger.debug(new String(retrieveDocResp.getDocumentResponse()
.get(0).getDocument()));
}
}
private static AdhocQueryRequest constructAdhocQuery() throws Exception {
final SimpleMarshallerImpl marshaller = new SimpleMarshallerImpl();
final String reqString = " <ns3:AdhocQueryRequest xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:ns2=\"urn:oasis:names:tc:ebxml-regrep:xsd:rs:3.0\" xmlns=\"urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0\" xmlns:ns3=\"urn:oasis:names:tc:ebxml-regrep:xsd:query:3.0\"><ns3:ResponseOption returnType=\"LeafClass\" returnComposedObjects=\"true\"/><AdhocQuery id=\"urn:uuid:14d4debf-8f97-4251-9a74-a90016b0af0d\"><Slot name=\"$XDSDocumentEntryPatientId\"><ValueList><Value>'d3bb3930-7241-11e3-b4f7-00155d3a2124^^^&2.16.840.1.113883.4.357&ISO'</Value></ValueList></Slot><Slot name=\"$XDSDocumentEntryStatus\"><ValueList><Value>('urn:oasis:names:tc:ebxml-regrep:StatusType:Approved')</Value></ValueList></Slot><Slot name=\"$XDSDocumentEntryFormatCode\"><ValueList><Value>'2.16.840.1.113883.10.20.1^^HITSP'</Value></ValueList></Slot></AdhocQuery></ns3:AdhocQueryRequest>";
final AdhocQueryRequest request = marshaller.unmarshalFromXml(
AdhocQueryRequest.class, reqString);
return request;
}
private static RetrieveDocumentSetRequest constructRetrieveDocumentRequest(
LinkedList<String> documentIds) throws Exception {
final SimpleMarshallerImpl marshaller = new SimpleMarshallerImpl();
final StringBuilder builder = new StringBuilder();
builder.append("<urn:RetrieveDocumentSetRequest xmlns:urn=\"urn:ihe:iti:xds-b:2007\">");
for (final String documentId : documentIds) {
builder.append("<urn:DocumentRequest><urn:RepositoryUniqueId>1.3.6.1.4.1.21367.2010.1.2.1040</urn:RepositoryUniqueId><urn:DocumentUniqueId>");
builder.append(documentId);
builder.append("</urn:DocumentUniqueId></urn:DocumentRequest>");
}
builder.append("</urn:RetrieveDocumentSetRequest>");
final RetrieveDocumentSetRequest request = marshaller.unmarshalFromXml(
RetrieveDocumentSetRequest.class, builder.toString());
logger.debug("RetrieveDocumentSetRequest XML:" + builder.toString());
return request;
}
private static void printSecurityToken(PepPortType port) {
final Client client = ClientProxy.getClient(port);
final Endpoint ep = client.getEndpoint();
final String id = (String) ep.get(SecurityConstants.TOKEN_ID);
final TokenStore store = (TokenStore) ep.getEndpointInfo().getProperty(
TokenStore.class.getName());
final SecurityToken tok = store.getToken(id);
final Element e = tok.getToken();
logger.debug("******************** TOKEN ********************");
logger.debug(DOM2Writer.nodeToString(e));
logger.debug("******************** TOKEN ********************");
}
}