Skip to content

Commit

Permalink
Refactor the SOAP fault handling.
Browse files Browse the repository at this point in the history
  • Loading branch information
Thomas Børlum committed Sep 25, 2011
1 parent 335fd72 commit eb99cf1
Show file tree
Hide file tree
Showing 4 changed files with 117 additions and 161 deletions.
65 changes: 0 additions & 65 deletions nsp/cpr-ws/src/main/java/dk/nsi/stamdata/cpr/DGWSFaultUtil.java

This file was deleted.

80 changes: 0 additions & 80 deletions nsp/cpr-ws/src/main/java/dk/nsi/stamdata/cpr/DGWSHeaderUtil.java

This file was deleted.

101 changes: 101 additions & 0 deletions nsp/cpr-ws/src/main/java/dk/nsi/stamdata/cpr/SoapFaultUtil.java
@@ -0,0 +1,101 @@
package dk.nsi.stamdata.cpr;

import static com.trifork.stamdata.Preconditions.checkNotNull;

import java.util.Calendar;
import java.util.TimeZone;
import java.util.UUID;

import javax.xml.soap.SOAPConstants;
import javax.xml.soap.SOAPFactory;
import javax.xml.soap.SOAPFault;
import javax.xml.ws.Holder;
import javax.xml.ws.soap.SOAPFaultException;

import dk.nsi.stamdata.cpr.medcom.DetGodeCPROpslagFaultMessages;
import dk.nsi.stamdata.cpr.ws.DGWSFault;
import dk.nsi.stamdata.cpr.ws.Header;
import dk.nsi.stamdata.cpr.ws.Linking;
import dk.nsi.stamdata.cpr.ws.Security;
import dk.nsi.stamdata.cpr.ws.Timestamp;
import dk.sosi.seal.model.constants.FlowStatusValues;

public final class SoapFaultUtil
{
private SoapFaultUtil()
{
}

public static DGWSFault newDGWSFault(Holder<Security> securityHeaderHolder, Holder<Header> medcomHeaderHolder, String status, String errorMsg) throws DGWSFault
{
checkNotNull(securityHeaderHolder, "securityHeaderHolder");
checkNotNull(medcomHeaderHolder, "medcomHeaderHolder");
checkNotNull(status, "status");
checkNotNull(errorMsg, "errorMsg");

// The DGWS Specification says that this exact string must be returned.

final String DGWS_ERROR_MSG = "DGWS error";
final String DGWS_TIMEZONE = "UTC";

Security securityHeader = new Security();

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone(DGWS_TIMEZONE));
cal.set(Calendar.MILLISECOND, 0);

Timestamp timestamp = new Timestamp();
timestamp.setCreated(cal);
securityHeader.setTimestamp(timestamp);
securityHeaderHolder.value = securityHeader;

Header medcom = new Header();
medcom.setFlowStatus(FlowStatusValues.FLOW_FINALIZED_SUCCESFULLY);

Linking linking = new Linking();
linking.setFlowID(medcomHeaderHolder.value.getLinking().getFlowID());
linking.setInResponseToMessageID(medcomHeaderHolder.value.getLinking().getMessageID());
linking.setMessageID(UUID.randomUUID().toString());
medcom.setLinking(linking);

medcomHeaderHolder.value = medcom;
medcomHeaderHolder.value.setFlowStatus(status);

return new DGWSFault(errorMsg, DGWS_ERROR_MSG);
}

public static SOAPFaultException newSOAPSenderFault(String message)
{
checkNotNull(message, "message");

SOAPFault fault;

try
{
// We have to make sure to use the same protocol version
// as defined in the WSDL.

SOAPFactory factory = SOAPFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);

fault = factory.createFault();
fault.setFaultCode(SOAPConstants.SOAP_SENDER_FAULT);

// TODO: For some reason the xml:lang att. is always "en"
// even when the locale is set in this next call.

fault.setFaultString(message);
}
catch (Exception e)
{
throw newServerErrorFault(e);
}

return new SOAPFaultException(fault);
}

public static RuntimeException newServerErrorFault(Exception e)
{
checkNotNull(e, "e");

return new RuntimeException(DetGodeCPROpslagFaultMessages.INTERNAL_SERVER_ERROR, e);
}
}
Expand Up @@ -19,8 +19,8 @@
import com.trifork.stamdata.models.cpr.Person;
import com.trifork.stamdata.models.sikrede.Sikrede;

