Java tutorial
/* * CTS2 based Terminology Server and Terminology Browser * Copyright (C) 2014 FH Dortmund: Peter Haas, Robert Muetzner * * 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. */ package de.fhdo.terminologie.ws.conceptAssociation; import de.fhdo.terminologie.Definitions; import de.fhdo.terminologie.db.HibernateUtil; import de.fhdo.terminologie.db.hibernate.AssociationType; import de.fhdo.terminologie.db.hibernate.CodeSystemConcept; import de.fhdo.terminologie.db.hibernate.CodeSystemEntity; import de.fhdo.terminologie.db.hibernate.CodeSystemEntityVersion; import de.fhdo.terminologie.db.hibernate.CodeSystemEntityVersionAssociation; import de.fhdo.terminologie.helper.HQLParameterHelper; import de.fhdo.terminologie.helper.LoginHelper; import de.fhdo.terminologie.ws.authorization.Authorization; import de.fhdo.terminologie.ws.authorization.types.AuthenticateInfos; import de.fhdo.terminologie.ws.conceptAssociation.types.ListConceptAssociationsResponseType; import de.fhdo.terminologie.ws.conceptAssociation.types.ListConceptAssociationsRequestType; import de.fhdo.terminologie.ws.types.LoginInfoType; import de.fhdo.terminologie.ws.types.ReturnType; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import org.hibernate.Query; /** * * @author Nico Hnsch */ public class ListConceptAssociations { private static org.apache.log4j.Logger logger = de.fhdo.logging.Logger4j.getInstance().getLogger(); public ListConceptAssociationsResponseType ListConceptAssociations(ListConceptAssociationsRequestType parameter, String ipAddress) { return ListConceptAssociations(parameter, null, ipAddress); } /** * Verbindungen zwischen Begriffen auflisten * * @param parameter * @return Liste von Entity-Assoziationen */ public ListConceptAssociationsResponseType ListConceptAssociations(ListConceptAssociationsRequestType parameter, org.hibernate.Session session, String ipAddress) { if (logger.isInfoEnabled()) logger.info("====== ListConceptAssociations gestartet ======"); boolean createHibernateSession = (session == null); logger.debug("createHibernateSession: " + createHibernateSession); // Return-Informationen anlegen ListConceptAssociationsResponseType response = new ListConceptAssociationsResponseType(); response.setReturnInfos(new ReturnType()); // Parameter prfen if (validateParameter(parameter, response) == false) { return response; // Fehler bei den Parametern } // Login-Informationen auswerten (gilt fr jeden Webservice) boolean loggedIn = false; AuthenticateInfos loginInfoType = null; if (parameter != null && parameter.getLoginToken() != null) { loginInfoType = Authorization.authenticate(ipAddress, parameter.getLoginToken()); loggedIn = loginInfoType != null; } if (logger.isDebugEnabled()) { logger.debug("Benutzer ist eingeloggt: " + loggedIn); } try { java.util.List<CodeSystemConcept> list = null; // Hibernate-Block, Session ffnen org.hibernate.Session hb_session = session; if (createHibernateSession || hb_session == null) { hb_session = HibernateUtil.getSessionFactory().openSession(); //hb_session.getTransaction().begin(); } try //Try-Catch-Block um Hibernate-Fehler abzufangen { CodeSystemEntityVersion csev_parameter = (CodeSystemEntityVersion) parameter.getCodeSystemEntity() .getCodeSystemEntityVersions().toArray()[0]; long cse_versionId = csev_parameter.getVersionId(); // TODO leftID korrekt implementieren // directionBoth implementieren (reverse funktioniert) if (parameter.getDirectionBoth() == null) { parameter.setDirectionBoth(false); } if (parameter.getReverse() == null || parameter.getDirectionBoth()) { parameter.setReverse(false); } //Hibernate Query Language erstellen String hql = "select distinct term from CodeSystemConcept term"; //String hql = "select term from CodeSystemConcept term"; hql += " join fetch term.codeSystemEntityVersion csev"; hql += " join fetch csev.codeSystemEntity cse"; // je nach Richtung wird die 1 oder 2 angehangen hql += " join fetch csev.codeSystemEntityVersionAssociationsForCodeSystemEntityVersionId"; if (parameter.getReverse()) { hql += "1"; } else { hql += "2"; } hql += " cseva"; hql += " join fetch cseva.associationType at"; hql += " join cseva.codeSystemEntityVersionByCodeSystemEntityVersionId"; if (parameter.getReverse()) { hql += "2"; } else { hql += "1"; } hql += " csev_source"; HQLParameterHelper parameterHelper = new HQLParameterHelper(); parameterHelper.addParameter("csev_source.", "versionId", cse_versionId); if (parameter.getCodeSystemEntityVersionAssociation() != null) { parameterHelper.addParameter("cseva.", "associationKind", parameter.getCodeSystemEntityVersionAssociation().getAssociationKind()); } if (loggedIn == false) { parameterHelper.addParameter("csev.", "statusVisibility", Definitions.STATUS_CODES.ACTIVE.getCode()); } // Parameter hinzufgen (immer mit AND verbunden) hql += parameterHelper.getWhere(""); if (logger.isDebugEnabled()) logger.debug("HQL: " + hql); // Query erstellen org.hibernate.Query q = hb_session.createQuery(hql); // Die Parameter knnen erst hier gesetzt werden (bernimmt Helper) parameterHelper.applyParameter(q); // Datenbank-Aufruf durchfhren list = (java.util.List<CodeSystemConcept>) q.list(); if (logger.isDebugEnabled()) logger.debug("size: " + list.size()); List<CodeSystemEntityVersionAssociation> returnList = new LinkedList<CodeSystemEntityVersionAssociation>(); //if (createHibernateSession) // tx.commit(); // Ergebnisliste befllen //Iterator<CodeSystemConcept> it = list.iterator(); //while (it.hasNext()) for (CodeSystemConcept term : list) { // CodeSystemEntityVersion lesen CodeSystemEntityVersion csev = term.getCodeSystemEntityVersion(); logger.debug("term found: " + term.getCode()); if (csev != null) { csev.setAssociationTypes(null); //csev.setCodeSystemEntity(null); csev.setConceptValueSetMemberships(null); csev.setCodeSystemMetadataValues(null); csev.setValueSetMetadataValues(null); if (parameter != null && parameter.getReverse()) { if (parameter != null && parameter.getLookForward() != null && parameter.getLookForward()) { // Gibt immer die nchste Verbindung mit zurck Iterator<CodeSystemEntityVersionAssociation> itTemp = csev .getCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId2() .iterator(); while (itTemp.hasNext()) { CodeSystemEntityVersionAssociation csevaTemp = itTemp.next(); if (csevaTemp.getAssociationKind() == Definitions.ASSOCIATION_KIND.TAXONOMY .getCode()) { csevaTemp.setAssociationType(null); csevaTemp.setCodeSystemEntityVersionByCodeSystemEntityVersionId1(null); csevaTemp.setCodeSystemEntityVersionByCodeSystemEntityVersionId2(null); } else { itTemp.remove(); } } if (csev.getCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId2() != null && csev.getCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId2() .size() == 0) csev.setCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId2(null); } else { csev.setCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId2(null); } } else { if (parameter != null && parameter.getLookForward() != null && parameter.getLookForward()) { logger.debug("lookForward"); // Gibt immer die nchste Verbindung mit zurck Iterator<CodeSystemEntityVersionAssociation> itTemp = csev .getCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId1() .iterator(); while (itTemp.hasNext()) { logger.debug("Verbindung prfen, iterator.next()"); CodeSystemEntityVersionAssociation csevaTemp = itTemp.next(); if (csevaTemp.getAssociationKind() == Definitions.ASSOCIATION_KIND.TAXONOMY .getCode()) { csevaTemp.setAssociationType(null); csevaTemp.setCodeSystemEntityVersionByCodeSystemEntityVersionId1(null); csevaTemp.setCodeSystemEntityVersionByCodeSystemEntityVersionId2(null); logger.debug("Verbindung taxonomisch, drin lassen"); } else { logger.debug("Verbindung lschen, iterator.remove()"); itTemp.remove(); } } logger.debug("Anzahl: " + csev.getCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId1() .size()); if (csev.getCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId1() != null && csev.getCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId1() .size() == 0) csev.setCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId1(null); } else { csev.setCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId1(null); } //csev.setCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId1(null); } if (csev.getCodeSystemEntity() != null) { csev.getCodeSystemEntity().setCodeSystemVersionEntityMemberships(null); csev.getCodeSystemEntity().setCodeSystemEntityVersions(null); } // der Version wieder das Concept hinzufgen und die Verbindungen null setzen csev.setCodeSystemConcepts(new HashSet<CodeSystemConcept>()); term.setCodeSystemEntityVersion(null); term.setCodeSystemConceptTranslations(null); csev.getCodeSystemConcepts().add(term); // Assoziation lesen und Verbindungen auf null setzen if (parameter.getReverse()) { if (csev.getCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId1() != null && csev.getCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId1() .size() > 0) { CodeSystemEntityVersionAssociation association = (CodeSystemEntityVersionAssociation) csev .getCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId1() .toArray()[0]; //association.setCodeSystemEntityVersionByCodeSystemEntityVersionId2(null); //association.getCodeSystemEntityVersionByCodeSystemEntityVersionId1().setCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId1(null); if (association.getCodeSystemEntityVersionByCodeSystemEntityVersionId1() != null) { association.setCodeSystemEntityVersionByCodeSystemEntityVersionId2(null); association.getCodeSystemEntityVersionByCodeSystemEntityVersionId1() .setCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId1( null); } else if (association .getCodeSystemEntityVersionByCodeSystemEntityVersionId2() != null) { association.setCodeSystemEntityVersionByCodeSystemEntityVersionId1(null); association.getCodeSystemEntityVersionByCodeSystemEntityVersionId2() .setCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId1( null); } else { association.setCodeSystemEntityVersionByCodeSystemEntityVersionId1(null); association.setCodeSystemEntityVersionByCodeSystemEntityVersionId2(null); } // Verbindungen von AssociationType auf null setzen AssociationType at = association.getAssociationType(); at.setCodeSystemEntityVersion(null); at.setCodeSystemEntityVersionAssociations(null); returnList.add(association); } } else { //logger.debug("ass size: " + csev.getCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId2().size()); if (csev.getCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId2() != null && csev.getCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId2() .size() > 0) { CodeSystemEntityVersionAssociation association = (CodeSystemEntityVersionAssociation) csev .getCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId2() .toArray()[0]; association.setCodeSystemEntityVersionByCodeSystemEntityVersionId1(null); association.getCodeSystemEntityVersionByCodeSystemEntityVersionId2() .setCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId2(null); // Verbindungen von AssociationType auf null setzen AssociationType at = association.getAssociationType(); at.setCodeSystemEntityVersion(null); at.setCodeSystemEntityVersionAssociations(null); returnList.add(association); } } } } // DirectionBoth if (parameter.getDirectionBoth()) { // Hibernate Query Language erstellen hql = "select distinct term from CodeSystemConcept term"; //hql = "select term from CodeSystemConcept term"; hql += " join fetch term.codeSystemEntityVersion csev"; hql += " join fetch csev.codeSystemEntity cse"; hql += " join fetch csev.codeSystemEntityVersionAssociationsForCodeSystemEntityVersionId1 cseva"; hql += " join fetch cseva.associationType at"; hql += " join cseva.codeSystemEntityVersionByCodeSystemEntityVersionId2 csev_source"; parameterHelper = new HQLParameterHelper(); parameterHelper.addParameter("csev_source.", "versionId", cse_versionId); if (parameter.getCodeSystemEntityVersionAssociation() != null) { parameterHelper.addParameter("cseva.", "associationKind", parameter.getCodeSystemEntityVersionAssociation().getAssociationKind()); } if (loggedIn == false) { parameterHelper.addParameter("csev.", "statusVisibility", Definitions.STATUS_CODES.ACTIVE.getCode()); } // Parameter hinzufgen (immer mit AND verbunden) hql += parameterHelper.getWhere(""); if (logger.isDebugEnabled()) { logger.debug("HQL#2 (DirectionBoth): " + hql); logger.debug("CSEV-VersionId: " + cse_versionId); } // Query erstellen Query q2 = hb_session.createQuery(hql); // Die Parameter knnen erst hier gesetzt werden (bernimmt Helper) parameterHelper.applyParameter(q2); logger.debug("SQL: " + q2.getQueryString()); // Datenbank-Aufruf durchfhren java.util.List<CodeSystemConcept> list2 = (java.util.List<CodeSystemConcept>) q2.list(); // Ergebnisliste befllen for (CodeSystemConcept term : list2) { // CodeSystemConcept holen // CodeSystemEntityVersion lesen //logger.error("Term: " + term.getCodeSystemEntityVersionId() + ", " + term.getCode()); CodeSystemEntityVersion csev = term.getCodeSystemEntityVersion(); if (csev != null) { csev.setAssociationTypes(null); csev.setConceptValueSetMemberships(null); csev.setCodeSystemMetadataValues(null); csev.setValueSetMetadataValues(null); csev.setCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId2(null); if (csev.getCodeSystemEntity() != null) { csev.getCodeSystemEntity().setCodeSystemVersionEntityMemberships(null); csev.getCodeSystemEntity().setCodeSystemEntityVersions(null); } // der Version wieder das Concept hinzufgen und die Verbindungen null setzen csev.setCodeSystemConcepts(new HashSet<CodeSystemConcept>()); term.setCodeSystemEntityVersion(null); term.setCodeSystemConceptTranslations(null); csev.getCodeSystemConcepts().add(term); // Assoziation lesen und Verbindungen auf null setzen if (csev.getCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId1() != null && csev.getCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId1() .size() > 0) { //CodeSystemEntityVersionAssociation association = //(CodeSystemEntityVersionAssociation) csev.getCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId1().toArray()[0]; CodeSystemEntityVersionAssociation association = csev .getCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId1() .iterator().next(); if (association.getCodeSystemEntityVersionByCodeSystemEntityVersionId1() != null) { association.setCodeSystemEntityVersionByCodeSystemEntityVersionId2(null); association.getCodeSystemEntityVersionByCodeSystemEntityVersionId1() .setCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId1( null); } else if (association .getCodeSystemEntityVersionByCodeSystemEntityVersionId2() != null) { association.setCodeSystemEntityVersionByCodeSystemEntityVersionId1(null); association.getCodeSystemEntityVersionByCodeSystemEntityVersionId2() .setCodeSystemEntityVersionAssociationsForCodeSystemEntityVersionId1( null); } else { association.setCodeSystemEntityVersionByCodeSystemEntityVersionId1(null); association.setCodeSystemEntityVersionByCodeSystemEntityVersionId2(null); } // Verbindungen von AssociationType auf null setzen AssociationType at = association.getAssociationType(); at.setCodeSystemEntityVersion(null); at.setCodeSystemEntityVersionAssociations(null); returnList.add(association); } } else { logger.warn("ListConceptAssociations.java: CodeSystemEntityVersion ist null"); } } } // Direction Both Ende response.setCodeSystemEntityVersionAssociation(returnList); if (returnList.isEmpty()) { response.getReturnInfos().setMessage("Keine passenden Assoziationen vorhanden!"); } else { response.getReturnInfos() .setMessage("Assoziationen erfolgreich gelesen, Anzahl: " + returnList.size()); response.getReturnInfos().setCount(returnList.size()); } response.getReturnInfos().setOverallErrorCategory(ReturnType.OverallErrorCategory.INFO); response.getReturnInfos().setStatus(ReturnType.Status.OK); //hb_session.getTransaction().commit(); } catch (Exception e) { //hb_session.getTransaction().rollback(); // Fehlermeldung (Hibernate) an den Aufrufer weiterleiten response.getReturnInfos().setOverallErrorCategory(ReturnType.OverallErrorCategory.ERROR); response.getReturnInfos().setStatus(ReturnType.Status.FAILURE); response.getReturnInfos() .setMessage("Fehler bei 'ListConceptAssociation', Hibernate: " + e.getLocalizedMessage()); logger.error("Fehler bei 'ListConceptAssociation', Hibernate: " + e.getLocalizedMessage()); e.printStackTrace(); } finally { // Transaktion abschlieen if (createHibernateSession) { logger.debug("Schliee Hibernate-Session (ListConceptAssociations.java)"); hb_session.close(); } } } catch (Exception e) { // Fehlermeldung an den Aufrufer weiterleiten response.getReturnInfos().setOverallErrorCategory(ReturnType.OverallErrorCategory.ERROR); response.getReturnInfos().setStatus(ReturnType.Status.FAILURE); response.getReturnInfos().setMessage("Fehler bei 'ListConceptAssociation': " + e.getLocalizedMessage()); logger.error("Fehler bei 'ListConceptAssociation': " + e.getLocalizedMessage()); } return response; } private boolean validateParameter(ListConceptAssociationsRequestType Request, ListConceptAssociationsResponseType Response) { boolean parameterValidiert = true; // Prfen ob eine CodeSystemEntity mitgegeben wurde (MUSS) if (Request.getCodeSystemEntity() == null) { Response.getReturnInfos().setMessage("Es muss eine CodeSystemEntity bergeben werden."); parameterValidiert = false; } else { CodeSystemEntity codeSystemEntity = Request.getCodeSystemEntity(); //Prfen ob genau eine codeSystemEntityVersions mitgegeben wurde (MUSS) if (codeSystemEntity.getCodeSystemEntityVersions() == null || codeSystemEntity.getCodeSystemEntityVersions().size() != 1) { Response.getReturnInfos().setMessage("Es muss genau eine CodeSystemEntityVersions angegeben sein."); parameterValidiert = false; } else { //Prfe ob eine versionID angegeben wurde (MUSS) CodeSystemEntityVersion vcsev = (CodeSystemEntityVersion) codeSystemEntity .getCodeSystemEntityVersions().toArray()[0]; if (vcsev.getVersionId() == null || vcsev.getVersionId() <= 0) { Response.getReturnInfos() .setMessage("Es muss eine ID fr die CodeSystemEntity-Version angegeben sein!"); parameterValidiert = false; } } } //Prfen ob CodeSystemEntityVersionAssociation angegeben wurde (KANN) if (Request.getCodeSystemEntityVersionAssociation() != null) { //Prfen ob AssociationKind angegeben wurde (MUSS) if (Request.getCodeSystemEntityVersionAssociation().getAssociationKind() == null || Definitions.isAssociationKindValid( Request.getCodeSystemEntityVersionAssociation().getAssociationKind()) == false) { Response.getReturnInfos().setMessage( "AssociationKind darf nicht leer sein, wenn CodeSystemEntityVersionAssociation angegeben ist und muss einen der folgenden Werte haben: " + Definitions.readAssociationKinds()); parameterValidiert = false; } } if (parameterValidiert == false) { Response.getReturnInfos().setOverallErrorCategory(ReturnType.OverallErrorCategory.WARN); Response.getReturnInfos().setStatus(ReturnType.Status.FAILURE); } return parameterValidiert; } }