package gov.hhs.fha.nhinc.subscription.dte; //import gov.hhs.fha.nhinc.NHINCLib.NullChecker; import gov.hhs.fha.nhinc.common.subscription.CriterionType; import gov.hhs.fha.nhinc.common.subscription.KeyValuePairType; import gov.hhs.fha.nhinc.common.subscription.SubscriptionItemType; import gov.hhs.fha.nhinc.nhinclib.NullChecker; import gov.hhs.fha.nhinc.util.format.DocumentClassCodeParser; import gov.hhs.healthit.nhin.cdc.CdcBioPackageSubscriptionCriteriaType; import gov.hhs.healthit.nhin.cdc.CdcBioPackageSubscriptionCriteriaType.Frequency; import gov.hhs.healthit.nhin.cdc.MessageTypesType; import java.math.BigInteger; import java.util.ArrayList; import java.util.List; import javax.xml.bind.JAXBElement; //import javax.xml.parsers.DocumentBuilderFactory; //import javax.xml.parsers.ParserConfigurationException; import javax.xml.ws.wsaddressing.W3CEndpointReference; //import javax.xml.ws.wsaddressing.W3CEndpointReferenceBuilder; import oasis.names.tc.ebxml_regrep.xsd.rim._3.AdhocQueryType; import oasis.names.tc.ebxml_regrep.xsd.rim._3.SlotType1; import oasis.names.tc.ebxml_regrep.xsd.rim._3.ValueListType; import org.oasis_open.docs.wsn.b_2.FilterType; import org.oasis_open.docs.wsn.b_2.Subscribe; //import gov.hhs.healthit.nhin.cdc.CdcBioPackageSubscriptionCriteriaType.Frequency; import org.oasis_open.docs.wsn.b_2.Subscribe.SubscriptionPolicy; //import gov.hhs.healthit.nhin.cdc.MessageTypesType; //import oasis.names.tc.ebxml_regrep.xsd.rim._3.SlotType1; //import oasis.names.tc.ebxml_regrep.xsd.rim._3.ValueListType; // //import gov.hhs.fha.nhinc.subscription.*; //import gov.hhs.fha.nhinc.util.format.DocumentClassCodeParser; //import gov.hhs.healthit.nhin.cdc.CdcBioPackageSubscriptionCriteriaType; //import java.math.BigInteger; //import java.util.ArrayList; //import java.util.List; //import javax.xml.bind.JAXBElement; //import javax.xml.parsers.DocumentBuilderFactory; //import javax.xml.parsers.ParserConfigurationException; //import javax.xml.ws.wsaddressing.W3CEndpointReference; //import javax.xml.ws.wsaddressing.W3CEndpointReferenceBuilder; //import oasis.names.tc.ebxml_regrep.xsd.rim._3.AdhocQueryType; //import oasis.names.tc.ebxml_regrep.xsd.rim._3.AdhocQueryType; //import oasis.names.tc.ebxml_regrep.xsd.rim._3.SlotType1; //import org.oasis_open.docs.wsn.b_2.*; //import org.oasis_open.docs.wsn.b_2.Subscribe.SubscriptionPolicy; /** * * @author rayj */ public class NhinSubscribeBuilder { private static org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(NhinSubscribeBuilder.class); public static Subscribe transformInternalSubscriptionItemToNhinSubscribe(SubscriptionItemType subscriptionItem) { log.debug("begin transformInternalSubscriptionItemToNhinSubscribe"); Subscribe nhinSubscribe = null; String topic = TopicHelper.GetTopicValue(subscriptionItem); if (topic == null) { topic = ""; } if (topic.contentEquals("nhin-cdc:CdcBioPackage")) { nhinSubscribe = transformInternalSubscriptionItemToNhinSubscribeCdc(subscriptionItem); } else { nhinSubscribe = transformInternalSubscriptionItemToNhinSubscribeDocument(subscriptionItem); } log.debug("end transformInternalSubscriptionItemToNhinSubscribe"); return nhinSubscribe; } public static Subscribe transformInternalSubscriptionItemToNhinSubscribeCdc(SubscriptionItemType subscriptionItem) { log.debug("begin transformInternalSubscriptionItemToNhinSubscribeCdc"); Subscribe nhinSubscribe = new Subscribe(); String notificationConsumerEndpointAddress = Configuration.getlocalNotificationConsumerEndpointAddress(); String userAddress = SubscriptionItemHelper.getSubscriberUserAddress(subscriptionItem); AppendConsumerReference(nhinSubscribe, notificationConsumerEndpointAddress, userAddress); //filter gov.hhs.fha.nhinc.common.subscription.TopicExpressionType internalTopic = TopicHelper.GetTopic(subscriptionItem); if (internalTopic == null) { internalTopic = TopicBuilder.createCdcBioPackageTopic(); } FilterType filter = new FilterType(); org.oasis_open.docs.wsn.b_2.TopicExpressionType topicExpression = new org.oasis_open.docs.wsn.b_2.TopicExpressionType(); topicExpression.setDialect(internalTopic.getDialect()); topicExpression.getContent().add(internalTopic.getValue()); org.oasis_open.docs.wsn.b_2.ObjectFactory factory = new org.oasis_open.docs.wsn.b_2.ObjectFactory(); JAXBElement topicExpressionJB = factory.createTopicExpression(topicExpression); filter.getAny().add(topicExpressionJB); nhinSubscribe.setFilter(filter); //subscription policy SubscriptionPolicy nhinSubscriptionPolicy = new SubscriptionPolicy(); CdcBioPackageSubscriptionCriteriaType subscriptionCriteria = new CdcBioPackageSubscriptionCriteriaType(); Frequency frequency = new Frequency(); subscriptionCriteria.setFrequency(frequency); MessageTypesType messageTypes = new MessageTypesType(); subscriptionCriteria.setMessageTypes(messageTypes); BigInteger valueNumeric; for (KeyValuePairType policyItem : subscriptionItem.getSubscriptionCriteria().getSubscriptionPolicy().getGenericPolicyItems().getKeyValuePair()) { if ("FrequenceUnits".contentEquals(policyItem.getKey())) { valueNumeric = convertToBigInteger(policyItem.getValue()); frequency.setFrequencyUnits(valueNumeric); } else if ("FrequenceDuration".contentEquals(policyItem.getKey())) { frequency.setFrequencyDuration(policyItem.getValue()); } else if ("SizeThreshold".contentEquals(policyItem.getKey())) { valueNumeric = convertToBigInteger(policyItem.getValue()); subscriptionCriteria.setSizeThreshold(valueNumeric); } else if ("MessageType".contentEquals(policyItem.getKey())) { subscriptionCriteria.getMessageTypes().getMessageType().add(policyItem.getValue()); } else { } } gov.hhs.healthit.nhin.cdc.ObjectFactory cdcSubscriptionCriteriaFactory = new gov.hhs.healthit.nhin.cdc.ObjectFactory(); JAXBElement subscriptionCriteriaJB = cdcSubscriptionCriteriaFactory.createCdcBioPackageSubscriptionCriteria(subscriptionCriteria); nhinSubscriptionPolicy.getAny().add(subscriptionCriteriaJB); nhinSubscribe.setSubscriptionPolicy(nhinSubscriptionPolicy); log.debug("end transformInternalSubscriptionItemToNhinSubscribeCdc"); return nhinSubscribe; } private static BigInteger convertToBigInteger(String value) { BigInteger valueNumericBigInteger = new BigInteger(value); return valueNumericBigInteger; } public static Subscribe transformInternalSubscriptionItemToNhinSubscribeDocument(SubscriptionItemType subscriptionItem) { log.debug("begin transformInternalSubscriptionItemToNhinSubscribeDocument"); Subscribe nhinSubscribe = new Subscribe(); String notificationConsumerEndpointAddress = Configuration.getlocalNotificationConsumerEndpointAddress(); String userAddress = SubscriptionItemHelper.getSubscriberUserAddress(subscriptionItem); AppendConsumerReference(nhinSubscribe, notificationConsumerEndpointAddress, userAddress); // Add topic expression //filter gov.hhs.fha.nhinc.common.subscription.TopicExpressionType internalTopic = TopicHelper.GetTopic(subscriptionItem); if (internalTopic == null) { internalTopic = TopicBuilder.createDocumentTopic(); } FilterType filter = new FilterType(); org.oasis_open.docs.wsn.b_2.TopicExpressionType topicExpression = new org.oasis_open.docs.wsn.b_2.TopicExpressionType(); topicExpression.setDialect(internalTopic.getDialect()); topicExpression.getContent().add(internalTopic.getValue()); org.oasis_open.docs.wsn.b_2.ObjectFactory wsntFactory = new org.oasis_open.docs.wsn.b_2.ObjectFactory(); JAXBElement topicExpressionJB = wsntFactory.createTopicExpression(topicExpression); filter.getAny().add(topicExpressionJB); nhinSubscribe.setFilter(filter); //begin adhoc query oasis.names.tc.ebxml_regrep.xsd.rim._3.ObjectFactory factory = new oasis.names.tc.ebxml_regrep.xsd.rim._3.ObjectFactory(); AdhocQueryType adhocQuery = factory.createAdhocQueryType(); adhocQuery.setId(Constants.AdhocQueryId); String adhocQueryFormttedPatientId = SubscriptionItemHelper.getSubscriptionCriteriaSubscribeePatientInAdhocQueryFormat(subscriptionItem); if (NullChecker.isNotNullish(adhocQueryFormttedPatientId)) { adhocQuery.getSlot().add(SlotTypeFactory(Constants.PatientIdSlotName, adhocQueryFormttedPatientId)); } List documentClassCodeList = new ArrayList(); List criterionList = extractCriterionList(subscriptionItem); if (criterionList != null) { for (CriterionType criterion : criterionList) { if (criterion.getKey().contentEquals(Constants.DocumentClassCodeSlotName)) { documentClassCodeList.add(criterion.getValue()); } } } String documentClassCode = DocumentClassCodeParser.buildDocumentClassCodeItem(documentClassCodeList); SlotType1 slot = SlotTypeFactory(Constants.DocumentClassCodeSlotName, documentClassCode); adhocQuery.getSlot().add(slot); AppendAdhocQuery(nhinSubscribe, adhocQuery); log.debug("end transformInternalSubscriptionItemToNhinSubscribeDocument"); return nhinSubscribe; } private static List extractCriterionList(SubscriptionItemType subscriptionItem) { List criterionList = null; if (subscriptionItem != null && subscriptionItem.getSubscriptionCriteria() != null && subscriptionItem.getSubscriptionCriteria().getCriteria() != null) { criterionList = subscriptionItem.getSubscriptionCriteria().getCriteria().getCriterion(); } return criterionList; } public static void AppendAdhocQuery(Subscribe subscribe, AdhocQueryType adhocQuery) { oasis.names.tc.ebxml_regrep.xsd.rim._3.ObjectFactory factory = new oasis.names.tc.ebxml_regrep.xsd.rim._3.ObjectFactory(); JAXBElement adhodQueryElem = factory.createAdhocQuery(adhocQuery); subscribe.getAny().add(adhodQueryElem); } public static void AppendConsumerReference(Subscribe subscribe, String notificationConsumerEndpointAddress, String userAddress) { W3CEndpointReference ref = ConsumerReferenceHelper.CreateConsumerReference(notificationConsumerEndpointAddress, userAddress); subscribe.setConsumerReference(ref); } public static SlotType1 SlotTypeFactory(String slotName, String slotValue) { SlotType1 slot = new SlotType1(); slot.setName(slotName); ValueListType valueList = new ValueListType(); slot.setValueList(valueList); valueList.getValue().add(slotValue); return slot; } }