import dk.nsi.stamdata.cpr.DGWSFaultUtil;
import dk.nsi.stamdata.cpr.annotations.Whitelist;
import dk.nsi.stamdata.cpr.SoapFaultUtil;
import dk.nsi.stamdata.cpr.WhitelistProvider.Whitelist;
import dk.nsi.stamdata.cpr.jaxws.GuiceInstanceResolver.GuiceWebservice;
import dk.nsi.stamdata.cpr.ws.DGWSFault;
import dk.nsi.stamdata.cpr.ws.DetGodeCPROpslag;
Expand All @@ -37,7 +37,7 @@
@GuiceWebservice
@WebService(serviceName = "DetGodeCprOpslag", endpointInterface = "dk.nsi.stamdata.cpr.ws.DetGodeCPROpslag")
public class DetGodeCPROpslagImpl implements DetGodeCPROpslag
{
{
private static Logger logger = LoggerFactory.getLogger(DetGodeCPROpslagImpl.class);

private static final String NS_TNS = "http://rep.oio.dk/medcom.sundcom.dk/xml/wsdl/2007/06/28/";
Expand Down Expand Up @@ -94,7 +94,7 @@ public GetPersonInformationOut getPersonInformation(@WebParam(name = "Security",
}
catch (DatatypeConfigurationException e)
{
throw DGWSFaultUtil.newServerErrorFault(e);
throw SoapFaultUtil.newServerErrorFault(e);
}

output.setPersonInformationStructure(personInformation);
Expand Down Expand Up @@ -133,7 +133,7 @@ public GetPersonWithHealthCareInformationOut getPersonWithHealthCareInformation(
}
catch (DatatypeConfigurationException e)
{
throw DGWSFaultUtil.newServerErrorFault(e);
throw SoapFaultUtil.newServerErrorFault(e);
}

return output;
Expand All @@ -153,13 +153,13 @@ private Person fetchPersonWithPnr(String pnr)
}
catch (Exception e)
{
throw DGWSFaultUtil.newServerErrorFault(e);
throw SoapFaultUtil.newServerErrorFault(e);
}

if (person == null)
{

throw DGWSFaultUtil.newSOAPSenderFault(DetGodeCPROpslagFaultMessages.NO_DATA_FOUND_FAULT_MSG);
throw SoapFaultUtil.newSOAPSenderFault(DetGodeCPROpslagFaultMessages.NO_DATA_FOUND_FAULT_MSG);
}

return person;
Expand All @@ -178,12 +178,12 @@ private Sikrede fetchSikredeWithPnr(String pnr)
}
catch (Exception e)
{
throw DGWSFaultUtil.newServerErrorFault(e);
throw SoapFaultUtil.newServerErrorFault(e);
}

if (sikrede == null)
{
throw DGWSFaultUtil.newSOAPSenderFault(DetGodeCPROpslagFaultMessages.NO_DATA_FOUND_FAULT_MSG);
throw SoapFaultUtil.newSOAPSenderFault(DetGodeCPROpslagFaultMessages.NO_DATA_FOUND_FAULT_MSG);
}

return sikrede;
Expand All @@ -193,23 +193,23 @@ private void checkInputParameters(@Nullable String pnr)
{
if (StringUtils.isBlank(pnr))
{
throw DGWSFaultUtil.newSOAPSenderFault("PersonCivilRegistrationIdentifier was not set in request, but is required.");
throw SoapFaultUtil.newSOAPSenderFault("PersonCivilRegistrationIdentifier was not set in request, but is required.");
}
}


private void checkClientAuthorization(String requestedPNR, Holder<Security> wsseHeader, Holder<Header> medcomHeader) throws DGWSFault
{
{
String clientCVR = idCard.getSystemInfo().getCareProvider().getID();

if (!whitelist.contains(clientCVR))
{
logger.warn("type=auditlog, service=stamdata-cpr, msg=Unauthorized access attempt, client_cvr={}, requested_pnr={}", clientCVR, requestedPNR);
throw DGWSFaultUtil.newDGWSFault(wsseHeader, medcomHeader, DetGodeCPROpslagFaultMessages.CALLER_NOT_AUTHORIZED, FaultCodeValues.NOT_AUTHORIZED);
}
logger.warn("type=auditlog, service=stamdata-cpr, msg=Unauthorized access attempt, client_cvr={}, requested_pnr={}", clientCVR, requestedPNR);
throw SoapFaultUtil.newDGWSFault(wsseHeader, medcomHeader, DetGodeCPROpslagFaultMessages.CALLER_NOT_AUTHORIZED, FaultCodeValues.NOT_AUTHORIZED);
}
else
{
logger.info("type=auditlog, service=stamdata-cpr, msg=Access granted, client_cvr={}, requested_pnr={}", clientCVR, requestedPNR);
}
logger.info("type=auditlog, service=stamdata-cpr, msg=Access granted, client_cvr={}, requested_pnr={}", clientCVR, requestedPNR);
}
}
}

0 comments on commit eb99cf1

Please sign in to comment.