de.hsos.ecs.richwps.wpsmonitor.boundary.gui.elements.datasource.WpsDialog.java Source code

Java tutorial

Introduction

Here is the source code for de.hsos.ecs.richwps.wpsmonitor.boundary.gui.elements.datasource.WpsDialog.java

Source

/*
 * Copyright 2014 Florian Vogelpohl <floriantobias@gmail.com>.
 *
 * 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.hsos.ecs.richwps.wpsmonitor.boundary.gui.elements.datasource;

import de.hsos.ecs.richwps.wpsmonitor.boundary.gui.WpsMonitorAdminGui;
import de.hsos.ecs.richwps.wpsmonitor.boundary.gui.datasource.DataSource;
import de.hsos.ecs.richwps.wpsmonitor.boundary.gui.datasource.DataSourceException;
import de.hsos.ecs.richwps.wpsmonitor.boundary.gui.datasource.WpsDescription;
import de.hsos.ecs.richwps.wpsmonitor.boundary.gui.datasource.WpsProcessDescription;
import de.hsos.ecs.richwps.wpsmonitor.boundary.gui.elements.process.WpsProcessDialog;
import de.hsos.ecs.richwps.wpsmonitor.boundary.gui.elements.wps.WpsPanel;
import de.hsos.ecs.richwps.wpsmonitor.boundary.gui.utils.MessageDialogs;
import de.hsos.ecs.richwps.wpsmonitor.boundary.gui.utils.structure.WpsTreeNode;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.LayoutStyle;
import javax.swing.WindowConstants;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import org.apache.commons.lang.exception.ExceptionUtils;

/**
 * A Dialog to display the WPS Server- and Processes of the given DataSource
 * instances.
 *
 * @author Florian Vogelpohl <floriantobias@gmail.com>
 */
public class WpsDialog extends JDialog {

    private final WpsMonitorAdminGui mainFrame;
    private final Set<DataSource> sources;

    /**
     * Creates a new WpsDialog instance.
     *
     * @param parent Monitor gui mainframe
     * @param sources Set of DataSources
     */
    public WpsDialog(final WpsMonitorAdminGui parent, final Set<DataSource> sources) {
        super(parent, true);
        this.mainFrame = parent;
        this.sources = sources == null ? new HashSet<DataSource>() : sources;

        initComponents();
        init();
    }

    /**
     * Creates a new WpsDialog instance.
     *
     * @param parent Monitor gui mainframe
     * @param source DataSource instance
     */
    public WpsDialog(final WpsMonitorAdminGui parent, final DataSource source) {
        this(parent, new HashSet<>(Arrays.asList(new DataSource[] { source })));
    }

