package gov.nist.registry.ws.serviceclasses;
import gov.nist.registry.common2.exception.XdsException;
import gov.nist.registry.common2.exception.XdsValidationException;
import gov.nist.registry.common2.registry.MetadataSupport;
import gov.nist.registry.common2.registry.RegistryErrorList;
import gov.nist.registry.common2.registry.RetrieveDocumentSetResponse;
import gov.nist.registry.common2.xml.Util;
import gov.nist.registry.ws.RetrieveDocumentSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.axiom.om.OMElement;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openhealthtools.openexchange.actorconfig.net.IConnectionDescription;
import org.openhealthtools.openxds.log.LoggerException;
import org.openhealthtools.openxds.xca.Aggregator;
import org.openhealthtools.openxds.xca.RetrieveAggregator;
import org.openhealthtools.openxds.xca.SoapCall;
import org.openhealthtools.openxds.xca.api.XcaIG;
public class XcaRepository extends RepositoryB {
private final static Log logger = LogFactory.getLog(XcaRepository.class);
private XcaIG actor = Ig.getActor();
protected void validateRequest(OMElement rdsr, RegistryErrorList rel)
throws XdsValidationException {
verifyHomeOnRetrieve(rdsr, rel, Ig.home);
}
protected void verifyHomeOnRetrieve(OMElement rdsr, RegistryErrorList rel, String home) {
List<OMElement> doc_requests = MetadataSupport.decendentsWithLocalName(rdsr, "DocumentRequest");
for (OMElement doc_request : doc_requests) {
OMElement home_att_ele = MetadataSupport.firstChildWithLocalName(doc_request, "HomeCommunityId");
if (home_att_ele == null) {
rel.add_error(MetadataSupport.XDSMissingHomeCommunityId, "homeCommunityId missing or empty" , null, log_message);
continue;
}
String home_att = home_att_ele.getText();
if (home_att == null || home_att.equals(""))
rel.add_error(MetadataSupport.XDSMissingHomeCommunityId, "homeCommunityId missing or empty" , null, log_message);
else if ( !home_att.equals(home) && ! actor.getRGRetrieveClientConnections().keySet().contains(home_att) )
rel.add_error(MetadataSupport.XDSUnknownCommunity, "Do not understand homeCommunityId " + home_att , null, log_message);
}
}
protected OMElement processRetrieveDocumentSet(RetrieveDocumentSet s, OMElement rdsr) throws XdsException, LoggerException {
Map<String, List<OMElement>> requestByHome = new HashMap<String, List<OMElement>>();
//Sort and group doc requests by homeId
List<OMElement> doc_requests = MetadataSupport.decendentsWithLocalName(rdsr, "DocumentRequest");
for (OMElement doc_request : doc_requests) {
String home_att = MetadataSupport.firstChildWithLocalName(doc_request, "HomeCommunityId").getText();
List<OMElement> requests = requestByHome.get(home_att);
if (requests == null ) {
requests = new ArrayList<OMElement>();
requestByHome.put(home_att, requests);
}
OMElement request2 = Util.deep_copy(doc_request);
requests.add(request2);
}
Set<String> requestHomeIds = requestByHome.keySet();
Aggregator ag = new RetrieveAggregator(requestHomeIds, log_message);
for(String requestHomeId :requestHomeIds) {
List<OMElement> requests = requestByHome.get( requestHomeId );
OMElement rootRequest = null;
for (OMElement request : requests) {
rootRequest = MetadataSupport.createElement("RetrieveDocumentSetRequest", MetadataSupport.xdsB);
rootRequest.addChild(request);
}
if (requestHomeId.equals(Ig.home)) {
//send to the local community repository
SoapCall sc = new SoapCall(actor.getRepositoryClientConnection(), rootRequest, "urn:ihe:iti:2007:RetrieveDocumentSet", requestHomeId, true /*mtom*/, ag, this);
Ig.exec.execute( sc );
} else {
//forward to the gateway
IConnectionDescription rgConnection = actor.getRGRetrieveClientConnections().get(requestHomeId);
SoapCall sc = new SoapCall(rgConnection, rootRequest, "urn:ihe:iti:2007:CrossGatewayRetrieve", requestHomeId, true/*mtom*/, ag, this);
Ig.exec.execute( sc );
}
}
//wait for and aggregate responses
ag.waitForAll();
RetrieveDocumentSetResponse response = ((RetrieveAggregator)ag).getRetrieveDocumentSetResponse();
log_response(response.getRegistryResponse());
return response.getResponse();
}
}