1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.impl;
14
15 import java.io.File;
16 import java.io.IOException;
17 import java.util.ArrayList;
18 import java.util.HashSet;
19 import java.util.Iterator;
20 import java.util.List;
21 import java.util.Set;
22
23 import javax.swing.ImageIcon;
24 import javax.swing.JFileChooser;
25 import javax.swing.JOptionPane;
26
27 import org.apache.log4j.Logger;
28 import org.apache.xmlbeans.XmlException;
29
30 import com.eviware.soapui.SoapUI;
31 import com.eviware.soapui.config.SoapuiWorkspaceDocumentConfig;
32 import com.eviware.soapui.impl.actions.ImportWsdlProjectAction;
33 import com.eviware.soapui.impl.actions.NewWsdlProjectAction;
34 import com.eviware.soapui.impl.wsdl.WsdlProject;
35 import com.eviware.soapui.model.project.Project;
36 import com.eviware.soapui.model.support.AbstractModelItem;
37 import com.eviware.soapui.model.tree.SoapUITreeNode;
38 import com.eviware.soapui.model.tree.nodes.WorkspaceTreeNode;
39 import com.eviware.soapui.model.workspace.Workspace;
40 import com.eviware.soapui.model.workspace.WorkspaceListener;
41 import com.eviware.soapui.support.ExtensionFileFilter;
42
43 /***
44 * Default Workspace implementation
45 *
46 * @author Ole.Matzura
47 */
48
49 public class WorkspaceImpl extends AbstractModelItem implements Workspace
50 {
51 private final static Logger log = Logger.getLogger( WorkspaceImpl.class );
52
53 private List<Project> projectList = new ArrayList<Project>();
54
55 private SoapuiWorkspaceDocumentConfig workspaceConfig;
56
57 private String path = null;
58
59 private Set<WorkspaceListener> listeners = new HashSet<WorkspaceListener>();
60
61 private JFileChooser chooser;
62
63 private ImageIcon workspaceIcon;
64
65 public WorkspaceImpl(String path) throws XmlException, IOException
66 {
67 this.path = path;
68
69 File file = new File(path);
70 if (file.exists())
71 {
72 log.info( "Loading workspace from [" + file.getAbsolutePath() + "]" );
73 workspaceConfig = SoapuiWorkspaceDocumentConfig.Factory.parse(file);
74
75 String[] projects = workspaceConfig.getSoapuiWorkspace().getProjectArray();
76 for (int i = 0; i < projects.length; i++)
77 {
78 String str = projects[i];
79 if( new File( str ).exists() )
80 {
81 try
82 {
83 WsdlProject project = new WsdlProject(str);
84 projectList.add(project);
85 }
86 catch( Exception e )
87 {
88 JOptionPane.showMessageDialog( SoapUI.getInstance().getFrame(),
89 "Failed to load project [" + str + "]\nfrom workspace; " + e.getMessage(),
90 "Load Workspace", JOptionPane.ERROR_MESSAGE );
91 }
92 }
93 else
94 {
95 JOptionPane.showMessageDialog( SoapUI.getInstance().getFrame(), "project [" + str +
96 "]\nnot found, removing from workspace",
97 "Load Workspace", JOptionPane.ERROR_MESSAGE );
98 }
99 }
100 }
101 else
102 {
103 workspaceConfig = SoapuiWorkspaceDocumentConfig.Factory.newInstance();
104 workspaceConfig.addNewSoapuiWorkspace().setName("Default Workspace");
105 }
106
107 initActions();
108
109 workspaceIcon = SoapUI.createImageIcon("/workspace.gif");
110 }
111
112 public JFileChooser getChooser()
113 {
114 if( chooser == null )
115 {
116 chooser = new JFileChooser();
117 chooser.setDialogTitle( "Create New Project");
118 chooser.setAcceptAllFileFilterUsed( true );
119 chooser.setFileFilter( new ExtensionFileFilter( ".xml", "XML Files (*.xml)"));
120 }
121 return chooser;
122 }
123
124 public void setPath(String path)
125 {
126 this.path = path;
127 }
128
129 public Project[] getProjects()
130 {
131 return projectList.toArray(new Project[projectList.size()]);
132 }
133
134 public void setName(String name)
135 {
136 workspaceConfig.getSoapuiWorkspace().setName(name);
137 }
138
139 public String getName()
140 {
141 return "Projects";
142 }
143
144 public Project getProjectAt(int index)
145 {
146 return projectList.get(index);
147 }
148
149 public int getProjectCount()
150 {
151 return projectList.size();
152 }
153
154 public void onClose()
155 {
156 save();
157 }
158
159 public void save()
160 {
161 try
162 {
163 List<String> paths = new ArrayList<String>();
164
165
166 for (int c = 0; c < getProjectCount(); c++)
167 {
168 WsdlProject project = (WsdlProject) getProjectAt(c);
169 String path = project.save();
170 if (path != null)
171 paths.add(path);
172 }
173
174 if (path == null)
175 {
176 JFileChooser chooser = getChooser();
177 chooser.setDialogTitle("Save workspace");
178 chooser.setAcceptAllFileFilterUsed( true );
179 chooser.setFileFilter( new ExtensionFileFilter( ".xml", "XML Files (*.xml)"));
180 if (chooser.showSaveDialog(SoapUI.getInstance().getFrame()) != JFileChooser.APPROVE_OPTION)
181 return;
182
183 path = chooser.getSelectedFile().getAbsolutePath();
184 }
185
186 workspaceConfig.getSoapuiWorkspace().setProjectArray(
187 paths.toArray(new String[paths.size()]));
188 File workspaceFile = new File(path);
189 workspaceConfig.save(workspaceFile);
190
191 log.info( "Saved workspace to [" + workspaceFile.getAbsolutePath() + "]" );
192 }
193 catch (Exception e)
194 {
195 log.error( "Failed to save workspace: " + e.getMessage(), e );
196 }
197 }
198
199 private void initActions()
200 {
201 addAction( new NewWsdlProjectAction( this ) );
202 addAction( new ImportWsdlProjectAction( this ) );
203 }
204
205 public void addWorkspaceListener(WorkspaceListener listener)
206 {
207 listeners.add(listener);
208 }
209
210 public void removeWorkspaceListener(WorkspaceListener listener)
211 {
212 listeners.remove(listener);
213 }
214
215 public void importProject(String fileName)
216 {
217 File projectFile = new File( fileName );
218
219 try
220 {
221 WsdlProject project = new WsdlProject( projectFile.getAbsolutePath() );
222 projectList.add(project);
223
224 for (Iterator<WorkspaceListener> iter = listeners.iterator(); iter.hasNext();)
225 {
226 WorkspaceListener listener = iter.next();
227 listener.projectAdded(project);
228 }
229
230 save();
231 }
232 catch (Exception e)
233 {
234 e.printStackTrace();
235 }
236 }
237
238 public void createProject(String name)
239 {
240 JFileChooser chooser = getChooser();
241 chooser.setDialogTitle("Create Project");
242 chooser.setAcceptAllFileFilterUsed( true );
243 chooser.setFileFilter( new ExtensionFileFilter( ".xml", "XML Files (*.xml)"));
244 File projectFile = new File( createProjectFileName( name ));
245
246 chooser.setSelectedFile( projectFile);
247
248 if (chooser.showSaveDialog(SoapUI.getInstance().getFrame()) != JFileChooser.APPROVE_OPTION)
249 return;
250
251 projectFile = chooser.getSelectedFile();
252 while( projectFile.exists())
253 {
254 int result = JOptionPane.NO_OPTION;
255 while( result == JOptionPane.NO_OPTION )
256 {
257 result = JOptionPane.showConfirmDialog(SoapUI.getInstance().getFrame(), "File exists, overwrite?",
258 "Overwrite project?", JOptionPane.YES_NO_CANCEL_OPTION );
259 if( result == JOptionPane.CANCEL_OPTION ) return;
260 if( result == JOptionPane.YES_OPTION )
261 {
262 projectFile.delete();
263 }
264 else
265 {
266 if (chooser.showSaveDialog(SoapUI.getInstance().getFrame()) != JFileChooser.APPROVE_OPTION)
267 return;
268
269 projectFile = chooser.getSelectedFile();
270 }
271 }
272 }
273
274 try
275 {
276 WsdlProject project = new WsdlProject( projectFile.getAbsolutePath() );
277
278 project.setName(name);
279 projectList.add(project);
280
281 for (Iterator<WorkspaceListener> iter = listeners.iterator(); iter.hasNext();)
282 {
283 WorkspaceListener listener = iter.next();
284 listener.projectAdded(project);
285 }
286
287 save();
288 }
289 catch (Exception e)
290 {
291 e.printStackTrace();
292 }
293 }
294
295 private String createProjectFileName(String name)
296 {
297 StringBuffer result = new StringBuffer();
298 for( int c = 0; c < name.length(); c++ )
299 {
300 char ch = name.charAt( c );
301 if( Character.isLetterOrDigit( ch ))
302 {
303 result.append( ch );
304 }
305 }
306
307 result.append( "-soapui-project.xml" );
308 return result.toString();
309 }
310
311
312
313 public void removeProject(Project project)
314 {
315 int ix = projectList.indexOf( project );
316 if( ix == -1 )
317 throw new RuntimeException( "Project [" + project.getName() + "] not available in workspace for removal" );
318
319 WorkspaceListener[] listenerArray = listeners.toArray( new WorkspaceListener[listeners.size()] );
320 for( int c = 0; c < listenerArray.length; c++ )
321 {
322 listenerArray[c].projectRemoved(project);
323 }
324
325 projectList.remove( ix );
326 workspaceConfig.getSoapuiWorkspace().removeProject( ix );
327 }
328
329 public ImageIcon getIcon()
330 {
331 return workspaceIcon;
332 }
333
334 protected SoapUITreeNode createTreeNode()
335 {
336 return new WorkspaceTreeNode( this );
337 }
338 }