private String checkPatientIDs( ProvideAndRegisterDocumentSetRequestType req, RegistryPackageType submissionSet, List<ExtrinsicObjectType> extrObjs) throws XDSException { String submissionPatId = InfosetUtil.getExternalIdentifierValue( XDSConstants.UUID_XDSSubmissionSet_patientId, submissionSet); String docPatId; ExtrinsicObjectType eo; for (int i = 0, len = extrObjs.size(); i < len; i++) { eo = extrObjs.get(i); docPatId = InfosetUtil.getExternalIdentifierValue(XDSConstants.UUID_XDSDocumentEntry_patientId, eo); if (docPatId != null && !docPatId.equals(submissionPatId)) { String msg = "XDSDocumentEntry.patientId (" + docPatId + ")and XDSSubmissionSet.patientId (" + submissionPatId + ") doesn't match! ExtrinsicObject.Id:" + eo.getId(); log.warn(msg); throw new XDSException(XDSException.XDS_ERR_PATID_DOESNOT_MATCH, msg, null); } } RegistryPackageType folder = InfosetUtil.getRegistryPackage(req.getSubmitObjectsRequest(), XDSConstants.UUID_XDSFolder); String folderPatId = folder == null ? null : InfosetUtil.getExternalIdentifierValue(XDSConstants.UUID_XDSFolder_patientId, folder); if (folderPatId != null && !folderPatId.equals(submissionPatId)) { String msg = "XDSFolder.patientId (" + folderPatId + ")and XDSSubmissionSet.patientId (" + submissionPatId + ") doesn't match!"; log.warn(msg); throw new XDSException(XDSException.XDS_ERR_PATID_DOESNOT_MATCH, msg, null); } return submissionPatId; }
public static void logQuery( EventTypeCode eventTypeCode, AdhocQueryRequest req, String srcUserID, String altSrcUserID, String srcHostName, String destUserID, String altDestUserID, String destHostName, boolean success) { if (logger != null && logger.isInstalled()) { try { AdhocQueryType qry = req.getAdhocQuery(); String patID = XDSUtil.getQueryPatID(qry.getSlot()); String homeCommunityID = InfosetUtil.getSlotValue(qry.getSlot(), XDSConstants.QRY_HOME_COMMUNITY_ID, null); if (srcHostName == null) srcHostName = AuditLogger.localHost().getHostName(); Calendar timeStamp = logger.timeStamp(); AuditMessage msg = XDSAudit.createQuery( eventTypeCode, qry.getId(), patID, homeCommunityID, InfosetUtil.marshallObject(req, true).getBytes("UTF-8"), srcUserID, altSrcUserID, srcHostName, destUserID, altDestUserID, destHostName, timeStamp, success ? EventOutcomeIndicator.Success : EventOutcomeIndicator.MinorFailure); sendAuditMessage(timeStamp, msg); } catch (Exception e) { log.warn("Audit log of Stored Query failed!"); log.debug("AuditLog Exception:", e); } } }
private List<ExtrinsicObjectType> checkRequest(ProvideAndRegisterDocumentSetRequestType req) throws XDSException { SubmitObjectsRequest sor = req.getSubmitObjectsRequest(); RegistryPackageType submissionSet = InfosetUtil.getRegistryPackage(sor, XDSConstants.UUID_XDSSubmissionSet); if (submissionSet == null) { log.error("No RegistryPackage id=SubmissionSet found!"); throw new XDSException( XDSException.XDS_ERR_REPOSITORY_ERROR, XDSException.XDS_ERR_MISSING_REGISTRY_PACKAGE, null); } else if (submissionSet.getId() == null || submissionSet.getId().trim().length() == 0) { throw new XDSException( XDSException.XDS_ERR_REPOSITORY_METADATA_ERROR, "Missing XDSSubmissionSet.entryUUID!", null); } List<ExtrinsicObjectType> extrObjs = InfosetUtil.getExtrinsicObjects(req.getSubmitObjectsRequest()); checkPatientIDs(req, submissionSet, extrObjs); Map<String, Document> docs = InfosetUtil.getDocuments(req); if (extrObjs.size() > docs.size()) { log.warn( "Missing Documents! Found more ExtrinsicObjects(" + extrObjs.size() + ") than Documents(" + docs.size() + ")!"); throw new XDSException(XDSException.XDS_ERR_MISSING_DOCUMENT, "", null); } else if (extrObjs.size() < docs.size()) { log.warn( "Missing Document Metadata! Found less ExtrinsicObjects(" + extrObjs.size() + ") than Documents(" + docs.size() + ")!"); throw new XDSException(XDSException.XDS_ERR_MISSING_DOCUMENT_METADATA, "", null); } return extrObjs; }
private String getSourceID(ProvideAndRegisterDocumentSetRequestType req) throws XDSException { List<JAXBElement<? extends IdentifiableType>> objs = req.getSubmitObjectsRequest().getRegistryObjectList().getIdentifiable(); IdentifiableType obj; for (int i = 0, len = objs.size(); i < len; i++) { obj = objs.get(i).getValue(); if (obj instanceof RegistryPackageType) { return InfosetUtil.getExternalIdentifierValue( XDSConstants.UUID_XDSSubmissionSet_sourceId, (RegistryPackageType) obj); } } throw new XDSException( XDSException.XDS_ERR_REPOSITORY_METADATA_ERROR, "Missing XDSSubmissionSet.sourceId!", null); }
private XDSDocument[] storeDocuments( ProvideAndRegisterDocumentSetRequestType req, List<ExtrinsicObjectType> extrObjs, String groupID) throws XDSException { Map<String, Document> docs = InfosetUtil.getDocuments(req); Document doc; ExtrinsicObjectType eo; String docUID; XDSDocument[] storedDocs = new XDSDocument[extrObjs.size()]; String[] mimetypes = cfg.isCheckMimetype() ? cfg.getAcceptedMimeTypes() : null; for (int i = 0, len = extrObjs.size(); i < len; i++) { eo = extrObjs.get(i); if (eo.getId() == null || eo.getId().trim().length() == 0) throw new XDSException( XDSException.XDS_ERR_REPOSITORY_METADATA_ERROR, "Missing XDSDocumentEntry.entryUUID!", null); doc = docs.get(eo.getId()); docUID = InfosetUtil.getExternalIdentifierValue(XDSConstants.UUID_XDSDocumentEntry_uniqueId, eo); if (docUID == null) throw new XDSException( XDSException.XDS_ERR_REPOSITORY_METADATA_ERROR, "Missing XDSDocumentEntry.uniqueId!", null); if (mimetypes != null) { boolean unsupportedMimetype = true; for (int j = 0; j < mimetypes.length; j++) { if (mimetypes[j].equals(eo.getMimeType())) { unsupportedMimetype = false; break; } } if (unsupportedMimetype) throw new XDSException( XDSException.XDS_ERR_REPOSITORY_METADATA_ERROR, "Mimetype not supported:" + eo.getMimeType(), null); } try { storedDocs[i] = storage.storeDocument(groupID, docUID, doc.getValue(), eo.getMimeType()); if (storedDocs[i].isCommitted()) { log.warn("Document already exists! docUid:" + docUID); } Map<String, SlotType1> slots = InfosetUtil.addOrOverwriteSlot( eo, XDSConstants.SLOT_NAME_REPOSITORY_UNIQUE_ID, getRepositoryUniqueId()); String oldValue = InfosetUtil.addOrCheckedOverwriteSlot( eo, slots, XDSConstants.SLOT_NAME_SIZE, String.valueOf(storedDocs[i].getSize()), false); if (oldValue != null) { throw new XDSException( XDSException.XDS_ERR_REPOSITORY_METADATA_ERROR, "Slot 'size' already exists but has different value! old:" + oldValue + " new:" + storedDocs[i].getSize(), null); } oldValue = InfosetUtil.addOrCheckedOverwriteSlot( eo, slots, XDSConstants.SLOT_NAME_HASH, storedDocs[i].getDigest(), true); if (oldValue != null) { throw new XDSException( XDSException.XDS_ERR_REPOSITORY_METADATA_ERROR, "Slot 'hash' already exists but has different value! old:" + oldValue + " new:" + storedDocs[i].getDigest(), null); } } catch (XDSException x) { this.commit(storedDocs, false); throw x; } catch (Exception x) { log.error("Storage of document failed! docUID:" + docUID, x); this.commit(storedDocs, false); throw new XDSException( XDSException.XDS_ERR_REPOSITORY_ERROR, "Storage of document " + docUID + " failed! : " + x.getMessage(), x); } } return storedDocs; }