All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.bund.bva.isyfact.common.web.exception.web.JsfExceptionHandler Maven / Gradle / Ivy

Go to download

Die IsyFact-Standards bilden das architektonische, technologische und methodische Fundament der IsyFact. Sie umfassen allgemeingültige und wiederverwendbare Konzepte und Komponenten, die für die Entwicklung beliebiger Fachanwendungen relevant sind.

There is a newer version: 6.2.0
Show newest version
/*
 * See the NOTICE file distributed with this work for additional
 * information regarding copyright ownership.
 * The Federal Office of Administration (Bundesverwaltungsamt, BVA)
 * licenses this file to you 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.bund.bva.isyfact.common.web.exception.web;

import java.io.IOException;
import java.util.Iterator;

import javax.faces.FacesException;
import javax.faces.context.ExceptionHandler;
import javax.faces.context.ExceptionHandlerWrapper;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ExceptionQueuedEvent;
import javax.servlet.http.HttpServletRequest;

import de.bund.bva.isyfact.common.web.common.konstanten.EreignisSchluessel;
import de.bund.bva.isyfact.common.web.exception.common.AusnahmeIdMapper;
import de.bund.bva.isyfact.common.web.exception.common.FehlerInformation;
import de.bund.bva.isyfact.common.web.exception.common.FehlertextUtil;
import de.bund.bva.isyfact.logging.IsyLogger;
import de.bund.bva.isyfact.logging.IsyLoggerFactory;

/**
 * Exception Handler für JSF.
 *
 * @author Capgemini
 * @version $Id: JsfExceptionHandler.java 143397 2015-07-30 08:49:32Z sdm_apheino $
 * @deprecated This module is deprecated and will be removed in a future release.
 * It is recommended to use isy-angular-widgets instead.
 */
@Deprecated
public class JsfExceptionHandler extends ExceptionHandlerWrapper {

    /**
     * Logger instance.
     */
    private static final IsyLogger LOG = IsyLoggerFactory.getLogger(JsfExceptionHandler.class);

    /**
     * Umschließender Exception Handler (Parent).
     */
    private ExceptionHandler wrapped;

    /**
     * Der Ausnahme-ID-Mapper.
     */
    private AusnahmeIdMapper ausnahmeIdMapper;

    /**
     * Erstellt eine neue Instanz des ExceptionHandlers.
     *
     * @param wrapped
     *            umschließender ExceptionHandler.
     * @param ausnahmeIdMapper
     *            Der Ausnahme-ID-Mapper.
     */
    public JsfExceptionHandler(ExceptionHandler wrapped, AusnahmeIdMapper ausnahmeIdMapper) {
        this.wrapped = wrapped;
        this.ausnahmeIdMapper = ausnahmeIdMapper;
    }

    @Override
    public ExceptionHandler getWrapped() {
        return this.wrapped;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void handle() {
        Iterator it = getUnhandledExceptionQueuedEvents().iterator();
        if (it.hasNext()) {

            FehlerInformation fehlerInformation = null;

            // Logge alle Fehler
            while (it.hasNext()) {
                ExceptionQueuedEvent event = it.next();
                Throwable t = event.getContext().getException();

                try {
                    // Schreibe LOG Eintrag und ermittle Fehlerinformation.
                    fehlerInformation =
                        FehlertextUtil.schreibeLogEintragUndErmittleFehlerinformation(t,
                            this.ausnahmeIdMapper, LOG);

                } finally {
                    it.remove();
                }
            }

            // Wenn mindestens ein Fehler existiert, redirecte auf Fehlerseite
            // Im Normalfall tritt immer nur ein Fehler auf.
            redirectZuFehlerseite(fehlerInformation);
        }

        getWrapped().handle();
    }

    /**
     * Redirected zur Fehlerseite.
     *
     * @param fehlerInformation
     *            Die Fehlerinformation.
     */
    private void redirectZuFehlerseite(FehlerInformation fehlerInformation) {

        try {
            direkterRedirectZuFehlerseite(fehlerInformation);
        } catch (IllegalStateException e) {
            // Info ergänzen
            // CHECKSTYLE:OFF
            throw new FacesException(
                "Fehler beim Redirect zu Error-Seite. Hinweis: Bei Fehlern während der Renderphase kann nur auf die Fehlerseite geleitet werden sofern die Antwort noch nicht übertragen wurde. Bei Bedarf kann die Buffer-Size über den Kontextparameter javax.faces.FACELETS_BUFFER_SIZE angepasst werden.",
                e);
            // CHECKSTYLE:ON
        } catch (Throwable t) {
            throw new FacesException("Fehler beim Redirect zu Error-Seite.", t);
        }

    }

    /**
     * Führt einen direkten Redirect zur Fehlerseite durch.
     *
     * @param fehlerInformation
     *            Die Fehlerinformation.
     */
    private void direkterRedirectZuFehlerseite(FehlerInformation fehlerInformation) {

        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        HttpServletRequest origRequest = (HttpServletRequest) externalContext.getRequest();

        String contextPath = origRequest.getContextPath();
        String servletPath = origRequest.getServletPath();

        String errorViewUrl =
            contextPath + servletPath + "/errorFlow?fehlerId=" + fehlerInformation.getFehlerId()
                + "&uniqueId=" + fehlerInformation.getUuid();

        // Redirect auf Fehlerseite
        try {
            externalContext.redirect(errorViewUrl);
        } catch (IOException e) {
            LOG.error(EreignisSchluessel.E_WEITERLEITUNG_FEHLERSEITE,
                "Fehler beim Weiterleiten auf die anwendungsinterne Fehlerseite.", e);
        }
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy