/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.openehealth.coala.xds;
import java.util.List;
import org.openehealth.ipf.commons.ihe.xds.core.metadata.AvailabilityStatus;
import org.openehealth.ipf.commons.ihe.xds.core.metadata.Document;
import org.openehealth.ipf.commons.ihe.xds.core.metadata.DocumentEntry;
import org.openehealth.ipf.commons.ihe.xds.core.responses.RetrievedDocument;
import org.slf4j.Logger;
import org.openehealth.coala.domain.ConsentSortParameter;
import org.openehealth.coala.exception.XDSConfigurationErrorException;
import org.openehealth.coala.exception.XDSConsentConversionException;
import org.openehealth.coala.exception.XDSRequestFailedException;
/**
* This class implements {@link XDSGate} to provide the communication to a XDS
* server via IHE-XDS.
*
* @author kmaerz, siekmann
*/
public class XDSGateImpl implements XDSGate {
private static final Logger LOG = org.slf4j.LoggerFactory
.getLogger(XDSGateImpl.class);
private XDSTransactor xdsTransactor;
/**
* Creates a new XDSGate for XDS communication with a PXS.
*
* @param transactor
* The {@link XDSTransactor} to use in this implementation. It
* must not be <code>null</code>
* @throws XDSConfigurationErrorException
* Is thrown if the configuration object in
* {@link XDSTransactor} is misconfigured
*/
public XDSGateImpl(XDSTransactor transactor)
throws XDSConfigurationErrorException {
this.xdsTransactor = transactor;
}
/**
* Returns a List of DocumentEntries that are consents for the patient with
* the <code>pid</code> and the <code>availibilityStati</code>.
*
* @param pid
* The patient ID consent documents should be searched for. This
* parameter MUST NOT be <code>null</code>.
* @param availabilityStati
* List of document stati that should be returned. Possible stati
* are: AvailabilityStatus.APPROVED,
* AvailabilityStatus.SUBMITTED, AvailabilityStatus.DEPRECATED <br />
* This list must contain at least one entry.
* @return List of {@link DocumentEntry} that are consent documents.
* @throws XDSRequestFailedException
* If any error occurred during processing of the request
*/
public List<DocumentEntry> requestConsents(String pid,
List<AvailabilityStatus> availabilityStati,
ConsentSortParameter sortby) throws XDSRequestFailedException {
List<DocumentEntry> documents;
try {
documents = xdsTransactor.getConsentDocumentList(pid,
availabilityStati);
return documents;
} catch (XDSRequestFailedException e) {
throw e;
} catch (Throwable e) {
LOG.error(e.getLocalizedMessage(), e);
throw new XDSRequestFailedException(
"Communication with XDS failed. See log for details", e);
}
}
/**
* Returns a list of RetrieveDocument that are associated with the given
* <code>documentEntry</code> or an empty List.
*
* @param documentEntry
* The document entry that should be processed.
* @return The list of associated documents
* @throws XDSRequestFailedException
* Is thrown if anything went wrong during retrieving the
* document set.
* @throws XDSConfigurationErrorException
* Is thrown if the ITI-43 endpoint is misconfigured
*/
public List<RetrievedDocument> retrieveDocumentSet(
DocumentEntry documentEntry) throws XDSRequestFailedException,
XDSConfigurationErrorException {
List<RetrievedDocument> documents;
try {
documents = xdsTransactor.retrieveDocumentSet(documentEntry);
return documents;
} catch (XDSRequestFailedException e) {
throw e;
} catch (Throwable e) {
LOG.error(e.getLocalizedMessage(), e);
throw new XDSRequestFailedException(
"Communication with XDS failed. See log for details", e);
}
}
/**
* This method registers a new consent document for the given patient
*
* @param document
* The document object that contains the new CDA consent data. It
* has to contain at least one author in the documentEntry and
* the patientIdentifiable has to be set. This parameter must not
* be <code>null</code>.
* @param replaceActiveConsents
* Indicates whether the new consent should replace all active
* consents in repository or not.
* @return The uniqueID the new consent can be found with or
* <code>null</code> if something went wrong
* @throws XDSRequestFailedException
* If wrong parameters were given or if an endpoint is empty
* (wrong constructor call by programmer!!!)
* @throws XDSConsentConversionException
* If an old consent document could not be parsed to check
* validity of the consent
* @throws XDSConfigurationErrorException
* If the configuration file does not contain required keys
*/
public String registerNewConsent(Document document,
boolean replaceActiveConsents) throws XDSRequestFailedException,
XDSConsentConversionException, XDSConfigurationErrorException {
try {
return xdsTransactor.provideAndRegisterNewConsent(document,
replaceActiveConsents);
} catch (XDSConfigurationErrorException e) {
throw e;
} catch (XDSRequestFailedException e) {
throw e;
} catch (Throwable e) {
LOG.error(e.getLocalizedMessage(), e);
throw new XDSRequestFailedException(
"Communication with XDS failed. See log for details.", e);
}
}
}