View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2008 eviware.com 
3    *
4    *  soapUI is free software; you can redistribute it and/or modify it under the 
5    *  terms of version 2.1 of the GNU Lesser General Public License as published by 
6    *  the Free Software Foundation.
7    *
8    *  soapUI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without 
9    *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
10   *  See the GNU Lesser General Public License for more details at gnu.org.
11   */
12  
13  package com.eviware.soapui.support.resolver;
14  
15  import java.awt.BorderLayout;
16  import java.awt.Color;
17  import java.awt.Component;
18  import java.util.ArrayList;
19  
20  import javax.swing.AbstractCellEditor;
21  import javax.swing.BorderFactory;
22  import javax.swing.JComboBox;
23  import javax.swing.JDialog;
24  import javax.swing.JPanel;
25  import javax.swing.JScrollPane;
26  import javax.swing.JTable;
27  import javax.swing.table.AbstractTableModel;
28  import javax.swing.table.DefaultTableCellRenderer;
29  import javax.swing.table.TableCellEditor;
30  import javax.swing.table.TableCellRenderer;
31  
32  import org.jdesktop.swingx.JXTable;
33  
34  import com.eviware.soapui.impl.wsdl.AbstractWsdlModelItem;
35  import com.eviware.soapui.impl.wsdl.actions.project.SimpleDialog;
36  import com.eviware.soapui.support.UISupport;
37  import com.eviware.soapui.support.resolver.ResolveContext.PathToResolve;
38  import com.eviware.soapui.support.resolver.ResolveContext.Resolver;
39  
40  /***
41   * Utility for resolving items
42   * 
43   * @author Ole.Matzura
44   */
45  
46  public class ResolveDialog
47  {
48  
49  	private JDialog dialog;
50  	private ResolveContextTableModel resolveContextTableModel;
51  	private boolean showOkMessage;
52  	private String title;
53  	private String description;
54  	private String helpUrl;
55  
56  	public ResolveDialog(String title, String description, String helpUrl)
57  	{
58  		this.title = title;
59  
60  		this.description = description;
61  		this.helpUrl = helpUrl;
62  
63  	}
64  
65  	private void buildDialog()
66  	{
67  		dialog = new SimpleDialog(title, description, helpUrl, false)
68  		{
69  			@Override
70  			protected Component buildContent()
71  			{
72  				JPanel panel = new JPanel(new BorderLayout());
73  				JXTable table = new JXTable(resolveContextTableModel);
74  				table.setHorizontalScrollEnabled(true);
75  				table.setDefaultRenderer(JComboBox.class, new ResolverRenderer());
76  				table.setDefaultEditor(JComboBox.class, new ResolverEditor());
77  				table.getColumn(2).setCellRenderer(new PathCellRenderer());
78  				table.getColumn(3).setWidth(100);
79  
80  				panel.add(new JScrollPane(table), BorderLayout.CENTER);
81  				panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
82  
83  				return panel;
84  			}
85  
86  			@Override
87  			protected boolean handleOk()
88  			{
89  				// needs refactor
90  				for (PathToResolve path : resolveContextTableModel.getContext().getPathsToResolve())
91  				{
92  					int index = resolveContextTableModel.getContext().getPathsToResolve().indexOf(path);
93  					Object key = resolveContextTableModel.jbcList.get(index).getSelectedItem();
94  					if (key instanceof Resolver)
95  					{
96  						path.setResolver(key);
97  					}
98  				}
99  				int cnt = resolveContextTableModel.getContext().apply();
100 				if (isShowOkMessage())
101 				{
102 					UISupport.showInfoMessage("Resolved " + cnt + " items");
103 				}
104 				return true;
105 			}
106 
107 		};
108 
109 		dialog.setSize(550, 300);
110 	}
111 
112 	public boolean isShowOkMessage()
113 	{
114 		return showOkMessage;
115 	}
116 
117 	public void setShowOkMessage(boolean showOkMessage)
118 	{
119 		this.showOkMessage = showOkMessage;
120 	}
121 
122 	public ResolveContext resolve(AbstractWsdlModelItem modelItem)
123 	{
124 		ResolveContext context = new ResolveContext(modelItem);
125 		modelItem.resolve(context);
126 		if (context.isEmpty())
127 		{
128 			if (isShowOkMessage())
129 			{
130 				UISupport.showInfoMessage("No resolve problems found", title);
131 			}
132 		}
133 		else
134 		{
135 			resolveContextTableModel = new ResolveContextTableModel(context);
136 			if (dialog == null)
137 				buildDialog();
138 
139 			UISupport.centerDialog(dialog);
140 			dialog.setVisible(true);
141 		}
142 
143 		return context;
144 	}
145 
146 	@SuppressWarnings("serial")
147 	private class ResolveContextTableModel extends AbstractTableModel
148 	{
149 		private ResolveContext<?> context;
150 		private ArrayList<JComboBox> jbcList = new ArrayList<JComboBox>();
151 
152 		@SuppressWarnings("unchecked")
153 		public ResolveContextTableModel(ResolveContext<?> context2)
154 		{
155 			context = context2;
156 			for (PathToResolve path : context.getPathsToResolve())
157 			{
158 				ArrayList<Object> resolversAndDefaultAction = new ArrayList<Object>();
159 				if (path.getDefaultAction() != null)
160 				{
161 					resolversAndDefaultAction.add(path.getDefaultAction());
162 				}
163 				for (Object resolver : path.getResolvers())
164 				{
165 					resolversAndDefaultAction.add(resolver);
166 				}
167 				JComboBox jbc = new JComboBox(resolversAndDefaultAction.toArray());
168 				jbcList.add(jbc);
169 			}
170 
171 		}
172 
173 		public JComboBox getResolversAndActions(int row)
174 		{
175 			return jbcList.get(row);
176 		}
177 
178 		public int getColumnCount()
179 		{
180 			return 4;
181 		}
182 
183 		public void setContext(ResolveContext context)
184 		{
185 			this.context = context;
186 			fireTableDataChanged();
187 		}
188 
189 		@Override
190 		public String getColumnName(int column)
191 		{
192 			switch (column)
193 			{
194 			case 0:
195 				return "Item";
196 			case 1:
197 				return "Description";
198 			case 2:
199 				return "Value";
200 			case 3:
201 				return "Action";
202 			}
203 
204 			return super.getColumnName(column);
205 		}
206 
207 		@Override
208 		public Class<?> getColumnClass(int arg0)
209 		{
210 			if (arg0 == 3)
211 				return JComboBox.class;
212 			else
213 				return String.class;
214 		}
215 
216 		public int getRowCount()
217 		{
218 			return context.getPathsToResolve().size();
219 		}
220 
221 		@Override
222 		public boolean isCellEditable(int rowIndex, int columnIndex)
223 		{
224 			return columnIndex == 3;
225 		}
226 
227 		@SuppressWarnings("unchecked")
228 		public Object getValueAt(int arg0, int arg1)
229 		{
230 			PathToResolve ptr = context.getPathsToResolve().get(arg0);
231 			switch (arg1)
232 			{
233 			case 0:
234 				return ptr.getOwner().getName();
235 			case 1:
236 				return ptr.getDescription();
237 			case 2:
238 				return ptr.getPath();
239 
240 			}
241 
242 			return null;
243 		}
244 
245 		public ResolveContext<?> getContext()
246 		{
247 			return context;
248 		}
249 
250 		public void setResolver(int pathIndex, Object resolveOrDefaultAction)
251 		{
252 			PathToResolve path = context.getPathsToResolve().get(pathIndex);
253 			if (resolveOrDefaultAction instanceof Resolver)
254 			{
255 				path.setResolver(resolveOrDefaultAction);
256 			}
257 
258 		}
259 	}
260 
261 	private class ResolverRenderer implements TableCellRenderer
262 	{
263 
264 		public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
265 				int row, int column)
266 		{
267 			return ((ResolveContextTableModel) table.getModel()).getResolversAndActions(row);
268 		}
269 	}
270 
271 	private class ResolverEditor extends AbstractCellEditor implements TableCellEditor
272 	{
273 		private JComboBox jbc = new JComboBox();
274 
275 		public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
276 		{
277 			jbc = ((ResolveContextTableModel) table.getModel()).getResolversAndActions(row);
278 			return jbc;
279 		}
280 
281 		public Object getCellEditorValue()
282 		{
283 			return null;
284 		}
285 
286 	}
287 
288 	private class PathCellRenderer extends DefaultTableCellRenderer
289 	{
290 		private Color greenColor = Color.GREEN.darker().darker();
291 		private Color redColor = Color.RED.darker().darker();
292 
293 		@Override
294 		public Component getTableCellRendererComponent(JTable arg0, Object arg1, boolean arg2, boolean arg3, int arg4,
295 				int arg5)
296 		{
297 			Component comp = super.getTableCellRendererComponent(arg0, arg1, arg2, arg3, arg4, arg5);
298 
299 			PathToResolve ptr = resolveContextTableModel.getContext().getPathsToResolve().get(arg4);
300 			boolean resolved = ptr.getResolver() != null && ptr.getResolver().isResolved();
301 
302 			if (resolved)
303 			{
304 				setForeground(greenColor);
305 				setText(ptr.getResolver().getResolvedPath());
306 			}
307 			else
308 			{
309 				setForeground(redColor);
310 			}
311 
312 			return comp;
313 		}
314 	}
315 
316 }