diff --git a/nifi-assembly/NOTICE b/nifi-assembly/NOTICE index 5f5b13675d..f839ee74dc 100644 --- a/nifi-assembly/NOTICE +++ b/nifi-assembly/NOTICE @@ -2524,7 +2524,6 @@ Eclipse Public License 1.0 The following binary components are provided under the Eclipse Public License 1.0. See project link for details. - (EPL 1.0) Model-Driven Health Tools ( org.openehealth.ipf.oht.mdht ) https://projects.eclipse.org/proposals/model-driven-health-tools (EPL 1.0) AspectJ Weaver (org.aspectj:aspectjweaver:jar:1.9.6 - http://www.eclipse.org/aspectj/) (EPL 1.0) AspectJ Runtime (org.aspectj:aspectjrt:jar:1.9.6 - http://www.eclipse.org/aspectj/) (EPL 1.0)(MPL 2.0) H2 Database (com.h2database:h2:jar:1.3.176 - http://www.h2database.com/html/license.html) diff --git a/nifi-assembly/pom.xml b/nifi-assembly/pom.xml index b771b68d19..c006087e41 100644 --- a/nifi-assembly/pom.xml +++ b/nifi-assembly/pom.xml @@ -403,12 +403,6 @@ language governing permissions and limitations under the License. --> 2.0.0-SNAPSHOT nar - - org.apache.nifi - nifi-ccda-nar - 2.0.0-SNAPSHOT - nar - org.apache.nifi nifi-language-translation-nar diff --git a/nifi-nar-bundles/nifi-ccda-bundle/nifi-ccda-nar/pom.xml b/nifi-nar-bundles/nifi-ccda-bundle/nifi-ccda-nar/pom.xml deleted file mode 100644 index 17575a503e..0000000000 --- a/nifi-nar-bundles/nifi-ccda-bundle/nifi-ccda-nar/pom.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - 4.0.0 - - - org.apache.nifi - nifi-ccda-bundle - 2.0.0-SNAPSHOT - - - nifi-ccda-nar - nar - - true - true - - - - - org.apache.nifi - nifi-ccda-processors - - - diff --git a/nifi-nar-bundles/nifi-ccda-bundle/nifi-ccda-nar/src/main/resources/META-INF/LICENSE b/nifi-nar-bundles/nifi-ccda-bundle/nifi-ccda-nar/src/main/resources/META-INF/LICENSE deleted file mode 100644 index 6effaa89d3..0000000000 --- a/nifi-nar-bundles/nifi-ccda-bundle/nifi-ccda-nar/src/main/resources/META-INF/LICENSE +++ /dev/null @@ -1,209 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -APACHE NIFI SUBCOMPONENTS: - -The Apache NiFi project contains subcomponents with separate copyright -notices and license terms. Your use of the source code for the these -subcomponents is subject to the terms and conditions of the following -licenses. \ No newline at end of file diff --git a/nifi-nar-bundles/nifi-ccda-bundle/nifi-ccda-nar/src/main/resources/META-INF/NOTICE b/nifi-nar-bundles/nifi-ccda-bundle/nifi-ccda-nar/src/main/resources/META-INF/NOTICE deleted file mode 100644 index 561fcb3efd..0000000000 --- a/nifi-nar-bundles/nifi-ccda-bundle/nifi-ccda-nar/src/main/resources/META-INF/NOTICE +++ /dev/null @@ -1,60 +0,0 @@ -nifi-ccda-nar -Copyright 2015-2020 The Apache Software Foundation - -This product includes software developed at -The Apache Software Foundation (http://www.apache.org/). - -****************** -Apache Software License v2 -****************** - -The following binary components are provided under the Apache Software License v2 - - (ASLv2) Apache Commons JEXL - The following NOTICE information applies: - Apache Commons JEXL - Copyright 2001-2015 The Apache Software Foundation - - This product includes software developed at - The Apache Software Foundation (http://www.apache.org/). - - (ASLv2) Apache Commons Lang - The following NOTICE information applies: - Apache Commons Lang - Copyright 2001-2015 The Apache Software Foundation - - This product includes software from the Spring Framework, - under the Apache License 2.0 (see: StringUtils.containsWhitespace()) - - (ASLv2) Jackson JSON processor - The following NOTICE information applies: - # Jackson JSON processor - - Jackson is a high-performance, Free/Open Source JSON processing library. - It was originally written by Tatu Saloranta (tatu.saloranta@iki.fi), and has - been in development since 2007. - It is currently developed by a community of developers, as well as supported - commercially by FasterXML.com. - - ## Licensing - - Jackson core and extension components may licensed under different licenses. - To find the details that apply to this artifact see the accompanying LICENSE file. - For more information, including possible other licensing options, contact - FasterXML.com (http://fasterxml.com). - - ## Credits - - A list of contributors may be found from CREDITS file, which is included - in some artifacts (usually source distributions); but is always available - from the source code management (SCM) system project uses. - -***************** -Eclipse Public License - v 1.0 -***************** -The following binary components are provided under the Eclipse Public License v1.1. - - (EPLv1) Model-Driven Health Tools (MDHT) - The following NOTICE information applies: - Copyright (c) 2011, 2012 Sean Muir and others. (http://www.eclipse.org/legal/epl-v10.html) - diff --git a/nifi-nar-bundles/nifi-ccda-bundle/nifi-ccda-processors/pom.xml b/nifi-nar-bundles/nifi-ccda-bundle/nifi-ccda-processors/pom.xml deleted file mode 100644 index d464783e57..0000000000 --- a/nifi-nar-bundles/nifi-ccda-bundle/nifi-ccda-processors/pom.xml +++ /dev/null @@ -1,89 +0,0 @@ - - - - 4.0.0 - - - org.apache.nifi - nifi-ccda-bundle - 2.0.0-SNAPSHOT - - - nifi-ccda-processors - jar - - - - org.apache.nifi - nifi-api - - - org.apache.nifi - nifi-utils - 2.0.0-SNAPSHOT - - - org.apache.nifi - nifi-xml-processing - 2.0.0-SNAPSHOT - - - org.apache.commons - commons-lang3 - - - org.apache.commons - commons-jexl3 - 3.2.1 - - - commons-logging - commons-logging - - - - - org.slf4j - jcl-over-slf4j - - - org.openehealth.ipf.oht.mdht - ipf-oht-mdht-uml-cda - 1.2.0.201212201425 - - - org.openehealth.ipf.oht.mdht - ipf-oht-mdht-uml-cda-ccd - 1.2.0.201212201425 - - - org.openehealth.ipf.oht.mdht - ipf-oht-mdht-uml-cda-hitsp - 1.2.0.201212201425 - - - org.openehealth.ipf.oht.mdht - ipf-oht-mdht-uml-cda-consol - 1.2.0.201212201425 - - - org.apache.nifi - nifi-mock - 2.0.0-SNAPSHOT - test - - - diff --git a/nifi-nar-bundles/nifi-ccda-bundle/nifi-ccda-processors/src/main/java/org/apache/nifi/processors/ccda/ExtractCCDAAttributes.java b/nifi-nar-bundles/nifi-ccda-bundle/nifi-ccda-processors/src/main/java/org/apache/nifi/processors/ccda/ExtractCCDAAttributes.java deleted file mode 100644 index ac52406bbd..0000000000 --- a/nifi-nar-bundles/nifi-ccda-bundle/nifi-ccda-processors/src/main/java/org/apache/nifi/processors/ccda/ExtractCCDAAttributes.java +++ /dev/null @@ -1,347 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.nifi.processors.ccda; - -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Properties; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.TimeUnit; - -import org.apache.commons.jexl3.JexlBuilder; -import org.apache.commons.jexl3.JexlContext; -import org.apache.commons.jexl3.JexlEngine; -import org.apache.commons.jexl3.JexlExpression; -import org.apache.commons.jexl3.MapContext; -import org.apache.commons.lang3.StringUtils; -import org.apache.nifi.annotation.behavior.InputRequirement; -import org.apache.nifi.annotation.behavior.InputRequirement.Requirement; -import org.apache.nifi.annotation.behavior.SideEffectFree; -import org.apache.nifi.annotation.behavior.SupportsBatching; -import org.apache.nifi.annotation.documentation.CapabilityDescription; -import org.apache.nifi.annotation.documentation.DeprecationNotice; -import org.apache.nifi.annotation.documentation.Tags; -import org.apache.nifi.annotation.lifecycle.OnScheduled; -import org.apache.nifi.components.PropertyDescriptor; -import org.apache.nifi.flowfile.FlowFile; -import org.apache.nifi.processor.AbstractProcessor; -import org.apache.nifi.processor.ProcessContext; -import org.apache.nifi.processor.ProcessSession; -import org.apache.nifi.processor.ProcessorInitializationContext; -import org.apache.nifi.processor.Relationship; -import org.apache.nifi.processor.exception.ProcessException; -import org.apache.nifi.processor.util.StandardValidators; -import org.apache.nifi.util.StopWatch; -import org.apache.nifi.xml.processing.parsers.StandardDocumentProvider; -import org.eclipse.emf.common.util.Diagnostic; -import org.openhealthtools.mdht.uml.cda.CDAPackage; -import org.openhealthtools.mdht.uml.cda.ClinicalDocument; -import org.openhealthtools.mdht.uml.cda.ccd.CCDPackage; -import org.openhealthtools.mdht.uml.cda.consol.ConsolPackage; -import org.openhealthtools.mdht.uml.cda.hitsp.HITSPPackage; -import org.openhealthtools.mdht.uml.cda.ihe.IHEPackage; -import org.openhealthtools.mdht.uml.cda.util.CDAUtil; -import org.openhealthtools.mdht.uml.cda.util.CDAUtil.ValidationHandler; -import org.w3c.dom.Document; - -@DeprecationNotice(reason = "Parsing XML elements to FlowFile attributes is not recommend and should be replaced with record-oriented handling") -@SideEffectFree -@SupportsBatching -@InputRequirement(Requirement.INPUT_REQUIRED) -@Tags({"CCDA", "healthcare", "extract", "attributes"}) -@CapabilityDescription("Extracts information from an Consolidated CDA formatted FlowFile and provides individual attributes " - + "as FlowFile attributes. The attributes are named as . " - + "If the Parent is repeating, the naming will be . " - + "For example, section.act_07.observation.name=Essential hypertension") -public class ExtractCCDAAttributes extends AbstractProcessor { - - private static final char FIELD_SEPARATOR = '@'; - private static final char KEY_VALUE_SEPARATOR = '#'; - - private Map> processMap = new LinkedHashMap>(); // stores mapping data for Parser - private JexlEngine jexl = null; // JEXL Engine to execute code for mapping - private JexlContext jexlCtx = null; // JEXL Context to hold element being processed - - private List properties; - private Set relationships; - - /** - * SKIP_VALIDATION - Indicates whether to validate the CDA document after loading. - * if true and the document is not valid, then ProcessException will be thrown - */ - public static final PropertyDescriptor SKIP_VALIDATION = new PropertyDescriptor.Builder().name("skip-validation") - .displayName("Skip Validation").description("Whether or not to validate CDA message values").required(true) - .allowableValues("true", "false").defaultValue("true").addValidator(StandardValidators.BOOLEAN_VALIDATOR) - .build(); - - /** - * REL_SUCCESS - Value to be returned in case the processor succeeds - */ - public static final Relationship REL_SUCCESS = new Relationship.Builder() - .name("success") - .description("A FlowFile is routed to this relationship if it is properly parsed as CDA and its contents extracted as attributes.") - .build(); - - /** - * REL_FAILURE - Value to be returned in case the processor fails - */ - public static final Relationship REL_FAILURE = new Relationship.Builder() - .name("failure") - .description("A FlowFile is routed to this relationship if it cannot be parsed as CDA or its contents extracted as attributes.") - .build(); - - @Override - protected List getSupportedPropertyDescriptors() { - return properties; - } - - @Override - public Set getRelationships() { - return relationships; - } - - @Override - protected void init(final ProcessorInitializationContext context) { - final Set _relationships = new HashSet<>(); - _relationships.add(REL_SUCCESS); - _relationships.add(REL_FAILURE); - this.relationships = Collections.unmodifiableSet(_relationships); - - final List _properties = new ArrayList<>(); - _properties.add(SKIP_VALIDATION); - this.properties = Collections.unmodifiableList(_properties); - } - - @OnScheduled - public void onScheduled(final ProcessContext context) throws IOException { - getLogger().debug("Loading packages"); - final StopWatch stopWatch = new StopWatch(true); - - // Load required MDHT packages - System.setProperty( "org.eclipse.emf.ecore.EPackage.Registry.INSTANCE", - "org.eclipse.emf.ecore.impl.EPackageRegistryImpl" ); - CDAPackage.eINSTANCE.eClass(); - HITSPPackage.eINSTANCE.eClass(); - CCDPackage.eINSTANCE.eClass(); - ConsolPackage.eINSTANCE.eClass(); - IHEPackage.eINSTANCE.eClass(); - stopWatch.stop(); - getLogger().debug("Loaded packages in {}", new Object[] {stopWatch.getDuration(TimeUnit.MILLISECONDS)}); - - // Initialize JEXL - jexl = new JexlBuilder().cache(1024).debug(false).silent(true).strict(false).create(); - jexlCtx = new MapContext(); - - getLogger().debug("Loading mappings"); - loadMappings(); // Load CDA mappings for parser - - } - - @Override - public void onTrigger(final ProcessContext context, final ProcessSession session) { - Map attributes = new TreeMap(); // stores CDA attributes - getLogger().info("Processing CCDA"); - - FlowFile flowFile = session.get(); - if ( flowFile == null ) { - return; - } - - if(processMap.isEmpty()) { - getLogger().error("Process Mapping is not loaded"); - session.transfer(flowFile, REL_FAILURE); - return; - } - - final Boolean skipValidation = context.getProperty(SKIP_VALIDATION).asBoolean(); - - final StopWatch stopWatch = new StopWatch(true); - - ClinicalDocument cd = null; - try { - cd = loadDocument(session.read(flowFile), skipValidation); // Load and optionally validate CDA document - } catch (ProcessException e) { - session.transfer(flowFile, REL_FAILURE); - return; - } - - getLogger().debug("Loaded document for {} in {}", new Object[] {flowFile, stopWatch.getElapsed(TimeUnit.MILLISECONDS)}); - - getLogger().debug("Processing elements"); - processElement(null, cd, attributes); // Process CDA element using mapping data - - flowFile = session.putAllAttributes(flowFile, attributes); - - stopWatch.stop(); - getLogger().debug("Successfully processed {} in {}", new Object[] {flowFile, stopWatch.getDuration(TimeUnit.MILLISECONDS)}); - if(getLogger().isDebugEnabled()){ - for (Entry entry : attributes.entrySet()) { - getLogger().debug("Attribute: {}={}", new Object[] {entry.getKey(), entry.getValue()}); - } - } - - session.transfer(flowFile, REL_SUCCESS); - - } - - /** - * Process elements children based on the parser mapping. - * Any String values are added to attributes - * For List, the processList method is called to iterate and process - * For an Object this method is called recursively - * While adding to the attributes the key is prefixed by parent - * @param parent parent key for this element, used as a prefix for attribute key - * @param element element to be processed - * @param attributes map of attributes to populate - * @return map of processed data, value can contain String or Map of Strings - */ - protected Map processElement(String parent, Object element, Map attributes) { - final StopWatch stopWatch = new StopWatch(true); - - Map map = new LinkedHashMap(); - String name = element.getClass().getName(); - Map jexlMap = processMap.get(name); // get JEXL mappings for this element - - if (jexlMap == null) { - getLogger().warn("Missing mapping for element " + name); - return null; - } - - for (Entry entry : jexlMap.entrySet()) { // evaluate JEXL for each child element - jexlCtx.set("element", element); - JexlExpression jexlExpr = jexl.createExpression(entry.getValue()); - Object value = jexlExpr.evaluate(jexlCtx); - String key = entry.getKey(); - String prefix = parent != null ? parent + "." + key : key; - addElement(map, prefix, key, value, attributes); - } - stopWatch.stop(); - getLogger().debug("Processed {} in {}", new Object[] {name, stopWatch.getDuration(TimeUnit.MILLISECONDS)}); - - return map; - } - - /** - * Adds element to the attribute list based on the type - * @param map object map - * @param prefix parent key as prefix - * @param key element key - * @param value element value - */ - protected Map addElement(Map map, String prefix, String key, Object value, Map attributes) { - // if the value is a String, add it to final attribute list - // else process it further until we have a String representation - if (value instanceof String) { - if(value != null && !((String) value).isEmpty()) { - map.put(key, value); - attributes.put(prefix, (String) value); - } - } else if (value instanceof List) { - if(value != null && !((List) value).isEmpty()) { - map.put(key, processList(prefix, (List) value, attributes)); - } - } else if (value != null) { // process element further - map.put(key, processElement(prefix, value, attributes)); - } - return attributes; - } - - /** - * Iterate through the list and calls processElement to process each element - * @param key key used while calling processElement - * @param value value is the individual Object being processed - * @param attributes map of attributes to populate - * @return list of elements - */ - protected List processList(String key, List value, Map attributes) { - List items = new ArrayList(); - String keyFormat = value.size() > 1 ? "%s_%02d" : "%s"; - for (Object item : value) { // iterate over all elements and process each element - items.add(processElement(String.format(keyFormat, key, items.size() + 1), item, attributes)); - } - return items; - } - - protected ClinicalDocument loadDocument(InputStream inputStream, Boolean skipValidation) { - ClinicalDocument cd = null; - - try { - final StandardDocumentProvider documentProvider = new StandardDocumentProvider(); - documentProvider.setNamespaceAware(true); - final Document document = documentProvider.parse(inputStream); - - cd = CDAUtil.load(document); // load CDA document - if (!skipValidation && !CDAUtil.validate(cd, new CDAValidationHandler())) { //optional validation - getLogger().error("Failed to validate CDA document"); - throw new ProcessException("Failed to validate CDA document"); - } - } catch (Exception e) { - getLogger().error("Failed to load CDA document", e); - throw new ProcessException("Failed to load CDA document", e); - } - return cd; - } - - protected void loadMappings() { - ClassLoader classloader = Thread.currentThread().getContextClassLoader(); - Properties mappings = new Properties(); - try (InputStream is = classloader.getResourceAsStream("mapping.properties")){ - mappings.load(is); - // each child element is key#value and multiple elements are separated by @ - for (String property : mappings.stringPropertyNames()) { - String[] variables = StringUtils.split(mappings.getProperty(property), FIELD_SEPARATOR); - Map map = new LinkedHashMap(); - for (String variable : variables) { - String[] keyvalue = StringUtils.split(variable, KEY_VALUE_SEPARATOR); - map.put(keyvalue[0], keyvalue[1]); - } - processMap.put(property, map); - } - - } catch (IOException e) { - getLogger().error("Failed to load mappings", e); - throw new ProcessException("Failed to load mappings", e); - } - - } - - protected class CDAValidationHandler implements ValidationHandler { - @Override - public void handleError(Diagnostic diagnostic) { - getLogger().error(new StringBuilder("ERROR: ").append(diagnostic.getMessage()).toString()); - } - - @Override - public void handleWarning(Diagnostic diagnostic) { - getLogger().warn(new StringBuilder("WARNING: ").append(diagnostic.getMessage()).toString()); - } - - @Override - public void handleInfo(Diagnostic diagnostic) { - getLogger().info(new StringBuilder("INFO: ").append(diagnostic.getMessage()).toString()); - } - } - -} diff --git a/nifi-nar-bundles/nifi-ccda-bundle/nifi-ccda-processors/src/main/resources/META-INF/services/org.apache.nifi.processor.Processor b/nifi-nar-bundles/nifi-ccda-bundle/nifi-ccda-processors/src/main/resources/META-INF/services/org.apache.nifi.processor.Processor deleted file mode 100644 index b88018d7d7..0000000000 --- a/nifi-nar-bundles/nifi-ccda-bundle/nifi-ccda-processors/src/main/resources/META-INF/services/org.apache.nifi.processor.Processor +++ /dev/null @@ -1,15 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -org.apache.nifi.processors.ccda.ExtractCCDAAttributes \ No newline at end of file diff --git a/nifi-nar-bundles/nifi-ccda-bundle/nifi-ccda-processors/src/main/resources/docs/org.apache.nifi.processors.ccda.ExtractCCDAAttributes/additionalDetails.html b/nifi-nar-bundles/nifi-ccda-bundle/nifi-ccda-processors/src/main/resources/docs/org.apache.nifi.processors.ccda.ExtractCCDAAttributes/additionalDetails.html deleted file mode 100644 index 999078ab8e..0000000000 --- a/nifi-nar-bundles/nifi-ccda-bundle/nifi-ccda-processors/src/main/resources/docs/org.apache.nifi.processors.ccda.ExtractCCDAAttributes/additionalDetails.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - ExtractCCDAAttributes - - - - - -

