/*! * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package org.pentaho.di.trans.steps.hl7input.common; import java.util.ArrayList; import java.util.List; import java.util.Map; import ca.uhn.hl7v2.model.Group; import ca.uhn.hl7v2.model.Message; import ca.uhn.hl7v2.model.Segment; import ca.uhn.hl7v2.model.Structure; import ca.uhn.hl7v2.model.Type; import ca.uhn.hl7v2.util.SegmentFinder; import ca.uhn.hl7v2.util.Terser; public class HL7KettleParser { public static List<HL7Value> extractValues( Message message ) throws Exception { Terser terser = new Terser( message ); SegmentFinder finder = terser.getFinder(); List<HL7Value> values = new ArrayList<HL7Value>(); int childNr = 1; while ( finder.hasNextChild() ) { // next group in the message (MSH, PID, EVN and so on) // finder.nextChild(); Structure[] structures = finder.getCurrentChildReps(); for ( int i = 0; i < structures.length; i++ ) { Structure structure = structures[i]; parseStructure( values, message, terser, structure, Integer.toString( childNr ) ); } childNr++; } return values; } private static void parseStructure( List<HL7Value> values, Message message, Terser terser, Structure structure, String structureNumber ) throws Exception { Map<String, List<String>> nameMap = NamesUtil.getInstance().getMap(); if ( structure instanceof Segment ) { Segment segment = (Segment) structure; String[] names = segment.getNames(); for ( int n = 1; n <= segment.numFields(); n++ ) { Type[] types = segment.getField( n ); for ( int t = 0; t < types.length; t++ ) { int nrComponents = Terser.numComponents( types[t] ); for ( int c = 1; c <= nrComponents; c++ ) { int nrSub = Terser.numSubComponents( types[t], c ); for ( int sc = 1; sc <= nrSub; sc++ ) { String string = Terser.get( segment, n, t, c, sc ); // Primitive primitive = Terser.getPrimitive(types[t], c, sc); String description = "?"; List<String> list = nameMap.get( types[t].getName() ); if ( list != null && c - 1 < list.size() ) { description = list.get( c - 1 ); } Group group = structure.getParent(); Group rootGroup = structure.getMessage(); String coordinates = n + "." + ( t + 1 ) + "." + c + "." + sc; HL7Value value = new HL7Value( message.getVersion(), rootGroup.getName(), group.getName(), structure.getName(), structureNumber, names[n - 1], coordinates, types[t].getName(), description, string ); values.add( value ); } } } } } else if ( structure instanceof Group ) { Group group = (Group) structure; String[] names = group.getNames(); for ( int n = 1; n <= names.length; n++ ) { String name = names[n - 1]; Structure subStructure = group.get( name ); parseStructure( values, message, terser, subStructure, structureNumber + "." + n ); } } else { throw new Exception( "oops, not handled yet!" ); } } }