diff --git a/src/main/java/de/uniluebeck/mi/projmi6/Main.java b/src/main/java/de/uniluebeck/mi/projmi6/Main.java index 85c6d54..a61f293 100644 --- a/src/main/java/de/uniluebeck/mi/projmi6/Main.java +++ b/src/main/java/de/uniluebeck/mi/projmi6/Main.java @@ -7,7 +7,6 @@ import de.uniluebeck.mi.projmi6.db.DBHandler; import de.uniluebeck.mi.projmi6.hapi.HL7Receiver; import de.uniluebeck.mi.projmi6.hapi.HL7Server; import javafx.application.Application; -import javafx.application.Platform; import javafx.beans.property.ReadOnlyStringProperty; import javafx.collections.FXCollections; import javafx.concurrent.Task; @@ -48,9 +47,10 @@ public class Main extends Application { public static int OPS_PORT = 1112; + private HL7Server server; + /** - * Because building the GUI from FXML is a bit costly - * and loading the master data takes some time, + * Cuz building the GUI from FXML is a bit costly, * it's done from its own thread. */ private Task loadMainWindowTask = new Task() { @@ -111,21 +111,36 @@ public class Main extends Application { * @param args Commandline parameters */ public static void main(String[] args) { + if (isRunning()) { + LoggerFactory.getLogger(Main.class).error("App already running or Port 1111 in use."); + System.exit(2); + } launch(args); } - /** - * Server instance that is currently running + * @return true wenn der Port 1111 bereits belegt ist, false sonst. */ - private HL7Server server; + private static boolean isRunning() { + ServerSocket socket = null; + try { + socket = new ServerSocket(1111); + socket.setReuseAddress(true); + return false; + } catch (IOException ignored) { + } finally { + if (socket != null) { + try { + socket.close(); + } catch (IOException ignored) { + } + } + } + return true; + } - /** - * In the application lifecycle, this method will be called when closing. - */ @Override public void stop() throws Exception { - //Stop the server if (server != null) { server.stop(); server.shutdown(); @@ -135,6 +150,9 @@ public class Main extends Application { @Override public void start(Stage primaryStage) { + // TODO: Jojo kann das weg? + // System.out.println(getClass().getClassLoader().getResource("").toExternalForm()); + primaryStage.getIcons().add(icon); Stage loadingMessage = createLoadWindow(loadMainWindowTask.messageProperty()); diff --git a/src/main/java/de/uniluebeck/mi/projmi6/hapi/HL7Sender.java b/src/main/java/de/uniluebeck/mi/projmi6/hapi/HL7Sender.java index c7f06be..704d2ce 100644 --- a/src/main/java/de/uniluebeck/mi/projmi6/hapi/HL7Sender.java +++ b/src/main/java/de/uniluebeck/mi/projmi6/hapi/HL7Sender.java @@ -25,76 +25,78 @@ import java.util.List; /** * Manages all HL7 sending tasks. This includes: creating a message, sending the message, * Created by taschi on 22.11.15. - * */ public class HL7Sender { /** * generates an ADT_A05 message for data exchange with OPS group * - * * @param fall to create the message from this content. patient and diagnosis are linked to fall * @throws HL7Exception, IOException, SQLException */ public static void createMessageADT_A01(Fall fall) throws HL7Exception, IOException, SQLException { Patient patient = fall.getPatient(); - ADT_A01 adt = new ADT_A01(); + ADT_A01 adt_a01 = new ADT_A01(); - //default MSH Values (Sets Segments: 1,2,7,9,10,11 - adt.initQuickstart("ADT", "A01", "P"); + //default MSH Values (Sets Segments: 1,2,7,9,10,11,12 + adt_a01.initQuickstart("ADT", "A01", "P"); //MSH Segment: - MSH mshSegment = adt.getMSH(); - mshSegment.getMsh3_SendingApplication().getNamespaceID().parse("KISGruppe6"); - mshSegment.getMsh5_ReceivingApplication().getNamespaceID().parse("OPS Gruppe von Maurice und Torben"); - mshSegment.getMsh12_VersionID().getVersionID().parse("2.5.1"); - mshSegment.getMsh15_AcceptAcknowledgmentType().parse("AL"); + MSH msh = adt_a01.getMSH(); + msh.getMsh3_SendingApplication().getNamespaceID().parse("KISGruppe6"); + msh.getMsh5_ReceivingApplication().getNamespaceID().parse("OPSGruppe3"); + msh.getMsh15_AcceptAcknowledgmentType().parse("AL"); //EVN Segment: - EVN evnSegment = adt.getEVN(); - evnSegment.getEvn1_EventTypeCode().parse("A01"); - evnSegment.getEvn2_RecordedDateTime().getTime().setValue(mshSegment.getDateTimeOfMessage().encode()); - evnSegment.getEvn4_EventReasonCode().parse("01"); + EVN evn = adt_a01.getEVN(); + evn.getEvn1_EventTypeCode().parse("A01"); + evn.getEvn2_RecordedDateTime().getTime().setValue(msh.getDateTimeOfMessage().encode()); + evn.getEvn4_EventReasonCode().parse("01"); //PID - PID pidSegment = adt.getPID(); - pidSegment.getPid2_PatientID().getIDNumber().parse(String.valueOf(patient.getPatID())); - pidSegment.getPid3_PatientIdentifierList(0).getIDNumber().parse(Integer.toString(patient.getPatID())); - pidSegment.getPid5_PatientName(0).getFamilyName().getSurname().parse(patient.getNachname()); - pidSegment.getPid5_PatientName(0).getGivenName().parse(patient.getVorname()); - pidSegment.getPid7_DateTimeOfBirth().getTime().setValue(Date.from(patient.getGeburtsdatum().atStartOfDay().atZone(ZoneId.systemDefault()).toInstant())); - pidSegment.getPid8_AdministrativeSex().parse(String.valueOf(patient.getGeschlecht().id())); - pidSegment.getPid11_PatientAddress(0).getStreetAddress().getStreetName().parse(patient.getStrasse()); - pidSegment.getPid11_PatientAddress(0).getStreetAddress().getDwellingNumber().parse(patient.getHausnummer()); - pidSegment.getPid11_PatientAddress(0).getCity().parse(patient.getOrt()); - pidSegment.getPid13_PhoneNumberHome(0).getTelephoneNumber().parse(patient.getTelefon()); - pidSegment.getPid16_MaritalStatus().getAlternateIdentifier().parse(patient.getFamilienstand().toString()); + PID pid = adt_a01.getPID(); + pid.getPid1_SetIDPID().parse("1"); + pid.getPid2_PatientID().getIDNumber().parse(String.valueOf(patient.getPatID())); + pid.getPid3_PatientIdentifierList(0).getIDNumber().parse(Integer.toString(patient.getPatID())); + pid.getPid5_PatientName(0).getFamilyName().getSurname().parse(patient.getNachname()); + pid.getPid5_PatientName(0).getGivenName().parse(patient.getVorname()); + pid.getPid7_DateTimeOfBirth().getTime().setValue(Date.from(patient.getGeburtsdatum().atStartOfDay().atZone(ZoneId.systemDefault()).toInstant())); + pid.getPid8_AdministrativeSex().parse(String.valueOf(patient.getGeschlecht().id())); + pid.getPid11_PatientAddress(0).getStreetAddress().getStreetName().parse(patient.getStrasse()); + pid.getPid11_PatientAddress(0).getStreetAddress().getDwellingNumber().parse(patient.getHausnummer()); + pid.getPid11_PatientAddress(0).getCity().parse(patient.getOrt()); + pid.getPid11_PatientAddress(0).getZipOrPostalCode().parse(patient.getPlz()); + pid.getPid13_PhoneNumberHome(0).getTelephoneNumber().parse(patient.getTelefon()); + pid.getPid16_MaritalStatus().getAlternateIdentifier().parse(patient.getFamilienstand().toString()); //Diagnosen (DG1 Segmente des PV1 Segments List diagnosen = DBHandler.getDiagnosenByFall(fall); - PV1 pv1Segment = adt.getPV1(); - pv1Segment.getPv12_PatientClass().parse("U"); + PV1 pv1 = adt_a01.getPV1(); + pv1.getPv11_SetIDPV1().parse("1"); + pv1.getPv12_PatientClass().parse("U"); + pv1.getPv119_VisitNumber().getIDNumber().parse(String.valueOf(fall.getFallID())); - int i = 1; - for (Diagnose diagnose : diagnosen) { + for (int i = 0; i < diagnosen.size(); i++) { + Diagnose diagnose = diagnosen.get(i); Mitarbeiter arzt = diagnose.getArzt(); - DG1 dg1 = adt.getDG1(i - 1); - dg1.getDg11_SetIDDG1().setValue(String.valueOf(i)); + DG1 dg1 = adt_a01.getDG1(i); + dg1.getDg11_SetIDDG1().setValue(String.valueOf(i + 1)); dg1.getDg13_DiagnosisCodeDG1().getIdentifier().parse(diagnose.getIcd10code().getCode()); + dg1.getDg13_DiagnosisCodeDG1().getNameOfCodingSystem().parse("I10"); + dg1.getDg14_DiagnosisDescription().parse(diagnose.getFreiText()); + dg1.getDg16_DiagnosisType().parse(diagnose.getDiagArt().id()); XCN xcn = dg1.getDg116_DiagnosingClinician(0); xcn.getIDNumber().setValue(arzt.getEinweisenderArzt()); xcn.getGivenName().setValue(arzt.getVorname()); xcn.getFamilyName().getSurname().setValue(arzt.getNachname()); xcn.getPrefixEgDR().setValue(arzt.getTitel()); - dg1.getDg14_DiagnosisDescription().parse(diagnose.getFreiText()); - dg1.getDg16_DiagnosisType().parse(diagnose.getDiagArt().id()); - i++; } - sendMessage(adt); + sendMessage(adt_a01); } /** * Sending message handler. Calls function to send current message + * * @param message to send * @throws HL7Exception */ @@ -108,6 +110,7 @@ public class HL7Sender { * sends an ADT_A01 message and waits ca 5 seconds for an ACK. If no ACK occurs it sends the message ONLY 5 times again * if after 5 times no ack occurs log message * write log historie in database + * * @param message you want to send * @throws HL7Exception */