source: ccr/trunk/nhin-vista/projects/NHINC/Current/Product/Production/Adapters/General/ConsumerPreferencesProfileGUI/src/java/gov/hhs/fha/nhinc/cpp/CPPOperations.java@ 507

Last change on this file since 507 was 507, checked in by George Lilly, 15 years ago

NHIN gateway and adaptor for use on linux with VistA EHR and RPMS

File size: 19.2 KB
Line 
1package gov.hhs.fha.nhinc.cpp;
2
3import gov.hhs.fha.nhinc.common.subscriptionb2overridefordocuments.NotificationMessageHolderType;
4import gov.hhs.fha.nhinc.common.subscriptionb2overridefordocuments.NotificationMessageHolderType.Message;
5import gov.hhs.fha.nhinc.common.subscriptionb2overridefordocuments.NotifyDocumentType;
6import gov.hhs.fha.nhinc.entitynotificationconsumer.EntityNotificationConsumerPortType;
7import gov.hhs.fha.nhinc.mpilib.MiniMpi;
8import gov.hhs.fha.nhinc.mpilib.Patient;
9import gov.hhs.fha.nhinc.mpilib.Patients;
10import gov.hhs.fha.nhinc.properties.PropertyAccessException;
11import gov.hhs.fha.nhinc.properties.PropertyAccessor;
12import gov.hhs.fha.nhinc.repository.model.Document;
13import gov.hhs.fha.nhinc.repository.model.DocumentQueryParams;
14import gov.hhs.fha.nhinc.repository.service.DocumentService;
15import ihe.iti.xds_b._2007.RetrieveDocumentSetRequestType;
16import ihe.iti.xds_b._2007.RetrieveDocumentSetRequestType.DocumentRequest;
17import java.util.List;
18import java.util.UUID;
19import javax.xml.bind.JAXBElement;
20import javax.xml.ws.BindingProvider;
21import oasis.names.tc.ebxml_regrep.xsd.query._3.AdhocQueryResponse;
22import oasis.names.tc.ebxml_regrep.xsd.rim._3.ExternalIdentifierType;
23import oasis.names.tc.ebxml_regrep.xsd.rim._3.ExtrinsicObjectType;
24import oasis.names.tc.ebxml_regrep.xsd.rim._3.IdentifiableType;
25import oasis.names.tc.ebxml_regrep.xsd.rim._3.InternationalStringType;
26import oasis.names.tc.ebxml_regrep.xsd.rim._3.LocalizedStringType;
27import oasis.names.tc.ebxml_regrep.xsd.rim._3.RegistryObjectListType;
28import org.apache.commons.logging.Log;
29import org.apache.commons.logging.LogFactory;
30import gov.hhs.fha.nhinc.common.nhinccommon.AssertionType;
31import gov.hhs.fha.nhinc.common.nhinccommon.PersonNameType;
32import gov.hhs.fha.nhinc.common.nhinccommon.UserType;
33import gov.hhs.fha.nhinc.common.nhinccommon.HomeCommunityType;
34import gov.hhs.fha.nhinc.common.nhinccommon.CeType;
35
36/**
37 *
38 * @author svalluripalli
39 */
40public class CPPOperations extends Thread {
41
42 public static final String CPP_CLASS_CODE = "XNHIN-CONSENT";
43 private static Log log = LogFactory.getLog(CPPOperations.class);
44 private static String ADAPTER_PROPFILE_NAME = "adapter";
45 private static String ENTITY_NOTIFICATION_CONSUMER_ENDPOINT_URL = "EntityNotificationConsumerURL";
46 private static String ASSERTIONINFO_PROPFILE_NAME = "assertioninfo";
47 private static String DATE_OF_SIGNATURE = "SignDate";
48 private static String EXPIRATION_DATE = "ExpirationDate";
49 private static String FIRST_NAME = "UserFirstName";
50 private static String LAST_NAME = "UserLastName";
51 private static String USER_NAME = "UserName";
52 private static String ORG_NAME = "UserOrganization";
53 private static String USER_ROLE_CD = "UserRoleCode";
54 private static String USER_ROLE_CD_SYSTEM = "UserRoleCodeSystem";
55 private static String USER_ROLE_CD_SYSTEM_NAME = "UserRoleCodeSystemName";
56 private static String USER_ROLE_DISPLAY_NAME = "UserRoleDisplayName";
57 private static String PURPOSE_FOR_USE_ROLE_CD = "PurposeForUseRoleCode";
58 private static String PURPOSE_FOR_USE_CODE_SYSTEM = "PurposeForUseCodeSystem";
59 private static String PURPOSE_FOR_USE_CODE_SYSTEM_NAME = "PurposeForUseCodeSystemName";
60 private static String PURPOSE_FOR_USE_DISPLAY_NAME = "PurposeForUseDisplayName";
61 private static String CONTENT_REFERENCE = "ContentReference";
62 private static String CONTENT = "Content";
63 private static String SubscribeeCommunityList_PROPFILE_NAME = "SubscribeeCommunityList";
64 private static final String EBXML_RESPONSE_DOCID_IDENTIFICATION_SCHEME = "urn:uuid:2e82c1f6-a085-4c72-9da3-8640a32e42ab";
65 private static final String EBXML_RESPONSE_PATIENTID_IDENTIFICATION_SCHEME = "urn:uuid:58a6f841-87b3-4a3e-92fd-a8ffeff98427";
66 private static final String EBXML_RESPONSE_DOCID_NAME = "XDSDocumentEntry.uniqueId";
67 private static final String EBXML_RESPONSE_PATIENTID_NAME = "XDSDocumentEntry.patientId";
68 private String patId;
69 private String orgId;
70 private String xacml;
71 private boolean finished = false;
72
73 public boolean isFinished() {
74 return finished;
75 }
76
77 public void setFinished(boolean finished) {
78 this.finished = finished;
79 }
80
81 public boolean isSendSuccessful() {
82 return sendSuccessful;
83 }
84
85 public void setSendSuccessful(boolean sendSuccessful) {
86 this.sendSuccessful = sendSuccessful;
87 }
88 private boolean sendSuccessful = false;
89
90 public void init(String patientId, String organisationId, String xacmlDocument){
91 this.patId = patientId;
92 this.orgId = organisationId;
93 this.xacml = xacmlDocument;
94 }
95
96 public void run() {
97 DocumentService docService = new DocumentService();
98
99 log.debug("Saving CPP...");
100 log.debug("patId: " + patId);
101
102 Document doc = retreiveCPP(patId, orgId);
103
104 doc.setClassCode(CPP_CLASS_CODE);
105 doc.setRawData(xacml.getBytes());
106 doc.setPatientId(patId);
107 doc.setSourcePatientId(patId);
108 doc.setDocumentUniqueId(patId + '-' + CPP_CLASS_CODE);
109 doc.setDocumentTitle("Consumer Preferences Profile");
110
111 log.debug("Calling save document");
112 docService.saveDocument(doc);
113 updateOptInNotifyDocument(patId, orgId, xacml, doc);
114 }
115
116 public Document retreiveCPP(String patId, String orgId) {
117 log.debug("Check existing CPP document");
118 Document doc = new Document();
119 DocumentService docService = new DocumentService();
120 DocumentQueryParams params = new DocumentQueryParams();
121 java.util.LinkedList<String> cc = new java.util.LinkedList<String>();
122 java.util.List<Document> docs;
123
124 cc.add(CPP_CLASS_CODE);
125
126 params.setClassCodes(cc);
127 params.setPatientId(patId);
128 docs = docService.documentQuery(params);
129
130 if (docs.size() == 1) {
131 log.debug("found cpp");
132 doc = docs.get(0);
133 }
134 return doc;
135 }
136
137 /**
138 *
139 * @param patId
140 * @param orgId
141 * @param xacml
142 * @param doc
143 */
144 public void updateOptInNotifyDocument(String patId, String orgId, String xacml, gov.hhs.fha.nhinc.repository.model.Document doc) {
145 String ack = "";
146 ack = updateOptIn(patId, orgId, xacml);
147 log.info(ack);
148
149 try { // Call Web Service Operation
150 gov.hhs.fha.nhinc.entitynotificationconsumer.EntityNotificationConsumerPortType port = getEntityNotificationConsumerWebservice();
151 gov.hhs.fha.nhinc.common.nhinccommonentity.NotifySubscribersOfDocumentRequestType notifySubscribersOfDocumentRequest = new gov.hhs.fha.nhinc.common.nhinccommonentity.NotifySubscribersOfDocumentRequestType();
152 DocumentRequest documentRequest = new DocumentRequest();
153 documentRequest.setDocumentUniqueId(doc.getDocumentUniqueId());
154 RetrieveDocumentSetRequestType retrieveDocumentSetRequestType = new RetrieveDocumentSetRequestType();
155 retrieveDocumentSetRequestType.getDocumentRequest().add(documentRequest);
156 Message message = new Message();
157 message.setRetrieveDocumentSetRequest(retrieveDocumentSetRequestType);
158 NotificationMessageHolderType notificationMessageHolderType = new NotificationMessageHolderType();
159 notificationMessageHolderType.setMessage(message);
160 NotifyDocumentType notifyDocumentType = new NotifyDocumentType();
161 notifyDocumentType.getNotificationMessage().add(notificationMessageHolderType);
162 notifySubscribersOfDocumentRequest.setNotify(notifyDocumentType);
163 RegistryObjectListType registryObjectListType = buildRegistryObjectList(patId, orgId, xacml, doc);
164 notifySubscribersOfDocumentRequest.setRegistryObjectList(registryObjectListType);
165 AssertionType assertion = buildAssertion(orgId);
166 notifySubscribersOfDocumentRequest.setAssertion(assertion);
167 gov.hhs.fha.nhinc.common.nhinccommon.AcknowledgementType result = port.notifySubscribersOfDocument(notifySubscribersOfDocumentRequest);
168 System.out.println("Result = " + result);
169 log.info(result.getMessage());
170 } catch (Exception ex) {
171 ex.printStackTrace();
172 }
173 }
174
175 private static RegistryObjectListType buildRegistryObjectList(String patId, String orgId, String xacml, gov.hhs.fha.nhinc.repository.model.Document doc){
176 AdhocQueryResponse oAdhocQueryResponse = new AdhocQueryResponse();
177 RegistryObjectListType oRegObjList = new RegistryObjectListType();
178 oasis.names.tc.ebxml_regrep.xsd.rim._3.ObjectFactory oRimObjectFactory = new oasis.names.tc.ebxml_regrep.xsd.rim._3.ObjectFactory();
179 oAdhocQueryResponse.setRegistryObjectList(oRegObjList);
180 List<JAXBElement<? extends IdentifiableType>> olRegObjs = oRegObjList.getIdentifiable();
181 ExternalIdentifierType oExtId = new ExternalIdentifierType();
182 ExternalIdentifierType oExtId1 = new ExternalIdentifierType();
183 ExtrinsicObjectType oExObj = new ExtrinsicObjectType();
184 JAXBElement<? extends IdentifiableType> oJAXBExtId = oRimObjectFactory.createExtrinsicObject(oExObj);
185 oExtId.setHome(orgId);
186 UUID oDocumentUUID = UUID.randomUUID();
187 String sDocumentUUID = "urn:uuid:" + oDocumentUUID.toString();
188 oExtId.setId(sDocumentUUID);
189 oExtId.setIdentificationScheme(EBXML_RESPONSE_DOCID_IDENTIFICATION_SCHEME);
190 oExtId.setName(CreateSingleValueInternationalStringType(EBXML_RESPONSE_DOCID_NAME));
191 oExtId1.setName(CreateSingleValueInternationalStringType(EBXML_RESPONSE_PATIENTID_NAME));
192 oExtId1.setHome(orgId);
193 UUID oDocumentUUID1 = UUID.randomUUID();
194 String sDocumentUUID1 = "urn:uuid:" + oDocumentUUID1.toString();
195 oExtId1.setId(sDocumentUUID1);
196 oExtId1.setIdentificationScheme(EBXML_RESPONSE_PATIENTID_IDENTIFICATION_SCHEME);
197 oExObj.getExternalIdentifier().add(oExtId1);
198 oExObj.getExternalIdentifier().add(oExtId);
199 olRegObjs.add(oJAXBExtId);
200 return oRegObjList;
201 }
202
203 private static InternationalStringType CreateSingleValueInternationalStringType(String sLocStrValue)
204 {
205 log.debug("DocumentTransforms.CreateSingleValueInternationalStringType() -- Begin");
206 InternationalStringType oName = new InternationalStringType();
207 List<LocalizedStringType> olLocStr = oName.getLocalizedString();
208 LocalizedStringType oNameLocStr = new LocalizedStringType();
209 olLocStr.add(oNameLocStr);
210 oNameLocStr.setCharset("UTF-8");
211 oNameLocStr.setValue(sLocStrValue);
212 oNameLocStr.setLang("en-us");
213 log.debug("DocumentTransforms.CreateSingleValueInternationalStringType() -- End");
214 return oName;
215 }
216
217 private static AssertionType buildAssertion(String gatewayOid){
218 log.debug("Begin - CPPOperations.buildAssertion() - ");
219 AssertionType assertion = new AssertionType();
220 String svalue = "";
221 try {
222 assertion.setHaveSignature(true);
223 assertion.setHaveWitnessSignature(true);
224 svalue = PropertyAccessor.getProperty(ASSERTIONINFO_PROPFILE_NAME, DATE_OF_SIGNATURE);
225 if (svalue != null && svalue.length() > 0) {
226 assertion.setDateOfSignature(svalue.trim());
227 } else {
228 assertion.setDateOfSignature("");
229 }
230
231 svalue = PropertyAccessor.getProperty(ASSERTIONINFO_PROPFILE_NAME, EXPIRATION_DATE);
232 if (null != svalue && svalue.length() > 0) {
233 assertion.setExpirationDate(svalue.trim());
234 } else {
235 assertion.setExpirationDate("");
236 }
237 PersonNameType aPersonName = new PersonNameType();
238 svalue = PropertyAccessor.getProperty(ASSERTIONINFO_PROPFILE_NAME, FIRST_NAME);
239 if(null != svalue && svalue.length() > 0){
240 aPersonName.setGivenName(svalue.trim());
241 } else {
242 aPersonName.setGivenName("");
243 }
244
245 svalue = PropertyAccessor.getProperty(ASSERTIONINFO_PROPFILE_NAME, LAST_NAME);
246 if(null != svalue && svalue.length() > 0){
247 aPersonName.setFamilyName(svalue.trim());
248 } else {
249 aPersonName.setFamilyName("");
250 }
251 UserType aUser = new UserType();
252 aUser.setPersonName(aPersonName);
253
254 HomeCommunityType userHm = new HomeCommunityType();
255 svalue = PropertyAccessor.getProperty(SubscribeeCommunityList_PROPFILE_NAME, gatewayOid);
256 if (null != svalue && svalue.length() > 0) {
257 userHm.setName(svalue.trim());
258 } else {
259 userHm.setName("");
260 }
261 userHm.setHomeCommunityId(gatewayOid);
262 aUser.setOrg(userHm);
263 CeType userCe = new CeType();
264 svalue = PropertyAccessor.getProperty(ASSERTIONINFO_PROPFILE_NAME, USER_ROLE_CD);
265 if(null!=svalue && svalue.length()>0){
266 userCe.setCode(svalue.trim());
267 } else {
268 userCe.setCode("");
269 }
270
271 svalue = PropertyAccessor.getProperty(ASSERTIONINFO_PROPFILE_NAME, USER_ROLE_CD_SYSTEM);
272 if(null!=svalue && svalue.length()>0){
273 userCe.setCodeSystem(svalue.trim());
274 } else {
275 userCe.setCodeSystem("");
276 }
277
278 svalue = PropertyAccessor.getProperty(ASSERTIONINFO_PROPFILE_NAME, USER_ROLE_CD_SYSTEM_NAME);
279 if(null!=svalue && svalue.length()>0){
280 userCe.setCodeSystemName(svalue.trim());
281 } else {
282 userCe.setCodeSystemName("");
283 }
284
285 svalue = PropertyAccessor.getProperty(ASSERTIONINFO_PROPFILE_NAME, USER_ROLE_DISPLAY_NAME);
286 if(null!=svalue && svalue.length()>0){
287 userCe.setDisplayName(svalue.trim());
288 } else {
289 userCe.setDisplayName("");
290 }
291 aUser.setRoleCoded(userCe);
292
293 svalue = PropertyAccessor.getProperty(ASSERTIONINFO_PROPFILE_NAME, USER_NAME);
294 if(null!=svalue && svalue.length()>0){
295 aUser.setUserName(svalue.trim());
296 } else {
297 aUser.setUserName("");
298 }
299 assertion.setUserInfo(aUser);
300
301 svalue = PropertyAccessor.getProperty(ASSERTIONINFO_PROPFILE_NAME, ORG_NAME);
302 HomeCommunityType hm = new HomeCommunityType();
303 if (null != svalue && svalue.length() > 0) {
304 hm.setName(svalue.trim());
305 } else {
306 hm.setName("");
307 }
308 assertion.setHomeCommunity(hm);
309
310 CeType ce = new CeType();
311 svalue = PropertyAccessor.getProperty(ASSERTIONINFO_PROPFILE_NAME, PURPOSE_FOR_USE_ROLE_CD);
312 if(null!=svalue && svalue.length()>0){
313 ce.setCode(svalue.trim());
314 } else {
315 ce.setCode("");
316 }
317 svalue = PropertyAccessor.getProperty(ASSERTIONINFO_PROPFILE_NAME, PURPOSE_FOR_USE_CODE_SYSTEM);
318 if(null!=svalue && svalue.length()>0){
319 ce.setCodeSystem(svalue.trim());
320 } else {
321 ce.setCodeSystem("");
322 }
323 svalue = PropertyAccessor.getProperty(ASSERTIONINFO_PROPFILE_NAME, PURPOSE_FOR_USE_CODE_SYSTEM_NAME);
324 if(null!=svalue && svalue.length()>0){
325 ce.setCodeSystemName(svalue.trim());
326 } else {
327 ce.setCodeSystemName("");
328 }
329 svalue = PropertyAccessor.getProperty(ASSERTIONINFO_PROPFILE_NAME, PURPOSE_FOR_USE_DISPLAY_NAME);
330 if(null!=svalue && svalue.length()>0){
331 ce.setDisplayName(svalue.trim());
332 } else {
333 ce.setDisplayName("");
334 }
335 assertion.setPurposeOfDisclosureCoded(ce);
336
337 svalue = PropertyAccessor.getProperty(ASSERTIONINFO_PROPFILE_NAME, CONTENT_REFERENCE);
338 if(null!=svalue && svalue.length()>0){
339 assertion.setClaimFormRef(svalue.trim());
340 } else {
341 assertion.setClaimFormRef("");
342 }
343
344 svalue = PropertyAccessor.getProperty(ASSERTIONINFO_PROPFILE_NAME, CONTENT);
345 svalue = svalue.trim();
346 if(null!=svalue && svalue.length()>0){
347 assertion.setClaimFormRaw(svalue.getBytes());
348 } else {
349 assertion.setClaimFormRaw("".getBytes());
350 }
351
352 } catch (PropertyAccessException propExp) {
353 propExp.printStackTrace();
354 }
355 log.debug("End - CPPOperations.buildAssertion() - ");
356 return assertion;
357 }
358
359 private EntityNotificationConsumerPortType getEntityNotificationConsumerWebservice() throws PropertyAccessException {
360 String endpointURL = PropertyAccessor.getProperty(ADAPTER_PROPFILE_NAME, ENTITY_NOTIFICATION_CONSUMER_ENDPOINT_URL);
361 log.info("EntitySubscriptionURL :" + endpointURL);
362 EntityNotificationConsumerPortType entitynotificationconsumerPort = null;
363 gov.hhs.fha.nhinc.entitynotificationconsumer.EntityNotificationConsumer service = new gov.hhs.fha.nhinc.entitynotificationconsumer.EntityNotificationConsumer();
364 entitynotificationconsumerPort = service.getEntityNotificationConsumerPortSoap11();
365 // Need to load in the correct UDDI endpoint URL address.
366 //--------------------------------------------------------
367 ((BindingProvider) entitynotificationconsumerPort).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL);
368 return entitynotificationconsumerPort;
369 }
370
371 /**
372 *
373 * @param patId
374 * @param orgId
375 * @param xacml
376 * @return String
377 */
378 public String updateOptIn(String patId, String orgId, String xacml) {
379 log.debug("updateOptIn in MPI");
380 String ack = "";
381 org.w3c.dom.Document doc = CPPUtils.ByteArrayToDoc(xacml.getBytes());
382 boolean optInStatus = CPPUtils.isOptedIn(doc);
383 Patient searchParams = new Patient();
384 searchParams.getIdentifiers().add(patId, orgId);
385 //Search for patient
386 MiniMpi mpi = MiniMpi.GetMpiInstance();
387 Patients searchResults = mpi.Search(searchParams, false, true);
388 if (searchResults != null && searchResults.size() > 0) {
389 if (searchResults.size() > 1) {
390 return "More than one Patient found in MPI";
391 }
392 Patient patFound = searchResults.get(0);
393 if (optInStatus && patFound.isOptedIn()) {
394 return "Patient was already Opted In nothing to Update";
395 }
396
397 if (!optInStatus && !patFound.isOptedIn()) {
398 return "Patient was already Opted Out nothing to Update";
399 }
400
401 patFound.setOptedIn(optInStatus);
402 Patient updatedPatient = mpi.AddUpdate(patFound);
403
404 if (updatedPatient != null && updatedPatient.getIdentifiers().get(0).getId() != null) {
405 ack = "Patient OptInOut Flag Updated Successfully";
406 } else {
407 ack = "Patient OptInOut Flag Not Updated";
408 }
409
410 } else {
411 ack = "Patient Not Found in MPI";
412 }
413 return ack;
414 }
415}
Note: See TracBrowser for help on using the repository browser.