de.fhdo.terminologie.ws.search.ListCodeSystems.java Source code

Java tutorial

Introduction

Here is the source code for de.fhdo.terminologie.ws.search.ListCodeSystems.java

Source

/* 
 * 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.search;

import de.fhdo.terminologie.Definitions;
import de.fhdo.terminologie.db.HibernateUtil;
import de.fhdo.terminologie.db.hibernate.CodeSystem;
import de.fhdo.terminologie.db.hibernate.CodeSystemVersion;
import de.fhdo.terminologie.helper.HQLParameterHelper;
import de.fhdo.terminologie.ws.authorization.Authorization;
import de.fhdo.terminologie.ws.authorization.types.AuthenticateInfos;
import de.fhdo.terminologie.ws.search.types.ListCodeSystemsRequestType;
import de.fhdo.terminologie.ws.search.types.ListCodeSystemsResponseType;
import de.fhdo.terminologie.ws.types.ReturnType;
import java.util.Iterator;

/**
 *
 * @author Robert Mtzner (robert.muetzner@fh-dortmund.de)
 */
public class ListCodeSystems {
    private static org.apache.log4j.Logger logger = de.fhdo.logging.Logger4j.getInstance().getLogger();

    /**
     * Listet Vokabulare des Terminologieservers auf
     * 
     * @param parameter Die Parameter des Webservices
     * @return Ergebnis des Webservices, alle gefundenen Vokabulare mit angegebenen Filtern
     */
    public ListCodeSystemsResponseType ListCodeSystems(ListCodeSystemsRequestType parameter, String ipAddress) {
        if (logger.isInfoEnabled())
            logger.info("====== ListCodeSystems gestartet ======");

        // Return-Informationen anlegen
        ListCodeSystemsResponseType response = new ListCodeSystemsResponseType();
        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;
        boolean isAdmin = false;
        AuthenticateInfos loginInfoType = null;
        if (parameter != null && parameter.getLoginToken() != null) {
            loginInfoType = Authorization.authenticate(ipAddress, parameter.getLoginToken());
            loggedIn = loginInfoType.isLoggedIn();
            if (loggedIn)
                isAdmin = loginInfoType.isIsAdmin();
        }

        if (logger.isDebugEnabled())
            logger.debug("Benutzer ist eingeloggt: " + loggedIn);

        try {
            java.util.List<CodeSystem> list = null;

            // Hibernate-Block, Session ffnen
            org.hibernate.Session hb_session = HibernateUtil.getSessionFactory().openSession();
            //hb_session.getTransaction().begin();

            try // 2. try-catch-Block zum Abfangen von Hibernate-Fehlern
            {
                // HQL erstellen
                String hql = "select distinct cs from CodeSystem cs";
                hql += " join fetch cs.codeSystemVersions csv";

                if (loggedIn) {
                    hql += " left outer join csv.licencedUsers lu";
                }

                // Parameter dem Helper hinzufgen
                // bitte immer den Helper verwenden oder manuell Parameter per Query.setString() hinzufgen,
                // sonst sind SQL-Injections mglich
                HQLParameterHelper parameterHelper = new HQLParameterHelper();

                if (parameter != null && parameter.getCodeSystem() != null) {
                    // Hier alle Parameter aus der Cross-Reference einfgen
                    // addParameter(String Prefix, String DBField, Object Value)
                    parameterHelper.addParameter("cs.", "name", parameter.getCodeSystem().getName());
                    parameterHelper.addParameter("cs.", "description", parameter.getCodeSystem().getDescription());
                    parameterHelper.addParameter("cs.", "insertTimestamp",
                            parameter.getCodeSystem().getInsertTimestamp()); // z.B. '2011-09-26T15:40:00'

                    if (parameter.getCodeSystem().getCodeSystemVersions() != null
                            && parameter.getCodeSystem().getCodeSystemVersions().size() > 0) {
                        CodeSystemVersion csv = (CodeSystemVersion) parameter.getCodeSystem()
                                .getCodeSystemVersions().toArray()[0];

                        parameterHelper.addParameter("csv.", "description", csv.getDescription());
                        parameterHelper.addParameter("csv.", "expiredDate", csv.getExpirationDate());
                        parameterHelper.addParameter("csv.", "insertTimestamp", csv.getInsertTimestamp());
                        parameterHelper.addParameter("csv.", "description", csv.getLicenceHolder());
                        parameterHelper.addParameter("csv.", "name", csv.getName());
                        parameterHelper.addParameter("csv.", "oid", csv.getOid());
                        parameterHelper.addParameter("csv.", "preferredLanguageCd", csv.getPreferredLanguageCd());
                        parameterHelper.addParameter("csv.", "releaseDate", csv.getReleaseDate());
                        parameterHelper.addParameter("csv.", "source", csv.getSource());
                        parameterHelper.addParameter("csv.", "underLicence", csv.getUnderLicence());
                        parameterHelper.addParameter("csv.", "validityRange", csv.getValidityRange());

                        if (loggedIn) // nur mglich, wenn eingeloggt
                            parameterHelper.addParameter("csv.", "status", csv.getStatus());
                    }
                }

                // hier: immer nur aktive Vokabulare abrufen
                if (isAdmin == false)
                    parameterHelper.addParameter("csv.", "status", Definitions.STATUS_CODES.ACTIVE.getCode());

                if (loggedIn == false) {
                    // ohne Login keine Vokabulare mit Lizenzen abrufen
                    parameterHelper.addParameter("csv.", "underLicence", 0);
                }

                // Parameter hinzufgen (immer mit AND verbunden)
                String where = parameterHelper.getWhere("");
                hql += where;

                if (loggedIn) {
                    // jetzt auf eine gltige Lizenz prfen
                    // muss manuell hinzugefgt werden (fr Helper zu komplex, wg. OR)
                    logger.debug("WHERE: " + where);
                    if (where.length() > 2)
                        hql += " AND ";
                    else
                        hql += " WHERE ";

                    hql += " (csv.underLicence = 0 OR ";
                    hql += " (lu.validFrom < '" + HQLParameterHelper.getSQLDateStr(new java.util.Date()) + "'";
                    hql += " AND lu.validTo > '" + HQLParameterHelper.getSQLDateStr(new java.util.Date()) + "'";
                    hql += " AND lu.id.codeSystemVersionId=csv.versionId";
                    hql += " AND lu.id.userId=" + loginInfoType.getUserId();
                    hql += " ))";
                }

                hql += " ORDER BY cs.name, csv.name";

                // Query erstellen
                org.hibernate.Query q = hb_session.createQuery(hql);

                // Die Parameter knnen erst hier gesetzt werden (bernimmt Helper)
                parameterHelper.applyParameter(q);

                logger.debug("Query: " + q.getQueryString());

                // Datenbank-Aufruf durchfhren
                list = (java.util.List<CodeSystem>) q.list();

                // Hibernate-Block wird in 'finally' geschlossen, erst danach
                // Auswertung der Daten
                // Achtung: hiernach knnen keine Tabellen/Daten mehr nachgeladen werden
            } catch (Exception e) {
                //hb_session.getTransaction().rollback();
                // Fehlermeldung an den Aufrufer weiterleiten
                response.getReturnInfos().setOverallErrorCategory(ReturnType.OverallErrorCategory.ERROR);
                response.getReturnInfos().setStatus(ReturnType.Status.FAILURE);
                response.getReturnInfos()
                        .setMessage("Fehler bei 'ListCodeSystems', Hibernate: " + e.getLocalizedMessage());

                logger.error("Fehler bei 'ListCodeSystems', Hibernate: " + e.getLocalizedMessage());
            } finally {
                hb_session.close();
            }

            // Ergebnis auswerten
            // Spter wird die Klassenstruktur von Jaxb in die XML-Struktur umgewandelt
            // dafr mssen nichtbentigte Beziehungen gelscht werden (auf null setzen)
            if (list != null) {
                Iterator<CodeSystem> iterator = list.iterator();

                while (iterator.hasNext()) {
                    CodeSystem cs = iterator.next();

                    //logger.debug("CS: " + cs.getName());

                    if (cs.getCodeSystemVersions() != null) {
                        Iterator<CodeSystemVersion> iteratorVV = cs.getCodeSystemVersions().iterator();

                        while (iteratorVV.hasNext()) {
                            CodeSystemVersion csv = iteratorVV.next();

                            //logger.debug("CSV: " + csv.getName());
                            //logger.debug("ValidityRange: " + csv.getValidityRange());

                            // Nicht anzuzeigende Beziehungen null setzen
                            csv.setLicenceTypes(null);
                            csv.setLicencedUsers(null);
                            csv.setCodeSystemVersionEntityMemberships(null);
                            csv.setCodeSystem(null);
                        }
                    }

                    cs.setDomainValues(null); // Keine zugehrigen Domnen zurckgeben
                    cs.setMetadataParameters(null);

                    // bereinigte Liste der Antwort beifgen
                    response.setCodeSystem(list);
                    response.getReturnInfos().setCount(list.size());
                }

                // Status an den Aufrufer weitergeben
                response.getReturnInfos().setOverallErrorCategory(ReturnType.OverallErrorCategory.INFO);
                response.getReturnInfos().setStatus(ReturnType.Status.OK);
                response.getReturnInfos().setMessage("CodeSysteme erfolgreich gelesen");
            }
        } 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 'ListCodeSystems': " + e.getLocalizedMessage());

            logger.error("Fehler bei 'ListCodeSystems': " + e.getLocalizedMessage());
        }

        return response;
    }

    private boolean validateParameter(ListCodeSystemsRequestType Request, ListCodeSystemsResponseType Response) {
        // hier muss nichts geprft werden, da man bei der Suche auch
        // alle Angaben leer lassen kann
        return true;
    }
}