package tr.com.srdc.mdr.web.dex.ws;
import ihe.qrph.dex._2013.ContentModelType;
import ihe.qrph.dex._2013.DataElementExchangePortType;
import ihe.qrph.dex._2013.DataElementType;
import ihe.qrph.dex._2013.MappingSpecificationType;
import ihe.qrph.dex._2013.RetrieveDataElementListRequestType;
import ihe.qrph.dex._2013.RetrieveDataElementListResponseType;
import ihe.qrph.dex._2013.RetrieveMetadataRequestType;
import ihe.qrph.dex._2013.RetrieveMetadataResponseType;
import ihe.qrph.dex._2013.ValueDomainType;
import ihe.qrph.dex._2013.ValueSetType;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import tr.com.srdc.mdr.core.api.ai.ClassificationScheme;
import tr.com.srdc.mdr.core.api.ai.ConceptualDomain;
import tr.com.srdc.mdr.core.api.ai.DataElement;
import tr.com.srdc.mdr.core.api.ai.DataElementConcept;
import tr.com.srdc.mdr.core.api.ai.ValueDomain;
import tr.com.srdc.mdr.core.api.composite.ClassificationSchemeItem;
import tr.com.srdc.mdr.core.api.composite.UnitOfMeasure;
import tr.com.srdc.mdr.core.impl.Repository;
import tr.com.srdc.mdr.core.impl.RepositoryManager;
import tr.com.srdc.mdr.core.model.iso11179.composite.AdministrationRecordResource;
import tr.com.srdc.mdr.core.model.iso11179.composite.RegistrationAuthorityResource;
public class DEXService implements DataElementExchangePortType {
@Override
@WebResult(name = "RetrieveMetadataResponse", targetNamespace = "urn:ihe:qrph:dex:2013", partName = "body")
@WebMethod(operationName = "RetrieveMetadata", action = "urn:ihe:qrph:dex:2013:RetrieveMetadata")
public RetrieveMetadataResponseType retrieveMetadata(
@WebParam(partName = "body", name = "RetrieveMetadataRequest", targetNamespace = "urn:ihe:qrph:dex:2013") RetrieveMetadataRequestType body) {
String id = body.getId();
String regAuth = body.getRegistrationAuthority();
String version = body.getVersion();
DataElementType dataElement = new DataElementType();
Repository repository = RepositoryManager.getInstance().getRepository();
DataElement de = repository.getDataElement(id, regAuth, version);
if (de == null) {
dataElement = null;
} else {
DataElementConcept dec = de.getDataElementConcept();
AdministrationRecordResource arr = de.asMDRResource()
.getAdministrationRecord();
RegistrationAuthorityResource rar = de.asMDRResource()
.getRegisteredBy();
dataElement.setId(de.getUniqueID());
dataElement.setRegistrationAuthority(rar.getRegistrationAuthorityIdentifier().getOrganizationIdentifier());
dataElement.setContextualDomain(de.getContext().getName());
dataElement.setCreationDate(toXMLCal(arr.getCreationDate()));
dataElement.setDefinition(de.getDefinition());
dataElement.setDisplayName(de.getName());
dataElement.setEffectiveDate(toXMLCal(arr.getEffectiveDate()));
dataElement.setExpirationDate(toXMLCal(arr.getUntilDate()));
dataElement.setObjectClass(dec.getObjectClass().getName());
dataElement.setProperty(dec.getProperty().getName());
dataElement.setRevisionDate(toXMLCal(arr.getLastChangeDate()));
dataElement.setRevisionNote(arr.getChangeDescription());
dataElement.setValueDomain(getValueDomain(de));
dataElement.setVersion(arr.getVersionInfo());
dataElement.getMappingSpecification().addAll(getMappings(de));
}
RetrieveMetadataResponseType response = new RetrieveMetadataResponseType();
response.setDataElement(dataElement);
return response;
}
private ValueDomainType getValueDomain(DataElement de) {
ValueDomain vd = de.getValueDomain();
ConceptualDomain cd = vd.getConceptualDomain();
ValueSetType valueSet = null;
if (cd.isEnumeratedConceptualDomain()) {
valueSet = new ValueSetType();
valueSet.setDisplayName(cd.getName());
valueSet.setId(cd.getUniqueID());
valueSet.setVersion(cd.asMDRResource().getAdministrationRecord()
.getVersionInfo());
}
ValueDomainType valueDomain = new ValueDomainType();
valueDomain.setDataType(vd.getDatatype().getName());
UnitOfMeasure unit = vd.getUnitOfMeasure();
if (unit != null) {
valueDomain.setUnitOfMeasure(unit.getName());
}
valueDomain.setValueSet(valueSet);
return valueDomain;
}
private List<MappingSpecificationType> getMappings(DataElement de) {
List<ClassificationSchemeItem> specs = de.getExtractionSpecifications();
List<MappingSpecificationType> mappings = new ArrayList<MappingSpecificationType>();
for (ClassificationSchemeItem csi : specs) {
ClassificationScheme cs = csi.getClassificationScheme();
ContentModelType contentModel = new ContentModelType();
contentModel.setId(cs.getUniqueID());
contentModel.setName(cs.getName());
MappingSpecificationType mapping = new MappingSpecificationType();
mapping.setContentModel(contentModel);
mapping.setMappingScript(csi.getItemValue());
mapping.setType(csi.getTypeName());
mappings.add(mapping);
}
return mappings;
}
private XMLGregorianCalendar toXMLCal(Calendar cal) {
if (cal == null) {
return null;
}
DatatypeFactory dtf = null;
try {
dtf = DatatypeFactory.newInstance();
} catch (DatatypeConfigurationException e) {
e.printStackTrace();
return null;
}
GregorianCalendar gc = new GregorianCalendar();
gc.setTimeInMillis(cal.getTimeInMillis());
return dtf.newXMLGregorianCalendar(gc);
}
/*
* (non-Javadoc)
*
* @see
* ihe.qrph.dex._2013.DataElementExchangePortType#retrieveDataElementList
* (ihe.qrph.dex._2013.RetrieveDataElementListRequestType)
*/
@Override
@WebResult(name = "RetrieveDataElementListResponse", targetNamespace = "urn:ihe:qrph:dex:2013", partName = "body")
@WebMethod(operationName = "RetrieveDataElementList", action = "urn:ihe:qrph:dex:2013:RetrieveDataElementList")
public RetrieveDataElementListResponseType retrieveDataElementList(
@WebParam(partName = "body", name = "RetrieveDataElementListRequest", targetNamespace = "urn:ihe:qrph:dex:2013") RetrieveDataElementListRequestType body) {
// TODO Auto-generated method stub
return null;
}
}