/*
* Constellation - An open source and standard compliant SDI
* http://www.constellation-sdi.org
*
* Copyright 2014 Geomatys.
*
* 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 org.constellation.swing;
import org.constellation.admin.service.ConstellationClient;
import org.constellation.configuration.ProviderReport;
import org.constellation.configuration.ProviderServiceReport;
import org.constellation.configuration.ProvidersReport;
import org.constellation.security.RoleController;
import org.constellation.swing.action.Action;
import org.constellation.swing.action.ActionEditor;
import org.constellation.swing.action.ActionRenderer;
import org.jdesktop.swingx.JXTable;
import org.openide.util.Exceptions;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableModel;
import javax.swing.tree.DefaultMutableTreeNode;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.IOException;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map.Entry;
import static org.constellation.security.ActionPermissions.NEW_PROVIDER;
/**
* Top component to manage constellation providers.
*
* @author Johann Sorel (Geomatys)
*/
public final class JProvidersPane extends JPanel implements ActionListener, PropertyChangeListener {
private static final Comparator<ProviderServiceReport> SERVICE_COMPARATOR = new Comparator<ProviderServiceReport>() {
@Override
public int compare(ProviderServiceReport o1, ProviderServiceReport o2) {
return o1.getType().compareTo(o2.getType());
}
};
private final List<Action> actions = new ArrayList<>();
private final JXTable guiTable = new JXTable();
private final ConstellationClient serverV2;
private final FrameDisplayer displayer;
public JProvidersPane(final ConstellationClient cstlV2, final FrameDisplayer displayer) {
this(cstlV2, displayer, null);
}
public JProvidersPane(final ConstellationClient cstlV2, final FrameDisplayer displayer,
RoleController roleController, final Action ... actions) {
initComponents();
this.serverV2 = cstlV2;
if(displayer == null){
this.displayer = new DefaultFrameDisplayer();
} else {
this.displayer = displayer;
}
for(Action act : actions){
if(roleController == null || roleController.hasPermission(act.getName())){
this.actions.add(act);
act.addPropertyChangeListener(this);
}
}
//list all providers
guiAll.addActionListener(this);
try {
final ProvidersReport providersReport = cstlV2.providers.listProviders();
if (providersReport != null) {
final List<ProviderServiceReport> servicesReport = providersReport.getProviderServices();
Collections.sort(servicesReport,SERVICE_COMPARATOR);
for (final ProviderServiceReport serviceReport : servicesReport) {
//add a button for each type
final JToggleButton btn = new JToggleButton(serviceReport.getType());
btn.setActionCommand(serviceReport.getType());
btn.addActionListener(this);
guiTypeGroup.add(btn);
guiToolBar.add(btn);
}
}
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
guiNew.setVisible(roleController == null || roleController.hasPermission(NEW_PROVIDER));
final Font fontBig = new Font("Monospaced", Font.BOLD, 16);
guiTable.setDefaultRenderer(Action.class, new ActionRenderer(cstlV2));
guiTable.setDefaultEditor(Action.class, new ActionEditor(cstlV2));
guiTable.setDefaultRenderer(Entry.class, new DefaultTableCellRenderer(){
@Override
public Component getTableCellRendererComponent(JTable table, Object o,
boolean isSelected, boolean hasFocus, int row, int column) {
final JLabel lbl = (JLabel) super.getTableCellRendererComponent(
table, o, isSelected, hasFocus, row, column);
lbl.setIcon(null);
if(o instanceof DefaultMutableTreeNode){
o = ((DefaultMutableTreeNode)o).getUserObject();
}
if(o instanceof Entry){
final Entry entry = (Entry) o;
final String type = (String) entry.getKey();
final ProviderReport inst = (ProviderReport) entry.getValue();
final Color bgColor = new Color(130, 160, 50);
final BufferedImage img = JServicesPane.createImage(type, null, Color.WHITE,fontBig, bgColor);
lbl.setIcon(new ImageIcon(img));
lbl.setText(inst.getId());
}
return lbl;
}
});
add(BorderLayout.CENTER,new JScrollPane(guiTable));
updateInstanceList();
}
public FrameDisplayer getDisplayer() {
return displayer;
}
private void updateInstanceList(){
String action = "all";
if(guiTypeGroup.getSelection() != null){
action = guiTypeGroup.getSelection().getActionCommand();
}
//list all providers
try {
final ProvidersReport providersReport = serverV2.providers.listProviders();
if (providersReport != null) {
final List<ProviderServiceReport> servicesReport = providersReport.getProviderServices();
final List<Entry<String,ProviderReport>> instances = new ArrayList<> ();
for (final ProviderServiceReport serviceReport : servicesReport) {
final String type = serviceReport.getType();
if("all".equals(action) || action.equalsIgnoreCase(type)){
final List<ProviderReport> providers = serviceReport.getProviders();
for(ProviderReport report : providers){
instances.add(new AbstractMap.SimpleEntry<>(type,report));
}
}
}
Collections.sort(instances,new Comparator<Entry<String,ProviderReport>>(){
@Override
public int compare(Entry<String,ProviderReport> o1, Entry<String,ProviderReport> o2) {
if(o1.getKey().equals(o2.getKey())){
//compare instance names
return o1.getValue().getId().compareTo(o2.getValue().getId());
}else{
//compare types
return o1.getKey().compareTo(o2.getKey());
}
}
});
final TableModel model = new InstanceModel(instances);
guiTable.setModel(model);
}
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
final int width = 140;
for (int i = 1; i < guiTable.getColumnCount(); i++) {
guiTable.getColumn(i).setMinWidth(width);
guiTable.getColumn(i).setPreferredWidth(width);
guiTable.getColumn(i).setMaxWidth(width);
}
guiTable.setTableHeader(null);
guiTable.setRowHeight(37);
guiTable.setFillsViewportHeight(true);
guiTable.setBackground(Color.WHITE);
guiTable.setShowGrid(true);
guiTable.setShowHorizontalLines(true);
guiTable.setShowVerticalLines(false);
guiTable.revalidate();
guiTable.repaint();
}
/**
* 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.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
guiTypeGroup = new javax.swing.ButtonGroup();
jPanel1 = new javax.swing.JPanel();
jToolBar0 = new javax.swing.JToolBar();
guiRefresh = new javax.swing.JButton();
jSeparator1 = new javax.swing.JToolBar.Separator();
guiToolBar = new javax.swing.JToolBar();
guiAll = new javax.swing.JToggleButton();
jToolBar1 = new javax.swing.JToolBar();
jSeparator2 = new javax.swing.JToolBar.Separator();
guiNew = new javax.swing.JButton();
setLayout(new java.awt.BorderLayout());
jPanel1.setLayout(new java.awt.BorderLayout());
jToolBar0.setFloatable(false);
guiRefresh.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/constellation/swing/reload.png"))); // NOI18N
java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("org/constellation/swing/Bundle"); // NOI18N
guiRefresh.setText(bundle.getString("refresh")); // NOI18N
guiRefresh.setFocusable(false);
guiRefresh.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
guiRefresh.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
guiRefreshActionPerformed(evt);
}
});
jToolBar0.add(guiRefresh);
jToolBar0.add(jSeparator1);
jPanel1.add(jToolBar0, java.awt.BorderLayout.WEST);
guiToolBar.setFloatable(false);
guiTypeGroup.add(guiAll);
guiAll.setSelected(true);
guiAll.setText(bundle.getString("all")); // NOI18N
guiAll.setActionCommand("all");
guiAll.setFocusable(false);
guiAll.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
guiAll.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
guiToolBar.add(guiAll);
jPanel1.add(guiToolBar, java.awt.BorderLayout.CENTER);
jToolBar1.setFloatable(false);
jToolBar1.add(jSeparator2);
guiNew.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/constellation/swing/edit_add.png"))); // NOI18N
guiNew.setText(bundle.getString("creation")); // NOI18N
guiNew.setFocusable(false);
guiNew.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
guiNew.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
guiNewActionPerformed(evt);
}
});
jToolBar1.add(guiNew);
jPanel1.add(jToolBar1, java.awt.BorderLayout.EAST);
add(jPanel1, java.awt.BorderLayout.NORTH);
}// </editor-fold>//GEN-END:initComponents
private void guiRefreshActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_guiRefreshActionPerformed
updateInstanceList();
}//GEN-LAST:event_guiRefreshActionPerformed
private void guiNewActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_guiNewActionPerformed
JProviderCreationPane.showDialog(serverV2);
updateInstanceList();
}//GEN-LAST:event_guiNewActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JToggleButton guiAll;
private javax.swing.JButton guiNew;
private javax.swing.JButton guiRefresh;
private javax.swing.JToolBar guiToolBar;
private javax.swing.ButtonGroup guiTypeGroup;
private javax.swing.JPanel jPanel1;
private javax.swing.JToolBar.Separator jSeparator1;
private javax.swing.JToolBar.Separator jSeparator2;
private javax.swing.JToolBar jToolBar0;
private javax.swing.JToolBar jToolBar1;
// End of variables declaration//GEN-END:variables
@Override
public void actionPerformed(ActionEvent e) {
updateInstanceList();
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
updateInstanceList();
}
private class InstanceModel extends AbstractTableModel{
private final List<Entry<String,ProviderReport>> entries;
public InstanceModel(final List<Entry<String,ProviderReport>> entries) {
this.entries = entries;
}
@Override
public Class<?> getColumnClass(int columnIndex) {
if(columnIndex == 0){
return Entry.class;
}else{
return Action.class;
}
}
@Override
public int getRowCount() {
return entries.size();
}
@Override
public int getColumnCount() {
return 1+actions.size();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
if(columnIndex>0){
final Action act = actions.get(columnIndex-1).clone();
act.setTarget(entries.get(rowIndex));
act.setDisplayer(displayer);
return act;
}
return entries.get(rowIndex);
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnIndex>0;
}
}
}