com.spectralogic.dsbrowser.gui.services.ds3Panel.Ds3PanelService.java Source code

Java tutorial

Introduction

Here is the source code for com.spectralogic.dsbrowser.gui.services.ds3Panel.Ds3PanelService.java

Source

/*
 * ******************************************************************************
 *    Copyright 2016-2018 Spectra Logic Corporation. All Rights Reserved.
 *    Licensed under the Apache License, Version 2.0 (the "License"). You may not use
 *    this file except in compliance with the License. A copy of the License is located at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 *    or in the "license" file accompanying this file.
 *    This file 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 com.spectralogic.dsbrowser.gui.services.ds3Panel;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.spectralogic.ds3client.commands.GetBucketRequest;
import com.spectralogic.ds3client.commands.GetBucketResponse;
import com.spectralogic.ds3client.commands.spectrads3.GetBucketsSpectraS3Request;
import com.spectralogic.ds3client.commands.spectrads3.GetBucketsSpectraS3Response;
import com.spectralogic.ds3client.models.Bucket;
import com.spectralogic.ds3client.models.ListBucketResult;
import com.spectralogic.ds3client.models.PhysicalPlacement;
import com.spectralogic.ds3client.utils.Guard;
import com.spectralogic.dsbrowser.api.services.logging.LogType;
import com.spectralogic.dsbrowser.api.services.logging.LoggingService;
import com.spectralogic.dsbrowser.gui.components.ds3panel.Ds3Common;
import com.spectralogic.dsbrowser.gui.components.ds3panel.Ds3PanelPresenter;
import com.spectralogic.dsbrowser.gui.components.ds3panel.ds3treetable.Ds3TreeTableItem;
import com.spectralogic.dsbrowser.gui.components.ds3panel.ds3treetable.Ds3TreeTableValue;
import com.spectralogic.dsbrowser.gui.components.metadata.Ds3Metadata;
import com.spectralogic.dsbrowser.gui.components.metadata.MetadataView;
import com.spectralogic.dsbrowser.gui.components.physicalplacement.PhysicalPlacementPopup;
import com.spectralogic.dsbrowser.gui.services.Workers;
import com.spectralogic.dsbrowser.gui.services.sessionStore.Session;
import com.spectralogic.dsbrowser.gui.services.tasks.MetadataTask;
import com.spectralogic.dsbrowser.gui.services.tasks.PhysicalPlacementTask;
import com.spectralogic.dsbrowser.gui.services.tasks.SearchJobTask;
import com.spectralogic.dsbrowser.gui.util.*;
import com.spectralogic.dsbrowser.gui.util.treeItem.SafeHandler;
import com.spectralogic.dsbrowser.util.GuavaCollectors;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.time.Duration;
import java.time.Instant;
import java.util.Comparator;
import java.util.Optional;
import java.util.ResourceBundle;
import java.util.stream.Collectors;

public final class Ds3PanelService {

    private static final Logger LOG = LoggerFactory.getLogger(Ds3PanelService.class);

    private static Instant lastRefresh = Instant.now();

    /**
     * check if bucket contains or folders
     *
     * @param bucketName bucketName
     * @return true if bucket is empty else return false
     */
    public static boolean checkIfBucketEmpty(final String bucketName, final Session session) {
        try {
            final GetBucketRequest request = new GetBucketRequest(bucketName).withMaxKeys(1);
            final GetBucketResponse bucketResponse = session.getClient().getBucket(request);
            final ListBucketResult listBucketResult = bucketResponse.getListBucketResult();
            return Guard.isNullOrEmpty(listBucketResult.getObjects())
                    && Guard.isNullOrEmpty(listBucketResult.getCommonPrefixes());

        } catch (final Exception e) {
            LOG.error("could not get bucket response", e);
            return false;
        }
    }

    public static Optional<ImmutableList<Bucket>> setSearchableBucket(
            final ObservableList<TreeItem<Ds3TreeTableValue>> selectedItem, final Session session,
            final TreeTableView<Ds3TreeTableValue> treeTableView) {
        try {
            if (null != treeTableView) {
                ObservableList<TreeItem<Ds3TreeTableValue>> selectedItemTemp = selectedItem;
                if (null == selectedItemTemp) {
                    selectedItemTemp = FXCollections.observableArrayList();
                    if (null != treeTableView.getRoot() && null != treeTableView.getRoot().getValue()) {
                        selectedItemTemp.add(treeTableView.getRoot());
                    }
                }
                final GetBucketsSpectraS3Request getBucketsSpectraS3Request = new GetBucketsSpectraS3Request();
                final GetBucketsSpectraS3Response response = session.getClient()
                        .getBucketsSpectraS3(getBucketsSpectraS3Request);
                final ImmutableList<Bucket> buckets = response.getBucketListResult().getBuckets().stream()
                        .collect(GuavaCollectors.immutableList());
                if (!Guard.isNullOrEmpty(selectedItemTemp)) {
                    final ImmutableSet<String> bucketNameSet = selectedItemTemp.stream()
                            .map(item -> item.getValue().getBucketName()).collect(GuavaCollectors.immutableSet());
                    return Optional
                            .ofNullable(buckets.stream().filter(bucket -> bucketNameSet.contains(bucket.getName()))
                                    .collect(GuavaCollectors.immutableList()));
                } else {
                    return Optional.ofNullable(buckets);
                }
            } else {
                throw new NullPointerException("TreeTableView can't be null");
            }
        } catch (final Exception e) {
            LOG.error("Something went wrong!", e);
            return Optional.empty();
        }
    }

    public static void refresh(final TreeItem<Ds3TreeTableValue> modifiedTreeItem) {
        LOG.info("Running refresh of row");
        if (modifiedTreeItem instanceof Ds3TreeTableItem) {
            final Ds3TreeTableItem item;
            if (modifiedTreeItem.getValue().getType().equals(Ds3TreeTableValue.Type.File)) {
                item = (Ds3TreeTableItem) modifiedTreeItem.getParent();
            } else {
                item = (Ds3TreeTableItem) modifiedTreeItem;
            }
            if (item != null) {
                if (item.isExpanded()) {
                    item.refresh();
                } else if (item.isAccessedChildren()) {
                    item.setExpanded(true);
                    item.refresh();
                } else {
                    item.setExpanded(true);
                }
            }
        }
    }

    public static void throttledRefresh(final TreeItem<Ds3TreeTableValue> modifiedTreeItem) {
        if (modifiedTreeItem != null && lastRefresh.plus(Duration.ofSeconds(5)).isBefore(Instant.now())) {
            lastRefresh = Instant.now();
            refresh(modifiedTreeItem);
        }
    }

    public static void showPhysicalPlacement(final Ds3Common ds3Common, final Workers workers,
            final ResourceBundle resourceBundle) {
        ImmutableList<TreeItem<Ds3TreeTableValue>> tempValues = ds3Common.getDs3TreeTableView().getSelectionModel()
                .getSelectedItems().stream().collect(GuavaCollectors.immutableList());
        final TreeItem<Ds3TreeTableValue> root = ds3Common.getDs3TreeTableView().getRoot();
        if (tempValues.isEmpty() && (root == null || root.getValue() != null)) {
            LOG.info(resourceBundle.getString("nothingSelected"));
            new LazyAlert(resourceBundle).info(resourceBundle.getString("nothingSelected"));
            return;
        } else if (tempValues.isEmpty()) {
            final ImmutableList.Builder<TreeItem<Ds3TreeTableValue>> builder = ImmutableList.builder();
            tempValues = builder.add(root).build().asList();

        }
        final ImmutableList<TreeItem<Ds3TreeTableValue>> values = tempValues;
        if (values.size() > 1) {
            LOG.info(resourceBundle.getString("onlySingleObjectSelectForPhysicalPlacement"));
            new LazyAlert(resourceBundle)
                    .info(resourceBundle.getString("onlySingleObjectSelectForPhysicalPlacement"));
            return;
        }

        final PhysicalPlacementTask getPhysicalPlacement = new PhysicalPlacementTask(ds3Common, values, workers);

        workers.execute(getPhysicalPlacement);
        getPhysicalPlacement.setOnSucceeded(SafeHandler.logHandle(event -> Platform.runLater(() -> {
            LOG.info("Launching PhysicalPlacement popup");
            PhysicalPlacementPopup.show((PhysicalPlacement) getPhysicalPlacement.getValue(), resourceBundle);
        })));
    }

    @SuppressWarnings("unchecked")
    public static void showMetadata(final Ds3Common ds3Common, final Workers workers,
            final ResourceBundle resourceBundle) {
        final TreeTableView ds3TreeTableView = ds3Common.getDs3TreeTableView();
        final ImmutableList<TreeItem<Ds3TreeTableValue>> values = (ImmutableList<TreeItem<Ds3TreeTableValue>>) ds3TreeTableView
                .getSelectionModel().getSelectedItems().stream().collect(GuavaCollectors.immutableList());
        if (values.isEmpty()) {
            LOG.info(resourceBundle.getString("noFiles"));
            new LazyAlert(resourceBundle).info(resourceBundle.getString("noFiles"));
            return;
        }
        if (values.size() > 1) {
            LOG.info(resourceBundle.getString("onlySingleObjectSelectForMetadata"));
            new LazyAlert(resourceBundle).info(resourceBundle.getString("onlySingleObjectSelectForMetadata"));
            return;
        }

        final MetadataTask getMetadata = new MetadataTask(ds3Common, values);
        workers.execute(getMetadata);
        getMetadata.setOnSucceeded(SafeHandler.logHandle(event -> Platform.runLater(() -> {
            LOG.info("Launching metadata popup");
            final MetadataView metadataView = new MetadataView((Ds3Metadata) getMetadata.getValue());
            Popup.show(metadataView.getView(), resourceBundle.getString("metaDataContextMenu"));
        })));
    }

    public static void filterChanged(final Ds3Common ds3Common, final Workers workers,
            final LoggingService loggingService, final ResourceBundle resourceBundle,
            final DateTimeUtils dateTimeUtils) {
        final Ds3PanelPresenter ds3PanelPresenter = ds3Common.getDs3PanelPresenter();
        final String newValue = ds3PanelPresenter.getSearchedText();
        ds3PanelPresenter.getDs3PathIndicator().setText(resourceBundle.getString("searching"));
        ds3PanelPresenter.getDs3PathIndicatorTooltip().setText(resourceBundle.getString("searching"));
        final TreeTableView<Ds3TreeTableValue> ds3TreeTableView = ds3Common.getDs3TreeTableView();
        final Session session = ds3Common.getCurrentSession();
        if (Guard.isStringNullOrEmpty(newValue)) {
            setVisibilityOfItemsInfo(true, ds3Common);
            RefreshCompleteViewWorker.refreshCompleteTreeTableView(ds3Common, workers, dateTimeUtils,
                    loggingService);
        } else {
            try {
                ObservableList<TreeItem<Ds3TreeTableValue>> selectedItem = ds3TreeTableView.getSelectionModel()
                        .getSelectedItems();
                final TreeItem<Ds3TreeTableValue> root = ds3TreeTableView.getRoot();
                if (Guard.isNullOrEmpty(selectedItem) && (root != null && root.getValue() != null)) {
                    selectedItem = FXCollections.observableArrayList();
                    selectedItem.add(root);
                }

                final Optional<ImmutableList<Bucket>> searchableBuckets = Ds3PanelService
                        .setSearchableBucket(selectedItem, session, ds3TreeTableView);
                final TreeItem<Ds3TreeTableValue> rootTreeItem = new TreeItem<>();
                rootTreeItem.setExpanded(true);
                ds3TreeTableView.setShowRoot(false);
                setVisibilityOfItemsInfo(false, ds3Common);

                final SearchJobTask searchJobTask = new SearchJobTask(searchableBuckets.get(), newValue, session,
                        workers, ds3Common, dateTimeUtils, loggingService);
                workers.execute(searchJobTask);
                searchJobTask.setOnSucceeded(SafeHandler.logHandle(event -> {
                    LOG.info("Search completed!");
                    Platform.runLater(() -> {
                        try {
                            final ObservableList<Ds3TreeTableItem> treeTableItems = FXCollections
                                    .observableArrayList(searchJobTask.get().stream().collect(Collectors.toList()));
                            ds3PanelPresenter.getDs3PathIndicator().setText(
                                    StringBuilderUtil.nObjectsFoundMessage(treeTableItems.size()).toString());
                            ds3PanelPresenter.getDs3PathIndicatorTooltip().setText(
                                    StringBuilderUtil.nObjectsFoundMessage(treeTableItems.size()).toString());
                            loggingService.logMessage(
                                    StringBuilderUtil.nObjectsFoundMessage(treeTableItems.size()).toString(),
                                    LogType.INFO);
                            treeTableItems.sort(Comparator.comparing(t -> t.getValue().getType().toString()));
                            treeTableItems.forEach(value -> rootTreeItem.getChildren().add(value));
                            if (rootTreeItem.getChildren().size() == 0) {
                                ds3TreeTableView
                                        .setPlaceholder(new Label(resourceBundle.getString("0_SearchResult")));
                            }
                            ds3TreeTableView.setRoot(rootTreeItem);
                            final TreeTableColumn<Ds3TreeTableValue, ?> ds3TreeTableValueTreeTableColumn = ds3TreeTableView
                                    .getColumns().get(1);
                            if (null != ds3TreeTableValueTreeTableColumn) {
                                ds3TreeTableValueTreeTableColumn.setVisible(true);
                            }
                        } catch (final Exception e) {
                            LOG.error("Search failed", e);
                            loggingService.logMessage(StringBuilderUtil.searchFailedMessage().append(e).toString(),
                                    LogType.ERROR);
                        }
                    });
                }));
                searchJobTask.setOnCancelled(SafeHandler.logHandle(event -> LOG.info("Search cancelled")));
            } catch (final Exception e) {
                LOG.error("Could not complete search: ", e);
            }
        }
    }

    private static void setVisibilityOfItemsInfo(final boolean visibility, final Ds3Common ds3Common) {
        ds3Common.getDs3PanelPresenter().getInfoLabel().setVisible(visibility);
        ds3Common.getDs3PanelPresenter().getCapacityLabel().setVisible(visibility);

    }
}