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

de.bund.bva.isyfact.common.web.layout.QuicklinksController 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.layout;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

import org.springframework.beans.factory.annotation.Required;
import org.springframework.webflow.context.ExternalContextHolder;
import org.springframework.webflow.core.collection.SharedAttributeMap;
import org.springframework.webflow.definition.FlowDefinition;
import org.springframework.webflow.execution.RequestContextHolder;

import com.google.common.base.Splitter;
import com.google.common.collect.Lists;

import de.bund.bva.isyfact.common.web.global.AbstractGuiController;
import de.bund.bva.pliscommon.konfiguration.common.Konfiguration;

/**
 * Controller für die Quicklinks.
 *
 */
public class QuicklinksController extends AbstractGuiController {

    /**
     * Der Session-Key zum Speichern der Quicklinks.
     */
    private static final String SESSION_KEY_QUICKLINKS = "quicklinks";

    /**
     * Die Konfiguration.
     */
    private Konfiguration konfiguration;

    /**
     * {@inheritDoc}
     */
    @Override
    public void initialisiereModel(ApplikationseiteModel model) {
        // Der aktuelle Flow. Wenn ein Subflow aufgerufen wurde, dann wird hier der ursprüngliche Flow
        // ausgelesen.
        FlowDefinition flowDefinition =
            RequestContextHolder.getRequestContext().getFlowExecutionContext().getDefinition();

        String flowName = flowDefinition.getId();
        Splitter splitter = Splitter.on(",").trimResults();
        String gruppenIdsKonfig = this.konfiguration.getAsString("gui.quicklinks.gruppenIds", null);
        if (gruppenIdsKonfig != null) {
            List gruppenIds = Lists.newArrayList(splitter.split(gruppenIdsKonfig));
            if (!gruppenIds.isEmpty()) {
                // Gruppen existieren => Sessiondaten laden und synchronisieren
                SharedAttributeMap sessionMap =
                    ExternalContextHolder.getExternalContext().getSessionMap();
                synchronized (sessionMap.getMutex()) {
                    QuicklinksModel quicklinksModel =
                        (QuicklinksModel) sessionMap.get(SESSION_KEY_QUICKLINKS);
                    if (quicklinksModel == null) {
                        quicklinksModel = new QuicklinksModel();
                        sessionMap.put(SESSION_KEY_QUICKLINKS, quicklinksModel);
                    }
                    for (String gruppeId : gruppenIds) {
                        QuicklinksGruppeModel quicklinksGruppeModel =
                            quicklinksModel.getQuicklinksGruppen().get(gruppeId);
                        if (quicklinksGruppeModel == null) {
                            quicklinksGruppeModel = new QuicklinksGruppeModel();
                            quicklinksGruppeModel.setGruppeId(gruppeId);
                            quicklinksModel.getQuicklinksGruppen().put(gruppeId, quicklinksGruppeModel);
                        }
                        // Attribut contextflow laden
                        String contextFlowKonfig = this.konfiguration
                            .getAsString("gui.quicklinks." + gruppeId + ".contextflow", null);
                        if (contextFlowKonfig != null) {
                            List contextFlows = Lists.newArrayList(splitter.split(contextFlowKonfig));
                            quicklinksGruppeModel.setSichtbar(contextFlows.contains(flowName));
                        } else {
                            quicklinksGruppeModel.setSichtbar(true);
                        }

                        // Attribut text laden
                        String text =
                            this.konfiguration.getAsString("gui.quicklinks." + gruppeId + ".text", null);

                        if (text == null) {
                            // Fallback Gruppen ID verwenden
                            quicklinksGruppeModel.setAnzuzeigenderGruppenname(gruppeId);
                        } else {
                            quicklinksGruppeModel.setAnzuzeigenderGruppenname(text);
                        }
                    }
                    // Variable immer in Session schreiben, damit übergeordnete Sessionmanager auf jeden Fall
                    // eine
                    // Aktualisierung sehen.
                    sessionMap.put(SESSION_KEY_QUICKLINKS, quicklinksModel);
                }
            }
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected Class getMaskenModelKlasseZuController() {
        return ApplikationseiteModel.class;
    }

    /**
     * Fügt einen Quicklink hinzu.
     *
     * @param quicklinkselementModel
     *            der Quicklink
     * @param gruppeId
     *            Die Gruppen ID der Quicklinks (Oder der Headername, falls ohne Konfiguration gearbeitet
     *            wird.)
     * @param maxAnzahl
     *            Die maximale Anzahl der anzuzeigenden Elemente.
     * @return QuicklinkselementModel
     */
    public QuicklinksElementModel fuegeQuicklinkHinzu(QuicklinksElementModel quicklinkselementModel,
        String gruppeId, int maxAnzahl) {

        // Variable aus der Session holen
        SharedAttributeMap sessionMap = ExternalContextHolder.getExternalContext().getSessionMap();

        synchronized (sessionMap.getMutex()) {
            QuicklinksModel quicklinksModel = (QuicklinksModel) sessionMap.get(SESSION_KEY_QUICKLINKS);

            if (quicklinksModel == null) {
                quicklinksModel = new QuicklinksModel();
                sessionMap.put(SESSION_KEY_QUICKLINKS, quicklinksModel);
            }

            // Wenn der Quicklink breits vorhanden ist, dann wird er aktualisiert und nach oben gesetzt
            entferneQuicklink(quicklinkselementModel.getId());

            // Quicklink immer am Anfang einfügen
            QuicklinksElementModel quicklinkselementModelGeloescht = addQuicklinkselementModelAtTheBeginning(
                quicklinksModel, quicklinkselementModel, gruppeId, maxAnzahl);

            // Variable immer wieder in Session schreiben, damit übergeordnete Sessionmanager auf jeden Fall
            // eine
            // Aktualisierung sehen.
            sessionMap.put(SESSION_KEY_QUICKLINKS, quicklinksModel);

            return quicklinkselementModelGeloescht;
        }

    }

    /**
     * Entfernt einen Quicklink, der eine bestimmte ID besitzt. Diese Funktion iteriert über ALLE möglichen
     * Quicklinksgruppen.
     *
     * @param id
     *            die ID
     */
    public void entferneQuicklink(String id) {

        // Variable aus der Session holen
        SharedAttributeMap sessionMap = ExternalContextHolder.getExternalContext().getSessionMap();

        synchronized (sessionMap.getMutex()) {
            QuicklinksModel quicklinksModel = (QuicklinksModel) sessionMap.get(SESSION_KEY_QUICKLINKS);

            if (quicklinksModel == null) {
                return;
            }

            for (QuicklinksGruppeModel gruppe : quicklinksModel.getQuicklinksGruppen().values()) {
                QuicklinksElementModel zuLoschendesElement = null;
                for (QuicklinksElementModel element : gruppe.getQuicklinksElemente()) {
                    if (element.getId().equals(id)) {
                        zuLoschendesElement = element;
                        break; // IDs innerhalb einer Gruppe zwingend eindeutig
                    }
                }
                if (zuLoschendesElement != null) {
                    gruppe.getQuicklinksElemente().remove(zuLoschendesElement);
                }
            }
            // Variable immer wieder in Session schreiben, damit übergeordnete Sessionmanager auf jeden Fall
            // eine Aktualisierung sehen.
            sessionMap.put(SESSION_KEY_QUICKLINKS, quicklinksModel);
        }

    }

    /**
     * Entfernt einen Quicklink, der eine bestimmte ID besitzt.
     *
     * @param gruppeId
     *            Die ID der Gruppe.
     * @param id
     *            die ID.
     */
    public void entferneQuicklink(String gruppeId, String id) {

        // Variable aus der Session holen
        SharedAttributeMap sessionMap = ExternalContextHolder.getExternalContext().getSessionMap();

        synchronized (sessionMap.getMutex()) {
            QuicklinksModel quicklinksModel = (QuicklinksModel) sessionMap.get(SESSION_KEY_QUICKLINKS);

            if (quicklinksModel == null) {
                return;
            }

            QuicklinksGruppeModel gruppe = quicklinksModel.getQuicklinksGruppen().get(gruppeId);

            if (gruppe == null) {
                return;
            }

            QuicklinksElementModel zuLoschendesElement = null;
            for (QuicklinksElementModel element : gruppe.getQuicklinksElemente()) {
                if (element.getId().equals(id)) {
                    zuLoschendesElement = element;
                    break; // IDs innerhalb einer Gruppe zwingend eindeutig
                }

            }

            if (zuLoschendesElement != null) {
                gruppe.getQuicklinksElemente().remove(zuLoschendesElement);
            }

            // Variable immer wieder in Session schreiben, damit übergeordnete Sessionmanager auf jeden Fall
            // eine
            // Aktualisierung sehen.
            sessionMap.put(SESSION_KEY_QUICKLINKS, quicklinksModel);

        }

    }

    /**
     * Verschiebt alle Quicklink-Elemente von einer Quicklink-Liste zu einer Anderen.
     *
     * @param vonGruppeId
     *            Die Gruppen ID der ursprünglichen Quicklinks-Liste (alternativ die Header-Bezeichnung)
     * @param nachGruppeId
     *            Die Gruppen ID der Quicklinks-Liste in welche die Element verschoben werden soll.
     *            (alternativ die Header-Bezeichnung)
     * @param maxAnzahl
     *            Die maximale Anzahl der anzuzeigenden Elemente.
     */
    public void verschiebeQuicklinks(String vonGruppeId, String nachGruppeId, int maxAnzahl) {

        // Variable aus der Session holen
        SharedAttributeMap sessionMap = ExternalContextHolder.getExternalContext().getSessionMap();

        synchronized (sessionMap.getMutex()) {
            QuicklinksModel quicklinksModel = (QuicklinksModel) sessionMap.get(SESSION_KEY_QUICKLINKS);

            if (quicklinksModel != null && quicklinksModel.getQuicklinksGruppen().get(vonGruppeId) != null) {
                List elemente =
                    quicklinksModel.getQuicklinksGruppen().get(vonGruppeId).getQuicklinksElemente();
                ListIterator iterator = elemente.listIterator(elemente.size());

                List elementeVerschieben = new ArrayList<>();
                while (iterator.hasPrevious()) {
                    elementeVerschieben.add(iterator.previous());
                }

                for (QuicklinksElementModel model : elementeVerschieben) {
                    entferneQuicklink(model.getId());
                    fuegeQuicklinkHinzu(model, nachGruppeId, maxAnzahl);
                }

            }
            // Variable immer wieder in Session schreiben, damit übergeordnete Sessionmanager auf jeden Fall
            // eine
            // Aktualisierung sehen.
            sessionMap.put(SESSION_KEY_QUICKLINKS, quicklinksModel);
        }

    }

    /**
     * Fügt ein neues QuicklinkselementModel am Anfang hinzu.
     *
     * @param quicklinksModel
     *            Das QuicklinksModel.
     * @param quicklinkselementModel
     *            Das neue QuicklinksElementModel.
     * @param gruppeId
     *            Die ID der Gruppe.
     * @param maxAnzahl
     *            Die maximale Anzahl an Quicklinks in der Gruppe.
     *
     * @return quicklinkselementModelGeloescht.
     */
    private QuicklinksElementModel addQuicklinkselementModelAtTheBeginning(QuicklinksModel quicklinksModel,
        QuicklinksElementModel quicklinkselementModel, String gruppeId, int maxAnzahl) {

        QuicklinksGruppeModel quicklinksGruppeModel = quicklinksModel.getQuicklinksGruppen().get(gruppeId);

        if (quicklinksGruppeModel == null) {
            // Null, falls keine Konfiguration existiert. Fallback: Gruppe über die Gruppen ID erzeugen, damit
            // ist auch der Fallback zu früheren Versionen der plis-web gewährleistet (gruppeId = headerName).
            quicklinksGruppeModel = new QuicklinksGruppeModel();
            quicklinksGruppeModel.setGruppeId(gruppeId);
            quicklinksGruppeModel.setAnzuzeigenderGruppenname(gruppeId);
            quicklinksGruppeModel.setSichtbar(true);
            quicklinksModel.getQuicklinksGruppen().put(gruppeId, quicklinksGruppeModel);
        }

        quicklinksGruppeModel.getQuicklinksElemente().add(0, quicklinkselementModel);

        return limitiereAnzahl(maxAnzahl, quicklinksGruppeModel);

    }

    /**
     * Limitiert die Anzahl an Quicklinks in einer Gruppe.
     * @param maxAnzahl
     *            Die maximale Anzahl.
     * @param quicklinksGruppeModel
     *            Die Gruppe.
     *
     * @return quicklinkselementModelGeloescht.
     */
    private QuicklinksElementModel limitiereAnzahl(int maxAnzahl,
        QuicklinksGruppeModel quicklinksGruppeModel) {
        QuicklinksElementModel quicklinkselementModelGeloescht = null;
        if (quicklinksGruppeModel.getQuicklinksElemente().size() > maxAnzahl) {
            quicklinkselementModelGeloescht = quicklinksGruppeModel.getQuicklinksElemente()
                .get(quicklinksGruppeModel.getQuicklinksElemente().size() - 1);
            quicklinksGruppeModel.getQuicklinksElemente()
                .remove(quicklinksGruppeModel.getQuicklinksElemente().size() - 1);
        }

        return quicklinkselementModelGeloescht;
    }

    @Required
    public void setKonfiguration(Konfiguration konfiguration) {
        this.konfiguration = konfiguration;
    }
}