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

org.ikasan.dashboard.ui.administration.view.SystemEventSearchView Maven / Gradle / Ivy

There is a newer version: 4.0.2
Show newest version
package org.ikasan.dashboard.ui.administration.view;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.vaadin.flow.component.ComponentEventListener;
import com.vaadin.flow.component.UI;
import com.vaadin.flow.component.grid.HeaderRow;
import com.vaadin.flow.component.grid.ItemDoubleClickEvent;
import com.vaadin.flow.component.html.Image;
import com.vaadin.flow.component.html.Label;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.data.provider.Query;
import com.vaadin.flow.data.renderer.ComponentRenderer;
import com.vaadin.flow.data.renderer.TemplateRenderer;
import org.atmosphere.interceptor.AtmosphereResourceStateRecovery;
import org.ikasan.dashboard.ui.administration.component.SystemEventDialog;
import org.ikasan.dashboard.ui.administration.component.SystemEventFilteringGrid;
import org.ikasan.dashboard.ui.administration.component.SystemEventSearchForm;
import org.ikasan.dashboard.ui.administration.util.SystemEventFormatter;
import org.ikasan.dashboard.ui.general.component.LazyDownloadButton;
import org.ikasan.dashboard.ui.general.component.NotificationHelper;
import org.ikasan.dashboard.ui.search.listener.SearchListener;
import org.ikasan.dashboard.ui.util.*;
import org.ikasan.solr.model.IkasanSolrDocument;
import org.ikasan.spec.systemevent.SystemEvent;
import org.ikasan.spec.systemevent.SystemEventSearchFilter;
import org.ikasan.spec.systemevent.SystemEventSearchService;
import org.ikasan.systemevent.model.SolrSystemEvent;
import org.ikasan.systemevent.model.SolrSystemEventSearchFilter;
import org.ikasan.systemevent.model.SystemEventImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.ByteArrayInputStream;
import java.time.ZoneId;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

public class SystemEventSearchView extends VerticalLayout implements SearchListener
{
    private Logger logger = LoggerFactory.getLogger(SystemEventSearchView.class);

    private SystemEventSearchService systemEventSearchService;

    private SystemEventFilteringGrid searchResultsGrid;
    private SystemEventSearchFilter searchFilter = new SolrSystemEventSearchFilter();

    private SystemEventSearchForm searchForm;

    private Label resultsLabel = new Label();

    private DateFormatter dateFormatter;

    private LazyDownloadButton csvExportButton;

    private int maxDownloadBytes;

    private UI ui;

    /**
     * Constructor
     */
    public SystemEventSearchView(SystemEventSearchService systemEventSearchService,
                                 DateFormatter dateFormatter, int maxDownloadBytes)
    {
        super();
        this.systemEventSearchService = systemEventSearchService;
        if(this.systemEventSearchService ==  null)
        {
            throw new IllegalArgumentException("systemEventSearchService cannot be null!");
        }
        this.dateFormatter = dateFormatter;
        if(this.dateFormatter ==  null)
        {
            throw new IllegalArgumentException("dateFormatter cannot be null!");
        }

        this.maxDownloadBytes = maxDownloadBytes;

        this.ui = UI.getCurrent();
    }

