package at.gv.egovernment.moa.id.protocols.stork2;
import java.io.StringWriter;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
import at.gv.egovernment.moa.id.auth.builder.BPKBuilder;
import at.gv.egovernment.moa.id.auth.data.AuthenticationSession;
import at.gv.egovernment.moa.id.auth.exception.MOAIDException;
import at.gv.egovernment.moa.id.config.auth.OAAuthParameter;
import at.gv.egovernment.moa.logging.Logger;
import eu.stork.peps.auth.commons.IPersonalAttributeList;
import eu.stork.peps.auth.commons.PersonalAttribute;
import eu.stork.peps.auth.commons.PersonalAttributeList;
import eu.stork.peps.complex.attributes.IsHealthCareProfessionalType;
import eu.stork.peps.complex.attributes.ObjectFactory;
/**
* Fetches the attribute IsHealthcareProfessional from the BAGDAD SOAP service
*/
public class EHvdAttributeProviderPlugin implements AttributeProvider {
/** The destination. */
private Object destination;
/** The attributes. */
private String attributes;
/**
* Instantiates a new e hvd attribute provider plugin.
*
* @param url the service url
* @param attributes
*/
public EHvdAttributeProviderPlugin(String url, String supportedAttributes) {
destination = url;
attributes = supportedAttributes;
}
/* (non-Javadoc)
* @see at.gv.egovernment.moa.id.protocols.stork2.AttributeProvider#acquire(eu.stork.peps.auth.commons.PersonalAttribute)
*/
public IPersonalAttributeList acquire(PersonalAttribute attribute, String spCountryCode, AuthenticationSession moasession)
throws UnsupportedAttributeException,
ExternalAttributeRequestRequiredException, MOAIDException {
// break when we cannot handle the requested attribute
if(!attributes.contains(attribute.getName()))
throw new UnsupportedAttributeException();
try {
Logger.debug("initializing SOAP connections...");
// create SOAP connection
SOAPConnection soapConnection = SOAPConnectionFactory.newInstance().createConnection();
// assemble SOAP request
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage requestMessage = messageFactory.createMessage();
SOAPPart requestPart = requestMessage.getSOAPPart();
// (soap 1.1 relevant part. could not find a solution to use soap 1.2 in time.
requestMessage.getMimeHeaders().setHeader("SOAPAction", "http://gesundheit.gv.at/BAGDAD/DataAccessService/IsHealthcareProfessional");
/*
Construct SOAP Request Message:
string
see https://stork.ehealth.gv.at/GDAService.asmx?op=IsHealthcareProfessional
*/
// SOAP Envelope
SOAPEnvelope envelope = requestPart.getEnvelope();
// SOAP Body
SOAPBody requestBody = envelope.getBody();
SOAPElement requestBodyElem = requestBody.addChildElement("IsHealthcareProfessional");
requestBodyElem.addAttribute(envelope.createName("xmlns"), "http://gesundheit.gv.at/BAGDAD/DataAccessService");
SOAPElement requestBodyElem1 = requestBodyElem.addChildElement("bPK");
requestBodyElem1.addTextNode(new BPKBuilder().buildBPK(moasession.getIdentityLink().getIdentificationValue(), "GH"));
requestMessage.saveChanges();
// perform SOAP call
Logger.debug("call...");
SOAPMessage responseMessage = soapConnection.call(requestMessage, destination);
// parse SOAP response
/*
boolean
string
boolean
string
string
string
see https://stork.ehealth.gv.at/GDAService.asmx?op=IsHealthcareProfessional
*/
Logger.debug("call successful. Parse...");
SOAPBody responseBody = responseMessage.getSOAPBody();
// iterate through tree
SOAPElement responseElement = (SOAPElement) responseBody.getChildElements().next();
SOAPElement resultElement = (SOAPElement) responseElement.getChildElements().next();
// collect all info in a map
Iterator> it = resultElement.getChildElements();
Map collection = new HashMap();
while (it.hasNext()) {
SOAPElement current = (SOAPElement) it.next();
collection.put(current.getNodeName(), current.getTextContent());
}
// check if there is anything valid in the map
if (collection.isEmpty() || collection.size() != 6) {
Logger.warn("eHVD returned an unexpected count of values. Expected 6 got " + collection.size());
throw new IndexOutOfBoundsException("response attributes not like specified");
}
// - fetch request validity
if (collection.get("RequestOK").equals("false")) {
Logger.warn("eHVD reported an invalid request. The error message is: " + collection.get("Message"));
throw new Exception("eHVD reported an invalid request");
}
PersonalAttribute acquiredAttribute = null;
if (collection.get("IsHealthcareProfessional").equals("false")) {
// the citizen is no HCP
acquiredAttribute = new PersonalAttribute("isHealthCareProfessional", false, new ArrayList(), "NotAvailable");
} else {
// go on and parse the data
IsHealthCareProfessionalType result = new IsHealthCareProfessionalType();
result.setNameOfOrganisation(collection.get("NameOfOrganisation"));
if (collection.get("Type").equals("Medical doctor"))
result.setHCPType("D");
else
result.setHCPType("?");
if (collection.get("Specialization").contains("Arzt für Allgemeinmedizin"))
result.setSpecialisation("GP");
else
result.setSpecialisation("??");
result.setAQAA(4);
final Marshaller m = JAXBContext.newInstance(IsHealthCareProfessionalType.class).createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
StringWriter stringWriter = new StringWriter();
m.marshal(new ObjectFactory().createIsHealthCareProfessional(result), stringWriter);
ArrayList value = new ArrayList();
value.add(stringWriter.toString());
acquiredAttribute = new PersonalAttribute("isHealthCareProfessional", false, value, "Available");
}
// pack and return the result
PersonalAttributeList result = new PersonalAttributeList();
result.add(acquiredAttribute);
// add stork id for verification
ArrayList value = new ArrayList();
value.add(new BPKBuilder().buildStorkeIdentifier(moasession.getIdentityLink(), spCountryCode));
result.add(new PersonalAttribute("eIdentifier", false, value, "Available"));
return result;
} catch (Exception e) {
throw new MOAIDException("stork.13", new Object[] { e });
}
}
@Override
public IPersonalAttributeList acquire(List attributes, String spCountyCode, AuthenticationSession moasession) throws UnsupportedAttributeException, ExternalAttributeRequestRequiredException, MOAIDException {
if (attributes.size() == 1) {
return acquire(attributes.get(0), spCountyCode, moasession);
} else {
throw new MOAIDException("stork.13", new Object[] { }); // TODO message only one attribute supported by this provider
}
}
/* (non-Javadoc)
* @see at.gv.egovernment.moa.id.protocols.stork2.AttributeProvider#performRedirect(java.lang.String, java.lang.String, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, at.gv.egovernment.moa.id.config.auth.OAAuthParameter)
*/
public void performRedirect(String url,
HttpServletRequest req, HttpServletResponse resp,
OAAuthParameter oaParam) throws MOAIDException {
// there is no redirect required
}
/* (non-Javadoc)
* @see at.gv.egovernment.moa.id.protocols.stork2.AttributeProvider#parse(javax.servlet.http.HttpServletRequest)
*/
public IPersonalAttributeList parse(HttpServletRequest httpReq)
throws UnsupportedAttributeException, MOAIDException {
// there is no redirect required, so we throw an exception when someone asks us to parse a response
throw new UnsupportedAttributeException();
}
}