From eb99cf11d5968fa28b8de9371f348286a990a182 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20B=C3=B8rlum?= Date: Sun, 25 Sep 2011 14:29:49 +0200 Subject: [PATCH] Refactor the SOAP fault handling. --- .../dk/nsi/stamdata/cpr/DGWSFaultUtil.java | 65 ----------- .../dk/nsi/stamdata/cpr/DGWSHeaderUtil.java | 80 -------------- .../dk/nsi/stamdata/cpr/SoapFaultUtil.java | 101 ++++++++++++++++++ .../cpr/medcom/DetGodeCPROpslagImpl.java | 32 +++--- 4 files changed, 117 insertions(+), 161 deletions(-) delete mode 100644 nsp/cpr-ws/src/main/java/dk/nsi/stamdata/cpr/DGWSFaultUtil.java delete mode 100644 nsp/cpr-ws/src/main/java/dk/nsi/stamdata/cpr/DGWSHeaderUtil.java create mode 100644 nsp/cpr-ws/src/main/java/dk/nsi/stamdata/cpr/SoapFaultUtil.java diff --git a/nsp/cpr-ws/src/main/java/dk/nsi/stamdata/cpr/DGWSFaultUtil.java b/nsp/cpr-ws/src/main/java/dk/nsi/stamdata/cpr/DGWSFaultUtil.java deleted file mode 100644 index 3fd05e49..00000000 --- a/nsp/cpr-ws/src/main/java/dk/nsi/stamdata/cpr/DGWSFaultUtil.java +++ /dev/null @@ -1,65 +0,0 @@ -package dk.nsi.stamdata.cpr; - -import static com.trifork.stamdata.Preconditions.checkNotNull; - -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.Security; - -public final class DGWSFaultUtil -{ - private DGWSFaultUtil() - { - } - - public static DGWSFault newDGWSFault(Holder securityHolder, Holder
medcomHeaderHolder, String status, String errorMsg) throws DGWSFault - { - DGWSHeaderUtil.setHeadersToOutgoing(securityHolder, medcomHeaderHolder); - medcomHeaderHolder.value.setFlowStatus(status); - - return new DGWSFault(errorMsg, DGWSHeaderUtil.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); - } -} \ No newline at end of file diff --git a/nsp/cpr-ws/src/main/java/dk/nsi/stamdata/cpr/DGWSHeaderUtil.java b/nsp/cpr-ws/src/main/java/dk/nsi/stamdata/cpr/DGWSHeaderUtil.java deleted file mode 100644 index 3532efdc..00000000 --- a/nsp/cpr-ws/src/main/java/dk/nsi/stamdata/cpr/DGWSHeaderUtil.java +++ /dev/null @@ -1,80 +0,0 @@ -/** - * The MIT License - * - * Original work sponsored and donated by National Board of e-Health (NSI), Denmark - * (http://www.nsi.dk) - * - * Copyright (C) 2011 National Board of e-Health (NSI), Denmark (http://www.nsi.dk) - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is furnished to do - * so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package dk.nsi.stamdata.cpr; - -import java.util.Calendar; -import java.util.TimeZone; -import java.util.UUID; - -import javax.xml.ws.Holder; - -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 DGWSHeaderUtil -{ - public static final String DGWS_ERROR_MSG = "DGWS error"; - private static final String TIMEZONE = "UTC"; - - private DGWSHeaderUtil() - { - } - - public static void setHeadersToOutgoing(Holder wsseHeader, Holder
medcomHeader) - { - setSecurityHeaderToOutgoing(wsseHeader); - setMedcomHeaderToOutgoing(medcomHeader); - } - - private static void setSecurityHeaderToOutgoing(Holder wsseHeader) - { - Security sec = new Security(); - Timestamp timestamp = new Timestamp(); - Calendar cal = Calendar.getInstance(TimeZone.getTimeZone(TIMEZONE)); - cal.set(Calendar.MILLISECOND, 0); - timestamp.setCreated(cal); - sec.setTimestamp(timestamp); - wsseHeader.value = sec; - } - - private static void setMedcomHeaderToOutgoing(Holder
medcomHeader) - { - Header medcom = new Header(); - medcom.setFlowStatus(FlowStatusValues.FLOW_FINALIZED_SUCCESFULLY); - - Linking linking = new Linking(); - linking.setFlowID(medcomHeader.value.getLinking().getFlowID()); - linking.setInResponseToMessageID(medcomHeader.value.getLinking().getMessageID()); - linking.setMessageID(UUID.randomUUID().toString()); - medcom.setLinking(linking); - - medcomHeader.value = medcom; - } -} diff --git a/nsp/cpr-ws/src/main/java/dk/nsi/stamdata/cpr/SoapFaultUtil.java b/nsp/cpr-ws/src/main/java/dk/nsi/stamdata/cpr/SoapFaultUtil.java new file mode 100644 index 00000000..796c7883 --- /dev/null +++ b/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 securityHeaderHolder, Holder
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); + } +} \ No newline at end of file diff --git a/nsp/cpr-ws/src/main/java/dk/nsi/stamdata/cpr/medcom/DetGodeCPROpslagImpl.java b/nsp/cpr-ws/src/main/java/dk/nsi/stamdata/cpr/medcom/DetGodeCPROpslagImpl.java index b609d15e..0a0bbce4 100644 --- a/nsp/cpr-ws/src/main/java/dk/nsi/stamdata/cpr/medcom/DetGodeCPROpslagImpl.java +++ b/nsp/cpr-ws/src/main/java/dk/nsi/stamdata/cpr/medcom/DetGodeCPROpslagImpl.java @@ -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; @@ -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/"; @@ -94,7 +94,7 @@ public GetPersonInformationOut getPersonInformation(@WebParam(name = "Security", } catch (DatatypeConfigurationException e) { - throw DGWSFaultUtil.newServerErrorFault(e); + throw SoapFaultUtil.newServerErrorFault(e); } output.setPersonInformationStructure(personInformation); @@ -133,7 +133,7 @@ public GetPersonWithHealthCareInformationOut getPersonWithHealthCareInformation( } catch (DatatypeConfigurationException e) { - throw DGWSFaultUtil.newServerErrorFault(e); + throw SoapFaultUtil.newServerErrorFault(e); } return output; @@ -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; @@ -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; @@ -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 wsseHeader, Holder
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); + } } }