Apache NiFi C-CDA Processor

-

- C-CDA Processor Bundle provides parser for Consolidated-CDA documents
- This processor parses C-CDA and sets attributes as FlowFile attributes. The attributes are named as <Parent> <dot> <Key>.
- If the Parent is repeating, the naming will be <Parent> <underscore> <Parent Index> <dot> <Key>.
-

-

Example Attribute Output

-

-


-    problemSection.act.observation.problemStatus.code.code=33999-4
-    problemSection.act.observation.problemStatus.code.codeSystem=2.16.840.1.113883.6.1
-    problemSection.act.observation.problemStatus.code.codeSystemName=LOINC
-    problemSection.act.observation.problemStatus.code.displayName=Status
-    problemSection.act.observation.problemStatus.statusCode.code=completed
-    problemSection.act.observation.statusCode.code=completed
-            
-

-

Example Parser Mapping

-

- This processor is driven by a mapping file which specifies the element relationships. For example -


-    org.openhealthtools.mdht.uml.cda.consol.impl.ProblemObservationImpl=id#element.ids\
-        @values#element.values[0]\
-        @statusCode#element.statusCode\
-        @effectiveTime#element.effectiveTime\
-        @negation#element.negationInd\
-        @problemStatus#element.problemStatus
-    org.openhealthtools.mdht.uml.cda.consol.impl.ProblemStatusImpl=id#element.id\
-        @code#element.code\
-        @values#element.values[0]\
-        @statusCode#element.statusCode
-            
-