    protected void init()
    {
        this.setSizeFull();
        this.setSpacing(false);
        this.setPadding(false);
        this.setMargin(false);
        this.setId("identifier");

        this.getElement().getThemeList().remove("padding");
        this.getElement().getThemeList().remove("spacing");

        resultsLabel.setVisible(false);

        this.createSearchForm();

        this.searchResultsGrid = new SystemEventFilteringGrid(this.systemEventSearchService, this.searchFilter, this.resultsLabel);

        ObjectMapper objectMapper = new ObjectMapper();

        this.searchResultsGrid.addColumn(new ComponentRenderer<>(ikasanSolrDocument ->
        {
            HorizontalLayout horizontalLayout = new HorizontalLayout();
            horizontalLayout.setWidth("100%");
            horizontalLayout.setJustifyContentMode(JustifyContentMode.START);
            if(ikasanSolrDocument.getActor() != null && ! ikasanSolrDocument.getActor().isEmpty()) {
                horizontalLayout.add(ikasanSolrDocument.getActor());
            }
            else {
                try {
                    horizontalLayout.add(objectMapper.readValue(((SolrSystemEvent)ikasanSolrDocument).getPayload()
                        , SystemEventImpl.class).getActor());
                } catch (JsonProcessingException e) {
                    // Not much we can do if the event is not valid json.
                }
            }

            return horizontalLayout;
        })).setFlexGrow(2)
            .setHeader(getTranslation("text-field.action-performed-by", UI.getCurrent().getLocale()))
            .setKey("actor")
            .setResizable(true);
        this.searchResultsGrid.addColumn(new ComponentRenderer<>(ikasanSolrDocument ->
        {
            HorizontalLayout horizontalLayout = new HorizontalLayout();
            horizontalLayout.setWidth("100%");
            horizontalLayout.setJustifyContentMode(JustifyContentMode.START);

            if(ikasanSolrDocument.getSubject() != null && ! ikasanSolrDocument.getSubject().isEmpty()) {
                horizontalLayout.add(ikasanSolrDocument.getSubject());
            }
            else {
                try {
                    horizontalLayout.add(objectMapper.readValue(((SolrSystemEvent)ikasanSolrDocument).getPayload()
                        , SystemEventImpl.class).getSubject());
                } catch (JsonProcessingException e) {
                    // Not much we can do if the event is not valid json.
                }
            }

            return horizontalLayout;
        })).setFlexGrow(4).setKey("context")
            .setHeader(getTranslation("text-field.system-event-context", UI.getCurrent().getLocale()))
            .setResizable(true);
        this.searchResultsGrid.addColumn(new ComponentRenderer<>(ikasanSolrDocument ->
        {
            HorizontalLayout horizontalLayout = new HorizontalLayout();
            horizontalLayout.setWidth("100%");
            horizontalLayout.setJustifyContentMode(JustifyContentMode.START);
            if(ikasanSolrDocument.getAction() != null && ! ikasanSolrDocument.getAction().isEmpty()) {
                horizontalLayout.add(ikasanSolrDocument.getAction());
            }
            else {
                try {
                    horizontalLayout.add(objectMapper.readValue(((SolrSystemEvent)ikasanSolrDocument).getPayload()
                        , SystemEventImpl.class).getAction());
                } catch (JsonProcessingException e) {
                    // Not much we can do if the event is not valid json.
                }
            }

            return horizontalLayout;
        })).setFlexGrow(12)
            .setHeader(getTranslation("header.system-event", UI.getCurrent().getLocale()))
            .setKey("action")
            .setResizable(true);
        this.searchResultsGrid.addColumn(TemplateRenderer.of(
            "
[[item.date]]
") .withProperty("date", ikasanSolrDocument -> this.dateFormatter.getFormattedDate(((SolrSystemEvent)ikasanSolrDocument).getTimestampLong()))) .setHeader(getTranslation("table-header.timestamp", UI.getCurrent().getLocale())) .setSortable(true) .setKey("timestamp") .setFlexGrow(4) .setResizable(true); HeaderRow hr = searchResultsGrid.appendHeaderRow(); this.searchResultsGrid.addGridFiltering(hr, value -> searchFilter.setActor(value), "actor"); this.searchResultsGrid.addSelectGridFiltering(hr, value -> searchFilter.setSubject(value), SystemEventConstants.getSystemEventConstants(), "context"); this.searchResultsGrid.addGridFiltering(hr, value -> searchFilter.setAction(value), "action"); this.searchResultsGrid.setVisible(true); this.searchResultsGrid.setWidthFull(); this.searchResultsGrid.setHeight("100%"); this.searchResultsGrid.addItemDoubleClickListener((ComponentEventListener>) ikasanSolrDocumentItemDoubleClickEvent -> { SystemEventDialog systemEventDialog = new SystemEventDialog(this.dateFormatter); systemEventDialog.populate(ikasanSolrDocumentItemDoubleClickEvent.getItem()); }); this.createCsvDownloadButton(); HorizontalLayout resultsLayout = new HorizontalLayout(); resultsLayout.setWidthFull(); resultsLayout.setHeight("35px"); resultsLayout.add(resultsLabel, this.csvExportButton); this.csvExportButton.getElement().getStyle().set("position", "absolute"); this.csvExportButton.getElement().getStyle().set("right", "30px"); add(searchForm, resultsLayout, this.searchResultsGrid); } private void createCsvDownloadButton() { Image excelImage = new Image("/frontend/images/excel.png", ""); excelImage.setHeight("25px"); Optional optionalUI = UI.getCurrent().getUI(); this.csvExportButton = new LazyDownloadButton(excelImage, () -> "system-events-results-"+System.currentTimeMillis()+".csv", () -> { try { ZoneId zoneId; if(ui != null && ui.getSession().getAttribute(SessionAttributeConstants.TIMEZONE_ID) != null) { zoneId = ZoneId.of((String) ui.getSession().getAttribute(SessionAttributeConstants.TIMEZONE_ID)); } else { zoneId = ZoneId.of("UTC"); } IkasanSystemEventDocumentToCsvConverter csvConverter = new IkasanSystemEventDocumentToCsvConverter(zoneId); for (int i = 0; i < searchResultsGrid.getResultSize(); i += 100) { List docs = (List) searchResultsGrid.getDataProvider().fetch (new Query<>(i, 100, Collections.EMPTY_LIST, null, null)).collect(Collectors.toList()); for (SystemEvent document : docs) { csvConverter.addDocument(document); } if (csvConverter.getCvsContents().getBytes().length > this.maxDownloadBytes) { optionalUI.ifPresent(ui -> { if (ui.isAttached()) { ui.access(() -> NotificationHelper.showUserNotification(String.format(getTranslation("notification.download-size-exceeded" , UI.getCurrent().getLocale()), this.maxDownloadBytes)) ); } }); break; } } return new ByteArrayInputStream(csvConverter.getCvsContents().getBytes()); } catch (JsonProcessingException jsonProcessingException) { } return new ByteArrayInputStream(new byte[0]); } ); csvExportButton.getElement().setAttribute("title" , getTranslation("tooltip.export-to-csv", UI.getCurrent().getLocale())); csvExportButton.setHeight("35px"); csvExportButton.setWidth("30px"); csvExportButton.setDisableOnClick(true); csvExportButton.addClickListener(event -> { if(this.searchResultsGrid.getResultSize() == 0) { NotificationHelper.showUserNotification(getTranslation("notification.no-records-to-download" , UI.getCurrent().getLocale())); csvExportButton.reset(); csvExportButton.setEnabled(true); } else { NotificationHelper.showUserNotification(getTranslation("notification.preparing-download" , UI.getCurrent().getLocale())); } }); csvExportButton.addDownloadStartsListener(event -> { event.getSource().setEnabled(true); csvExportButton.reset(); }); } /** * Create the search form that appears at the top of the screen. */ protected void createSearchForm() { this.searchForm = new SystemEventSearchForm(); this.searchForm.addSearchListener(this); } @Override public void search(String searchTerm, List entityTypes, boolean negateQuery, long startDate, long endDate) { this.searchResultsGrid.init(startDate, endDate, searchTerm, List.of("systemEvent"), false, this.searchFilter); this.resultsLabel.setVisible(true); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy