/*******************************************************************************
* Copyright (c) 2011-2016 Medevit OG, Medelexis AG
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Marco Descher, initial API and implementaion
* Lucia Amman, bug fixes and improvements
* Sponsors: M. + P. Richter
*******************************************************************************/
package at.medevit.elexis.gdt.messages;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import at.medevit.elexis.gdt.constants.GDTConstants;
public class GDTSatzNachricht {
final static String CRLF = "\r\n";
LinkedList<String> message = null;
HashMap<Integer, String> values = new LinkedHashMap<Integer, String>();;
int charCounterSatzLaenge = 0;
DecimalFormat threePlaces = new DecimalFormat("000");
DecimalFormat fivePlaces = new DecimalFormat("00000");
/**
* Erzeugt das Grundgerüst einer GDT Satznachricht, beinhaltet bereits folgende Felder
* SATZIDENTIFIKATION, GDT_ID_EMPFÄNGER, GDT_ID_SENDER, VERWENDETER ZEICHENSATZ, GDT VERSION
*
* @param gdtIdReceiver optional
* @param gdtIdSender optional
* @param zeichensatz optional
* @param gdtVersion - default: {@link GDTConstants#GDT_VERSION}
*/
public GDTSatzNachricht(int satzart, String gdtIdReceiver, String gdtIdSender, String zeichensatz, String gdtVersion){
charCounterSatzLaenge = 0;
values.put(GDTConstants.FELDKENNUNG_SATZIDENTIFIKATION, satzart+"");
values.put(GDTConstants.FELDKENNUNG_GDT_ID_EMPFAENGER, gdtIdReceiver);
values.put(GDTConstants.FELDKENNUNG_GDT_ID_SENDER, gdtIdSender);
values.put(GDTConstants.FELDKENNUNG_VERWENDETER_ZEICHENSATZ, zeichensatz);
values.put(GDTConstants.FELDKENNUNG_VERSION_GDT, gdtVersion);
}
protected void addLine(String str){
int length = str.length();
length+= threePlaces.format(length).length(); // CRLF+3 chars for the length itself
length+=CRLF.length();
String line = threePlaces.format(length)+str+CRLF;
message.add(line);
charCounterSatzLaenge += line.length();
}
protected void addLine(int feldkennung){
addLine(feldkennung+""+values.get(feldkennung));
}
/**
* If a value for the key feldkennung can be resolved (i.e. != null), add it to the message
* @param feldkennung
*/
protected void ifSetAddLine(int feldkennung){
if(values.get(feldkennung)!=null) addLine(feldkennung);
}
protected void createMessage() {
addLine(GDTConstants.FELDKENNUNG_SATZIDENTIFIKATION);
ifSetAddLine(GDTConstants.FELDKENNUNG_GDT_ID_EMPFAENGER);
ifSetAddLine(GDTConstants.FELDKENNUNG_GDT_ID_SENDER);
ifSetAddLine(GDTConstants.FELDKENNUNG_VERWENDETER_ZEICHENSATZ);
ifSetAddLine(GDTConstants.FELDKENNUNG_VERSION_GDT);
}
/**
* Liefert den Eintrag für eine bestimmte Feldkennung, falls verfügbar.
*
* @param feldkennung see {@link GDTConstants}
* @return returns the value to which the specified key is mapped, or null if this map contains no mapping for the key.
*/
public String getValue(int feldkennung) {
return values.get(feldkennung);
}
public void setValue(int feldkennung, String value) {
values.put(feldkennung, value);
}
public HashMap<Integer, String> getValues() {
return values;
}
public void setValues(HashMap<Integer, String> values) {
this.values = values;
}
/**
* Erstellt eine Textnachricht aus dem gewählten Typ und liefert diese als String Array
*
* @return
*/
public String[] getMessage(){
if(message == null) {
message = new LinkedList<String>();
createMessage();
finalizeMessage();
}
return message.toArray(new String[]{});
}
protected void finalizeMessage(){
charCounterSatzLaenge+=14;
String line = "014"+GDTConstants.FELDKENNUNG_SATZLAENGE+""+fivePlaces.format(charCounterSatzLaenge)+CRLF;
message.add(1, line);
}
}