/*
* 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.AcknowlegementType;
import org.constellation.configuration.ProviderServiceReport;
import org.constellation.configuration.ProvidersReport;
import org.geotoolkit.feature.Property;
import org.geotoolkit.gui.swing.propertyedit.JFeatureOutLine;
import org.geotoolkit.parameter.Parameters;
import org.jdesktop.swingx.combobox.ListComboBoxModel;
import org.opengis.parameter.GeneralParameterDescriptor;
import org.opengis.parameter.ParameterDescriptorGroup;
import org.opengis.parameter.ParameterValueGroup;
import org.openide.util.Exceptions;
import javax.swing.*;
import javax.xml.stream.XMLStreamException;
import java.awt.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author Johann Sorel (Geomatys)
*/
public class JProviderCreationPane extends javax.swing.JPanel {
private final ConstellationClient serverV2;
private final JFeatureOutLine guiParameterEditor = new JFeatureOutLine();
/**
* Creates new form JProviderCreationPane
*/
public JProviderCreationPane(final ConstellationClient serverV2) {
this.serverV2 = serverV2;
initComponents();
guiType.setRenderer(new DataRenderer());
guiSubType.setRenderer(new DataRenderer());
guiParameters.setViewportView(guiParameterEditor);
final List<Object> services = new ArrayList<>();
services.add("-");
try {
final ProvidersReport report = serverV2.providers.listProviders();
for(ProviderServiceReport service : report.getProviderServices()){
services.add(service);
}
guiType.setModel(new ListComboBoxModel(services));
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
}
public String getType(){
if (guiType.getSelectedItem() instanceof ProviderServiceReport) {
return ((ProviderServiceReport)guiType.getSelectedItem()).getType();
}
return guiType.getSelectedItem().toString();
}
public ParameterValueGroup getParameters(){
try {
final String type = getType();
final ParameterDescriptorGroup sourceDesc = (ParameterDescriptorGroup) serverV2.providers.getServiceDescriptor(type);
ParameterValueGroup sources = sourceDesc.createValue();
sources.parameter("id").setValue(guiId.getText().trim());
sources.parameter("providerType").setValue(guiCategory.getSelectedItem());
final ParameterValueGroup params;
if(guiSubType.isEnabled()){
//we have a subtype
final ParameterDescriptorGroup desc = (ParameterDescriptorGroup) guiSubType.getSelectedItem();
params = guiParameterEditor.getEditedAsParameter(desc);
sources.groups("choice").get(0).values().add(params);
}else if(guiType.getSelectedItem() instanceof ProviderServiceReport){
final ProviderServiceReport rep = (ProviderServiceReport) guiType.getSelectedItem();
final ParameterDescriptorGroup desc = (ParameterDescriptorGroup) serverV2.providers.getSourceDescriptor(rep.getType());
params = guiParameterEditor.getEditedAsParameter(desc);
Parameters.copy(params, sources.groups(params.getDescriptor().getName().getCode()).get(0));
}else{
//no type selected
return null;
}
return sources;
} catch (IOException |XMLStreamException | ClassNotFoundException ex ) {
Exceptions.printStackTrace(ex);
}
return null;
}
/**
* 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() {
guiLblType = new javax.swing.JLabel();
guiType = new javax.swing.JComboBox();
guiLblSubType = new javax.swing.JLabel();
guiSubType = new javax.swing.JComboBox();
guiLblId = new javax.swing.JLabel();
guiId = new javax.swing.JTextField();
guiParameters = new javax.swing.JScrollPane();
jLabel1 = new javax.swing.JLabel();
guiCategory = new javax.swing.JComboBox();
java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("org/constellation/swing/Bundle"); // NOI18N
guiLblType.setText(bundle.getString("type")); // NOI18N
guiType.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
guiTypeItemStateChanged(evt);
}
});
guiLblSubType.setText(bundle.getString("subtype")); // NOI18N
guiSubType.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
guiSubTypeItemStateChanged(evt);
}
});
guiLblId.setText(bundle.getString("id")); // NOI18N
jLabel1.setText(org.openide.util.NbBundle.getMessage(JProviderCreationPane.class, "providerCategory")); // NOI18N
guiCategory.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "vector", "raster" }));
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(guiParameters)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(guiLblId)
.addComponent(guiLblType)
.addComponent(guiLblSubType)
.addComponent(jLabel1))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(guiSubType, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(guiType, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(guiId)
.addComponent(guiCategory, 0, 317, Short.MAX_VALUE))))
.addContainerGap())
);
layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {guiLblId, guiLblSubType, guiLblType, jLabel1});
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(guiLblId)
.addComponent(guiId, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(guiLblType)
.addComponent(guiType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(guiLblSubType)
.addComponent(guiSubType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel1)
.addComponent(guiCategory, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(guiParameters, javax.swing.GroupLayout.PREFERRED_SIZE, 184, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
}// </editor-fold>//GEN-END:initComponents
private void guiTypeItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_guiTypeItemStateChanged
final Object candidate = guiType.getSelectedItem();
guiSubType.setModel(new ListComboBoxModel(new ArrayList()));
if (candidate instanceof ProviderServiceReport) {
try {
final ProviderServiceReport report = (ProviderServiceReport) candidate;
final ParameterDescriptorGroup desc = (ParameterDescriptorGroup) serverV2.providers.getSourceDescriptor(report.getType());
guiParameterEditor.setEdited((Property)null);
if("choice".equalsIgnoreCase(desc.getName().getCode())){
guiSubType.setModel(new ListComboBoxModel(desc.descriptors()));
guiLblSubType.setEnabled(true);
guiSubType.setEnabled(true);
}else{
guiLblSubType.setEnabled(false);
guiSubType.setEnabled(false);
guiParameterEditor.setEdited(desc.createValue());
}
guiSubType.setSelectedIndex(-1);
} catch (IOException | XMLStreamException | ClassNotFoundException ex) {
Exceptions.printStackTrace(ex);
}
}
}//GEN-LAST:event_guiTypeItemStateChanged
private void guiSubTypeItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_guiSubTypeItemStateChanged
if (guiSubType.getSelectedIndex() > -1) {
final ParameterDescriptorGroup subTypeDescriptor = (ParameterDescriptorGroup) guiSubType.getSelectedItem();
guiParameterEditor.setEdited((ParameterValueGroup) subTypeDescriptor.createValue());
}
}//GEN-LAST:event_guiSubTypeItemStateChanged
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JComboBox guiCategory;
private javax.swing.JTextField guiId;
private javax.swing.JLabel guiLblId;
private javax.swing.JLabel guiLblSubType;
private javax.swing.JLabel guiLblType;
private javax.swing.JScrollPane guiParameters;
private javax.swing.JComboBox guiSubType;
private javax.swing.JComboBox guiType;
private javax.swing.JLabel jLabel1;
// End of variables declaration//GEN-END:variables
/**
* Extends label display of the combo boxes.
*/
private static class DataRenderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
final JLabel lbl = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (value instanceof ProviderServiceReport) {
final ProviderServiceReport report = (ProviderServiceReport) value;
lbl.setText(report.getType());
} else if (value instanceof GeneralParameterDescriptor) {
final GeneralParameterDescriptor desc = (GeneralParameterDescriptor) value;
String name = desc.getName().getCode();
name = name.replaceAll("Parameters", "");
if(name.endsWith("-")){
name = name.substring(0, name.length()-1);
}
lbl.setText(name);
}
return lbl;
}
}
/**
*
* @param server
* @return
*/
public static void showDialog(final ConstellationClient serverV2){
final JProviderCreationPane pane = new JProviderCreationPane(serverV2);
final int res = JOptionPane.showOptionDialog(null, new Object[]{pane},
LayerRowModel.BUNDLE.getString("createProviderMsg"),
JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, null,
null);
if(JOptionPane.OK_OPTION == res){
final String type = pane.getType();
final ParameterValueGroup parameters = pane.getParameters();
//identifier null or empty
if (parameters.parameter("id") == null || parameters.parameter("id").stringValue().isEmpty()) {
JOptionPane.showMessageDialog(null, LayerRowModel.BUNDLE.getString("invalidProviderNameMessage"),
LayerRowModel.BUNDLE.getString("invalidProviderNameFrameTitle"), JOptionPane.WARNING_MESSAGE);
} else {
if(type != null && parameters != null) {
try {
//request server for creation. If it worked, a null value is returned.
final AcknowlegementType response = serverV2.providers.createProvider(type, parameters);
if (response != null) {
JOptionPane.showMessageDialog(null, response.getMessage(), response.getStatus(), JOptionPane.WARNING_MESSAGE);
}
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
}
}
}
}
}