-

References

-

- These mappings are defined as per the implementation guide—HL7 Implementation Guide for CDA® Release 2
-

- - diff --git a/nifi-nar-bundles/nifi-ccda-bundle/nifi-ccda-processors/src/main/resources/mapping.properties b/nifi-nar-bundles/nifi-ccda-bundle/nifi-ccda-processors/src/main/resources/mapping.properties deleted file mode 100644 index c2fbc97a4b..0000000000 --- a/nifi-nar-bundles/nifi-ccda-bundle/nifi-ccda-processors/src/main/resources/mapping.properties +++ /dev/null @@ -1,89 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Consolidated CCD -org.openhealthtools.mdht.uml.cda.consol.impl.ContinuityOfCareDocumentImpl=id#element.id\ - @code#element.code\ - @title#element.title.text\ - @effectiveTime#element.effectiveTime.value\ - @problemSection#element.problemSection\ - @vitalSignsSection#element.vitalSignsSectionEntriesOptional -org.openhealthtools.mdht.uml.cda.consol.impl.ProblemSectionImpl=id#element.id\ - @code#element.code\ - @title#element.title.text\ - @act#element.problemConcerns -org.openhealthtools.mdht.uml.cda.consol.impl.ProblemConcernActImpl=id#element.ids\ - @code#element.code\ - @statusCode#element.statusCode\ - @effectiveTime#element.effectiveTime\ - @observation#element.observations -org.openhealthtools.mdht.uml.cda.consol.impl.ProblemObservationImpl=id#element.ids\ - @values#element.values[0]\ - @statusCode#element.statusCode\ - @effectiveTime#element.effectiveTime\ - @negation#element.negationInd\ - @problemStatus#element.problemStatus -org.openhealthtools.mdht.uml.cda.consol.impl.ProblemStatusImpl=id#element.id\ - @code#element.code\ - @values#element.values[0]\ - @statusCode#element.statusCode -org.openhealthtools.mdht.uml.cda.consol.impl.VitalSignsSectionImpl=ids#element.ids\ - @code#element.code\ - @title#element.title.text\ - @organizer#element.vitalSignsOrganizers -org.openhealthtools.mdht.uml.cda.consol.impl.VitalSignsSectionEntriesOptionalImpl=organizer#element.vitalSignsOrganizers -org.openhealthtools.mdht.uml.cda.consol.impl.VitalSignsOrganizerImpl=ids#element.ids\ - @code#element.code\ - @statusCode#element.statusCode\ - @effectiveTime#element.effectiveTime\ - @observations#element.vitalSignObservations -org.openhealthtools.mdht.uml.cda.consol.impl.VitalSignObservationImpl=ids#element.ids\ - @code#element.code\ - @text#element.text\ - @statusCode#element.statusCode\ - @effectiveTime#element.effectiveTime\ - @values#element.values -# HL7 Datatypes -org.openhealthtools.mdht.uml.hl7.datatypes.impl.CEImpl=code#element.code\ - @codeSystem#element.codeSystem\ - @codeSystemName#element.codeSystemName\ - @displayName#element.displayName\ - @originalText#element.originalText\ - @translations#element.translations -org.openhealthtools.mdht.uml.hl7.datatypes.impl.CSImpl=code#element.code\ - @codeSystem#element.codeSystem\ - @codeSystemName#element.codeSystemName\ - @displayName#element.displayName\ - @originalText#element.originalText\ - @translations#element.translations -org.openhealthtools.mdht.uml.hl7.datatypes.impl.CDImpl=code#element.code\ - @codeSystem#element.codeSystem\ - @codeSystemName#element.codeSystemName\ - @displayName#element.displayName\ - @originalText#element.originalText\ - @translations#element.translations -org.openhealthtools.mdht.uml.hl7.datatypes.impl.IVL_TSImpl=low#element.low != null? element.low.value: null\ - @high#element.high != null? element.high.value: null\ - @center#element.center != null? element.center.value: null\ - @value#element.value -org.openhealthtools.mdht.uml.hl7.datatypes.impl.IIImpl=extension#element.extension\ - @root#element.root -org.openhealthtools.mdht.uml.hl7.datatypes.impl.PQImpl=unit#element.unit\ - @value#element.value.toPlainString() -org.openhealthtools.mdht.uml.hl7.datatypes.impl.EDImpl=reference#element.reference\ - @text#element.mixed -org.openhealthtools.mdht.uml.hl7.datatypes.impl.TELImpl=value#element.value -org.eclipse.emf.ecore.impl.EStructuralFeatureImpl$SimpleFeatureMapEntry=value#element.value.trim() -org.eclipse.emf.ecore.impl.EStructuralFeatureImpl$ContainmentUpdatingFeatureMapEntry=value#element.value.trim() \ No newline at end of file diff --git a/nifi-nar-bundles/nifi-ccda-bundle/nifi-ccda-processors/src/test/java/org/apache/nifi/processors/ccda/TestExtractCCDAAttributes.java b/nifi-nar-bundles/nifi-ccda-bundle/nifi-ccda-processors/src/test/java/org/apache/nifi/processors/ccda/TestExtractCCDAAttributes.java deleted file mode 100644 index 27620a6cdc..0000000000 --- a/nifi-nar-bundles/nifi-ccda-bundle/nifi-ccda-processors/src/test/java/org/apache/nifi/processors/ccda/TestExtractCCDAAttributes.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.nifi.processors.ccda; - -import org.apache.nifi.util.MockFlowFile; -import org.apache.nifi.util.TestRunner; -import org.apache.nifi.util.TestRunners; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.openhealthtools.mdht.uml.cda.consol.ConsolFactory; -import org.openhealthtools.mdht.uml.cda.consol.ContinuityOfCareDocument; -import org.openhealthtools.mdht.uml.cda.consol.ProblemConcernAct; -import org.openhealthtools.mdht.uml.cda.consol.ProblemObservation; -import org.openhealthtools.mdht.uml.cda.consol.ProblemSection; -import org.openhealthtools.mdht.uml.cda.consol.ProblemStatus; -import org.openhealthtools.mdht.uml.cda.consol.VitalSignObservation; -import org.openhealthtools.mdht.uml.cda.consol.VitalSignsOrganizer; -import org.openhealthtools.mdht.uml.cda.consol.VitalSignsSection; -import org.openhealthtools.mdht.uml.cda.util.CDAUtil; - -import java.io.StringWriter; -import java.util.LinkedHashMap; -import java.util.Map; - -public class TestExtractCCDAAttributes { - - private static final String INVALID_DOCTYPE = " %entity;]>"; - - private static final String INVALID_DOCUMENT = String.format("%s", INVALID_DOCTYPE); - - private TestRunner runner; - - @BeforeEach - public void init() { - runner = TestRunners.newTestRunner(ExtractCCDAAttributes.class); - } - - @Test - public void testProcessor() throws Exception { - Map expectedAttributes = new LinkedHashMap<>(); - expectedAttributes.put("code.code", "34133-9"); - expectedAttributes.put("code.codeSystem", "2.16.840.1.113883.6.1"); - expectedAttributes.put("code.codeSystemName", "LOINC"); - expectedAttributes.put("code.displayName", "Summarization of Episode Note"); - expectedAttributes.put("problemSection.code.code", "11450-4"); - expectedAttributes.put("problemSection.code.codeSystem", "2.16.840.1.113883.6.1"); - expectedAttributes.put("problemSection.code.codeSystemName", "LOINC"); - expectedAttributes.put("problemSection.code.displayName", "Problem List"); - expectedAttributes.put("problemSection.act.code.code", "CONC"); - expectedAttributes.put("problemSection.act.code.codeSystem", "2.16.840.1.113883.5.6"); - expectedAttributes.put("problemSection.act.code.codeSystemName", "HL7ActClass"); - expectedAttributes.put("problemSection.act.code.displayName", "Concern"); - expectedAttributes.put("problemSection.act.observation.problemStatus.code.code", "33999-4"); - expectedAttributes.put("problemSection.act.observation.problemStatus.code.codeSystem", "2.16.840.1.113883.6.1"); - expectedAttributes.put("problemSection.act.observation.problemStatus.code.codeSystemName", "LOINC"); - expectedAttributes.put("problemSection.act.observation.problemStatus.code.displayName", "Status"); - expectedAttributes.put("problemSection.act.observation.problemStatus.statusCode.code", "completed"); - expectedAttributes.put("problemSection.act.observation.statusCode.code", "completed"); - expectedAttributes.put("vitalSignsSection.code.code", "8716-3"); - expectedAttributes.put("vitalSignsSection.code.codeSystem", "2.16.840.1.113883.6.1"); - expectedAttributes.put("vitalSignsSection.code.codeSystemName", "LOINC"); - expectedAttributes.put("vitalSignsSection.code.displayName", "Vital Signs"); - expectedAttributes.put("vitalSignsSection.organizer.code.code", "46680005"); - expectedAttributes.put("vitalSignsSection.organizer.code.codeSystem", "2.16.840.1.113883.6.96"); - expectedAttributes.put("vitalSignsSection.organizer.code.codeSystemName", "SNOMEDCT"); - expectedAttributes.put("vitalSignsSection.organizer.code.displayName", "Vital signs"); - expectedAttributes.put("vitalSignsSection.organizer.statusCode.code", "completed"); - expectedAttributes.put("vitalSignsSection.organizer.observations.code.codeSystem", "2.16.840.1.113883.6.1"); - expectedAttributes.put("vitalSignsSection.organizer.observations.code.codeSystemName", "LOINC"); - expectedAttributes.put("vitalSignsSection.organizer.observations.statusCode.code", "completed"); - - ContinuityOfCareDocument doc = ConsolFactory.eINSTANCE.createContinuityOfCareDocument().init(); - - ProblemConcernAct problemAct = ConsolFactory.eINSTANCE.createProblemConcernAct().init(); - ProblemObservation problemObservation = ConsolFactory.eINSTANCE.createProblemObservation().init(); - ProblemStatus problemStatus = ConsolFactory.eINSTANCE.createProblemStatus().init(); - - ProblemSection problemSection = ConsolFactory.eINSTANCE.createProblemSection().init(); - doc.addSection(problemSection); - problemSection.addAct(problemAct); - problemAct.addObservation(problemObservation); - problemObservation.addObservation(problemStatus); - - VitalSignsOrganizer vitalSignsOrganizer = ConsolFactory.eINSTANCE.createVitalSignsOrganizer().init(); - VitalSignObservation vitalSignObservation = ConsolFactory.eINSTANCE.createVitalSignObservation().init(); - - VitalSignsSection vitalSignsSection = ConsolFactory.eINSTANCE.createVitalSignsSection().init(); - doc.addSection(vitalSignsSection); - vitalSignsSection.addOrganizer(vitalSignsOrganizer); - vitalSignsOrganizer.addObservation(vitalSignObservation); - - StringWriter writer = new StringWriter(); - CDAUtil.save(doc, writer); - - runTests(writer.toString(), expectedAttributes); - } - - @Test - public void testRunInvalidDocument() { - runner.enqueue(INVALID_DOCUMENT); - - runner.run(); - - runner.assertAllFlowFilesTransferred(ExtractCCDAAttributes.REL_FAILURE); - } - - - private void runTests(final String content, final Map expectedAttributes) { - runner.setProperty(ExtractCCDAAttributes.SKIP_VALIDATION, Boolean.TRUE.toString()); - - runner.enqueue(content); - - runner.run(); - runner.assertAllFlowFilesTransferred(ExtractCCDAAttributes.REL_SUCCESS, 1); - - final MockFlowFile flowFile = runner.getFlowFilesForRelationship(ExtractCCDAAttributes.REL_SUCCESS).get(0); - for (final Map.Entry entry : expectedAttributes.entrySet()) { - flowFile.assertAttributeEquals(entry.getKey(), entry.getValue()); - } - - } -} diff --git a/nifi-nar-bundles/nifi-ccda-bundle/pom.xml b/nifi-nar-bundles/nifi-ccda-bundle/pom.xml deleted file mode 100644 index 1a5ef9b7c7..0000000000 --- a/nifi-nar-bundles/nifi-ccda-bundle/pom.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - 4.0.0 - - - org.apache.nifi - nifi-nar-bundles - 2.0.0-SNAPSHOT - - - nifi-ccda-bundle - pom - - - nifi-ccda-processors - nifi-ccda-nar - - - - - - org.apache.nifi - nifi-ccda-processors - 2.0.0-SNAPSHOT - - - - diff --git a/nifi-nar-bundles/pom.xml b/nifi-nar-bundles/pom.xml index f089c73dda..f8864de257 100755 --- a/nifi-nar-bundles/pom.xml +++ b/nifi-nar-bundles/pom.xml @@ -42,7 +42,6 @@ nifi-social-media-bundle nifi-enrich-bundle nifi-hl7-bundle - nifi-ccda-bundle nifi-language-translation-bundle nifi-mongodb-bundle nifi-hbase-bundle