View Javadoc

1   /*
2    *  soapui, copyright (C) 2005 Ole Matzura / eviware.com 
3    *
4    *  SoapUI is free software; you can redistribute it and/or modify it under the 
5    *  terms of the GNU Lesser General Public License as published by the Free Software Foundation; 
6    *  either version 2.1 of the License, or (at your option) any later version.
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.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"; //workspaceConfig.getSoapuiWorkspace().getName();
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 			// save projects first
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 }