/* * SoapUI, Copyright (C) 2004-2016 SmartBear Software * * Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent * versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * * http://ec.europa.eu/idabc/eupl * * Unless required by applicable law or agreed to in writing, software distributed under the Licence is * distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the Licence for the specific language governing permissions and limitations * under the Licence. */ package com.eviware.soapui.support.resolver; import com.eviware.soapui.impl.wsdl.AbstractWsdlModelItem; import com.eviware.soapui.impl.wsdl.actions.project.SimpleDialog; import com.eviware.soapui.model.ModelItem; import com.eviware.soapui.model.project.Project; import com.eviware.soapui.support.UISupport; import com.eviware.soapui.support.resolver.ResolveContext.PathToResolve; import com.eviware.soapui.support.resolver.ResolveContext.Resolver; import com.eviware.soapui.support.swing.JTableFactory; import org.jdesktop.swingx.JXTable; import javax.swing.AbstractCellEditor; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.List; /** * Utility for resolving items * * @author Ole.Matzura */ public class ResolveDialog { private JDialog dialog; private ResolveContextTableModel resolveContextTableModel; private boolean showOkMessage; private String title; private String description; private String helpUrl; private JXTable table; public ResolveDialog(String title, String description, String helpUrl) { this.title = title; this.description = description; this.helpUrl = helpUrl; } @SuppressWarnings("serial") private void buildDialog() { dialog = new SimpleDialog(title, description, helpUrl, true) { @Override protected Component buildContent() { JPanel panel = new JPanel(new BorderLayout()); table = JTableFactory.getInstance().makeJXTable(resolveContextTableModel); table.setHorizontalScrollEnabled(true); table.setDefaultRenderer(JComboBox.class, new ResolverRenderer()); table.setDefaultEditor(JComboBox.class, new ResolverEditor()); table.getColumn(2).setCellRenderer(new PathCellRenderer()); table.getColumn(3).setWidth(100); table.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() > 1) { int ix = table.getSelectedRow(); if (ix != -1) { ResolveContext.PathToResolve pathToResolve = resolveContextTableModel.getContext() .getPathsToResolve().get(ix); if (pathToResolve != null) { UISupport.selectAndShow(pathToResolve.getOwner()); } } } } }); panel.add(new JScrollPane(table), BorderLayout.CENTER); panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); return panel; } /* * Change Cancel into Update */ @Override protected void modifyButtons() { super.modifyButtons(); Component[] components = buttons.getComponents(); for (Component component : components) { if (component instanceof JButton) { JButton button = (JButton) component; if (button.getText().equals("Cancel")) { button.setText("Update"); } } } } @Override protected boolean handleCancel() { return handleUpdate(); } @SuppressWarnings("unchecked") private boolean handleUpdate() { for (PathToResolve otherPath : resolveContextTableModel.getContext().getPathsToResolve()) { if (!otherPath.isResolved()) { otherPath.getOwner().afterLoad(); otherPath.getOwner().resolve(resolveContextTableModel.getContext()); } } dialog = null; setVisible(false); resolve(resolveContextTableModel.getContext().getModelItem()); return true; } @SuppressWarnings("unchecked") @Override protected boolean handleOk() { for (PathToResolve path : resolveContextTableModel.getContext().getPathsToResolve()) { if (!path.isResolved()) { if (UISupport.confirm("There are unresolved paths, continue?", "Unresolved paths - Warning")) { return true; } return false; } } return true; } }; dialog.setSize(550, 300); dialog.setModal(false); dialog.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); dialog.addWindowListener(new WindowAdapter() { @SuppressWarnings("unchecked") @Override public void windowClosing(WindowEvent arg0) { for (PathToResolve path : resolveContextTableModel.getContext().getPathsToResolve()) { if (!path.isResolved()) { if (UISupport.confirm("There are unresolved paths, continue?", "Unresolved paths - Warning")) { dialog.setVisible(false); } break; } } } }); } public boolean isShowOkMessage() { return showOkMessage; } public void setShowOkMessage(boolean showOkMessage) { this.showOkMessage = showOkMessage; } public ResolveContext<?> resolve(AbstractWsdlModelItem<?> modelItem) { ResolveContext<?> context = new ResolveContext<AbstractWsdlModelItem<?>>(modelItem); modelItem.resolve(context); if (context.isEmpty()) { if (isShowOkMessage()) { UISupport.showInfoMessage("No resolve problems found", title); } } else { resolveContextTableModel = new ResolveContextTableModel(context); if (dialog == null) { buildDialog(); } else { table.setModel(resolveContextTableModel); } UISupport.centerDialog(dialog); dialog.setVisible(true); } return context; } @SuppressWarnings("serial") private class ResolveContextTableModel extends AbstractTableModel { private ResolveContext<?> context; private ArrayList<JComboBox> jbcList = new ArrayList<JComboBox>(); @SuppressWarnings("unchecked") public ResolveContextTableModel(ResolveContext<?> context2) { context = context2; for (PathToResolve path : context.getPathsToResolve()) { ArrayList<Object> resolversAndDefaultAction = new ArrayList<Object>(); resolversAndDefaultAction.add("Choose one..."); for (Object resolver : path.getResolvers()) { resolversAndDefaultAction.add(resolver); } JComboBox jbc = new JComboBox(resolversAndDefaultAction.toArray()); jbcList.add(jbc); } } public JComboBox getResolversAndActions(int row) { return jbcList.get(row); } public int getColumnCount() { return 4; } public void setContext(ResolveContext<?> context) { this.context = context; fireTableDataChanged(); } @Override public String getColumnName(int column) { switch (column) { case 0: return "Item"; case 1: return "Description"; case 2: return "Value"; case 3: return "Action"; } return super.getColumnName(column); } @Override public Class<?> getColumnClass(int arg0) { if (arg0 == 3) { return JComboBox.class; } else { return String.class; } } public int getRowCount() { return context.getPathsToResolve().size(); } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return columnIndex == 3; } @SuppressWarnings("unchecked") public Object getValueAt(int arg0, int arg1) { PathToResolve ptr = context.getPathsToResolve().get(arg0); switch (arg1) { case 0: return createItemName(ptr); case 1: return ptr.getDescription(); case 2: return ptr.getPath(); } return null; } @SuppressWarnings("unchecked") private String createItemName(PathToResolve ptr) { String name = ""; ModelItem modelItem = ptr.getOwner(); try { name = modelItem.getName(); } catch (Exception e) { e.getStackTrace(); } while (modelItem.getParent() != null && !(modelItem.getParent() instanceof Project)) { modelItem = modelItem.getParent(); name = modelItem.getName() + " - " + name; } return name; } public ResolveContext<?> getContext() { return context; } @SuppressWarnings("unchecked") public void setResolver(int pathIndex, Object resolveOrDefaultAction) { PathToResolve path = context.getPathsToResolve().get(pathIndex); if (resolveOrDefaultAction instanceof Resolver) { path.setResolver(resolveOrDefaultAction); } } } private class ResolverRenderer implements TableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { return ((ResolveContextTableModel) table.getModel()).getResolversAndActions(row); } } @SuppressWarnings("serial") private class ResolverEditor extends AbstractCellEditor implements TableCellEditor { private JComboBox jbc = new JComboBox(); @SuppressWarnings("unchecked") public Component getTableCellEditorComponent(final JTable table, Object value, boolean isSelected, int row, int column) { jbc = ((ResolveContextTableModel) table.getModel()).getResolversAndActions(row); final PathToResolve path = resolveContextTableModel.getContext().getPathsToResolve().get(row); jbc.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Object key = jbc.getSelectedItem(); if (key instanceof Resolver) { path.setResolver(key); } if (path.resolve()) { path.setSolved(true); jbc.addItem("Resolved"); jbc.setSelectedIndex(jbc.getItemCount() - 1); // for (int cnt = 0; cnt < // resolveContextTableModel.getContext().getPathsToResolve().size(); // cnt++) // { // PathToResolve otherPath = // resolveContextTableModel.getContext().getPathsToResolve().get(cnt); // if (path != otherPath & !otherPath.isResolved()) // { // otherPath.getOwner().afterLoad(); // otherPath.getOwner().resolve(resolveContextTableModel.getContext()); // if (otherPath.isResolved()) // { // JComboBox jbcOther = ((ResolveContextTableModel) // table.getModel()) // .getResolversAndActions(cnt); // jbcOther.addItem("Resolved"); // jbcOther.setSelectedIndex(jbcOther.getItemCount() - 1); // } // } // } } } }); return jbc; } public Object getCellEditorValue() { return null; } } @SuppressWarnings("serial") private class PathCellRenderer extends DefaultTableCellRenderer { private Color greenColor = Color.GREEN.darker().darker(); private Color redColor = Color.RED.darker().darker(); @SuppressWarnings("unchecked") @Override public Component getTableCellRendererComponent(JTable arg0, Object arg1, boolean arg2, boolean arg3, int arg4, int arg5) { Component comp = super.getTableCellRendererComponent(arg0, arg1, arg2, arg3, arg4, arg5); List<? extends PathToResolve> paths = resolveContextTableModel.getContext().getPathsToResolve(); PathToResolve ptr = arg4 >= paths.size() ? null : paths.get(arg4); // boolean resolved = ptr.getResolver() != null && // ptr.getResolver().isResolved(); if (ptr != null && ptr.isResolved()) { comp.setForeground(greenColor); setText(ptr.getPath()); } else { comp.setForeground(redColor); } return comp; } } }