/* * 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); } } } } } }