    private void init() {
        addComponentListener(new ComponentListener() {

            @Override
            public void componentResized(ComponentEvent ce) {
            }

            @Override
            public void componentMoved(ComponentEvent ce) {
            }

            @Override
            public void componentShown(ComponentEvent ce) {
                initTree(sources);
            }

            @Override
            public void componentHidden(ComponentEvent ce) {
            }
        });
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        JPanel jPanel1 = new JPanel();
        closeButton = new JButton();
        addToMonitorButton = new JButton();
        treeScrollPane = new JScrollPane();
        wpsTree = new JTree();
        JLabel jLabel1 = new JLabel();

        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("List of WPS-Servers- and Processes");
        setIconImage(new ImageIcon(getClass().getResource("/icons/database.png")).getImage());
        setMinimumSize(null);
        setName("wpsDialog"); // NOI18N
        setResizable(false);

        jPanel1.setBorder(BorderFactory.createTitledBorder(""));

        closeButton.setIcon(new ImageIcon(getClass().getResource("/icons/apply.png"))); // NOI18N
        closeButton.setText("Close");
        closeButton.setName("closeButton"); // NOI18N
        closeButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                closeButtonActionPerformed(evt);
            }
        });

        addToMonitorButton.setIcon(new ImageIcon(getClass().getResource("/icons/add.png"))); // NOI18N
        addToMonitorButton.setText("Add WPS with Processes");
        addToMonitorButton.setName("addToMonitorButton"); // NOI18N
        addToMonitorButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                addToMonitorButtonActionPerformed(evt);
            }
        });

        DefaultMutableTreeNode treeNode1 = new DefaultMutableTreeNode("root");
        wpsTree.setModel(new DefaultTreeModel(treeNode1));
        wpsTree.setName("wpsTree"); // NOI18N
        treeScrollPane.setViewportView(wpsTree);

        jLabel1.setText(
                "<html><body>Here is a list of all registered data-sources. You can pick up processes and WPS and add your choice to the monitor through the \"Add WPS with Processes\"-Button. If you select only a WPS, all processes of this WPS will also  be added. The processes will  be saved, but they have no Jobs or a testrequest.</body></html>");

        GroupLayout jPanel1Layout = new GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                .addGroup(jPanel1Layout.createSequentialGroup().addContainerGap().addGroup(jPanel1Layout
                        .createParallelGroup(GroupLayout.Alignment.LEADING)
                        .addGroup(jPanel1Layout.createSequentialGroup().addGap(0, 0, Short.MAX_VALUE)
                                .addComponent(addToMonitorButton)
                                .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED).addComponent(closeButton))
                        .addComponent(jLabel1, GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
                        .addGroup(jPanel1Layout.createSequentialGroup()
                                .addComponent(treeScrollPane, GroupLayout.PREFERRED_SIZE, 630,
                                        GroupLayout.PREFERRED_SIZE)
                                .addGap(0, 0, Short.MAX_VALUE)))
                        .addContainerGap()));
        jPanel1Layout
                .setVerticalGroup(jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                        .addGroup(jPanel1Layout.createSequentialGroup().addContainerGap()
                                .addComponent(jLabel1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE,
                                        GroupLayout.PREFERRED_SIZE)
                                .addGap(18, 18, 18)
                                .addComponent(treeScrollPane, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)
                                .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(jPanel1Layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                                        .addComponent(addToMonitorButton).addComponent(closeButton))
                                .addContainerGap()));

        GroupLayout layout = new GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup().addContainerGap()
                        .addComponent(jPanel1, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addContainerGap()));
        layout.setVerticalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup().addContainerGap()
                        .addComponent(jPanel1, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addContainerGap()));

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void closeButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_closeButtonActionPerformed
        dispose();
    }//GEN-LAST:event_closeButtonActionPerformed

    private void addToMonitorButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_addToMonitorButtonActionPerformed
        Map<String, WpsDescription> wpsDescriptions = assignSelectionsToMap(wpsTree.getSelectionPaths());

        for (Map.Entry e : wpsDescriptions.entrySet()) {
            WpsDescription desc = (WpsDescription) e.getValue();
            String identifier = (String) e.getKey();

            WpsPanel wpsPanel = mainFrame.getPanel(identifier);

            if (wpsPanel == null) {
                wpsPanel = mainFrame.addWps(identifier, desc.getUri().toString());
            }

            if (wpsPanel != null) {
                for (WpsProcessDescription pDesc : desc.getProcesses()) {
                    WpsProcessDialog processDialog = wpsPanel.getWpsProcessDialog();
                    processDialog.addProcess(pDesc.getIdentifier());
                }
            }
        }
    }//GEN-LAST:event_addToMonitorButtonActionPerformed

    private Map<String, WpsDescription> assignSelectionsToMap(final TreePath[] selections) {
        Map<String, WpsDescription> wpsDescriptions = new HashMap<>();

        for (TreePath p : selections) {
            if (p.getLastPathComponent() instanceof WpsTreeNode) {
                WpsTreeNode node = (WpsTreeNode) p.getLastPathComponent();

                WpsTreeNode wps;

                if (node.getType() == WpsTreeNode.NodeType.PROCESS) {
                    wps = (WpsTreeNode) node.getParent();
                } else {
                    wps = node;
                }

                WpsDescription wpsDesc;

                if (node.getType() == WpsTreeNode.NodeType.WPS) {
                    wpsDesc = wps.getDescription();
                } else {
                    WpsDescription tmpDesc = wps.getDescription();
                    wpsDesc = new WpsDescription(tmpDesc.getIdentifier(), tmpDesc.getUri());
                }

                String identifier = wpsDesc.getIdentifier();
                if (!wpsDescriptions.containsKey(identifier)) {
                    wpsDescriptions.put(identifier, wpsDesc);
                }

                if (node.getType() == WpsTreeNode.NodeType.PROCESS) {
                    WpsProcessDescription processDesc = node.getDescription();
                    wpsDescriptions.get(identifier).add(processDesc);
                }
            }
        }

        return wpsDescriptions;
    }

    private void initTree(final Set<DataSource> sources) {
        DefaultMutableTreeNode root = new DefaultMutableTreeNode("Data Sources");
        List<Exception> exceptions = new ArrayList<>();

        for (DataSource source : sources) {

            String rootTitle = source.getUsedDriver() + ": " + source.getRessource();
            DefaultMutableTreeNode wpsRoot = new DefaultMutableTreeNode(rootTitle);

            try {
                for (WpsDescription wpsDesc : source.getWpsList()) {
                    DefaultMutableTreeNode wps = new WpsTreeNode(wpsDesc, WpsTreeNode.NodeType.WPS);

                    for (WpsProcessDescription processDesc : wpsDesc.getProcesses()) {
                        DefaultMutableTreeNode processNode = new WpsTreeNode(processDesc,
                                WpsTreeNode.NodeType.PROCESS);
                        wps.add(processNode);
                    }

                    wpsRoot.add(wps);
                }
            } catch (DataSourceException ex) {
                // gather occured exceptions for later displaying
                exceptions.add(ex);
            }

            root.add(wpsRoot);
        }

        if (!exceptions.isEmpty()) {
            showErrorMessage(exceptionListToString(exceptions));
        }

        wpsTree = new JTree(root);
        treeScrollPane.setViewportView(wpsTree);
    }

    private String exceptionListToString(List<Exception> exs) {
        StringBuilder str = new StringBuilder();

        for (Exception ex : exs) {
            str.append(ExceptionUtils.getStackTrace(ex));
            str.append('\n');
            str.append('\n');
        }

        return str.toString();
    }

    @Override
    public void setVisible(boolean b) {
        setLocationRelativeTo(mainFrame);

        super.setVisible(b);
    }

    private void showErrorMessage(final String msg) {
        MessageDialogs.showDetailedError(this, "Error", "DataSource Exceptions occurred.", msg);
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private JButton addToMonitorButton;
    private JButton closeButton;
    private JScrollPane treeScrollPane;
    private JTree wpsTree;
    // End of variables declaration//GEN-END:variables
}