KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > netbeans > modules > websvc > customization > core > ui > CustomizationWSEditor


1 /*
2  * The contents of this file are subject to the terms of the Common Development
3  * and Distribution License (the License). You may not use this file except in
4  * compliance with the License.
5  *
6  * You can obtain a copy of the License at http://www.netbeans.org/cddl.html
7  * or http://www.netbeans.org/cddl.txt.
8  *
9  * When distributing Covered Code, include this CDDL Header Notice in each file
10  * and include the License file at http://www.netbeans.org/cddl.txt.
11  * If applicable, add the following below the CDDL Header, with the fields
12  * enclosed by brackets [] replaced by your own identifying information:
13  * "Portions Copyrighted [year] [name of copyright owner]"
14  *
15  * The Original Software is NetBeans. The Initial Developer of the Original
16  * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
17  * Microsystems, Inc. All Rights Reserved.
18  */

19 /*
20  * CustomizationWSEditor.java
21  *
22  * Created on March 9, 2006, 4:20 PM
23  *
24  * To change this template, choose Tools | Template Manager
25  * and open the template in the editor.
26  */

27
28 package org.netbeans.modules.websvc.customization.core.ui;
29
30 import java.net.MalformedURLException JavaDoc;
31 import java.util.Collection JavaDoc;
32 import java.util.HashMap JavaDoc;
33 import java.util.HashSet JavaDoc;
34 import java.util.Map JavaDoc;
35 import java.util.Set JavaDoc;
36 import java.util.Stack JavaDoc;
37 import javax.swing.JComponent JavaDoc;
38 import javax.swing.event.UndoableEditEvent JavaDoc;
39 import javax.swing.event.UndoableEditListener JavaDoc;
40 import javax.swing.undo.UndoableEdit JavaDoc;
41 import org.netbeans.api.progress.ProgressHandle;
42 import org.netbeans.api.progress.ProgressHandleFactory;
43 import org.netbeans.modules.websvc.api.jaxws.client.JAXWSClientSupport;
44 import org.netbeans.modules.websvc.core.wseditor.spi.WSEditor;
45 import org.netbeans.modules.websvc.customization.multiview.WSCustomizationTopComponent;
46 import org.netbeans.modules.websvc.jaxws.api.JAXWSSupport;
47 import org.netbeans.modules.websvc.api.jaxws.project.config.Client;
48 import org.netbeans.modules.websvc.api.jaxws.project.config.JaxWsModel;
49 import org.netbeans.modules.websvc.api.jaxws.project.config.Service;
50 import org.netbeans.modules.websvc.customization.multiview.SaveableSectionInnerPanel;
51 import org.netbeans.modules.websvc.jaxws.api.JaxWsRefreshCookie;
52 import org.netbeans.modules.xml.retriever.catalog.Utilities;
53 import org.netbeans.modules.xml.wsdl.model.Definitions;
54 import org.netbeans.modules.xml.wsdl.model.Import;
55 import org.netbeans.modules.xml.wsdl.model.WSDLModel;
56 import org.netbeans.modules.xml.wsdl.model.WSDLModelFactory;
57 import org.netbeans.modules.xml.xam.ModelSource;
58 import org.netbeans.modules.xml.xam.locator.CatalogModelException;
59 import org.openide.ErrorManager;
60 import org.openide.cookies.SaveCookie;
61 import org.openide.filesystems.FileObject;
62 import org.openide.loaders.DataObject;
63 import org.openide.loaders.DataObjectNotFoundException;
64 import org.openide.nodes.Node;
65 import org.openide.util.NbBundle;
66 import org.openide.util.RequestProcessor;
67
68 /**
69  *
70  * @author Roderico Cruz
71  */

72 public class CustomizationWSEditor implements WSEditor{
73     private Stack JavaDoc<UndoableEdit JavaDoc> undoableEdits;
74     private WSCustomizationTopComponent wsTopComponent;
75     private boolean wsdlIsDirty;
76     private boolean jaxwsDirty;
77     private Definitions primaryDefinitions;
78     
79     /**
80      * Creates a new instance of CustomizationWSEditor
81      */

82     public CustomizationWSEditor() {
83     }
84     
85     private void saveAndRefresh(Node node, JaxWsModel jaxWsModel){
86         Collection JavaDoc<SaveableSectionInnerPanel> panels = wsTopComponent.getPanels();
87         for(SaveableSectionInnerPanel panel : panels){
88             panel.save();
89             if(!wsdlIsDirty){
90                 wsdlIsDirty = panel.wsdlIsDirty();
91             }
92             if(!jaxwsDirty){
93                 jaxwsDirty = panel.jaxwsIsDirty();
94             }
95         }
96         
97         try{
98             if(wsdlIsDirty){
99                 Set JavaDoc<WSDLModel> modelSet = wsdlModels.keySet();
100                 for(WSDLModel wsdlModel : modelSet){
101                     ModelSource ms = wsdlModel.getModelSource();
102                     FileObject fo = (FileObject)ms.getLookup().lookup(FileObject.class);
103                     DataObject wsdlDO = DataObject.find(fo);
104                     SaveCookie wsdlSaveCookie = (SaveCookie)wsdlDO.getCookie(SaveCookie.class);
105                     if(wsdlSaveCookie != null){
106                         wsdlSaveCookie.save();
107                     }
108                 }
109             }
110             if(jaxwsDirty){
111                 jaxWsModel.write();
112             }
113             if(wsdlIsDirty || jaxwsDirty){
114                 JaxWsRefreshCookie refreshCookie =
115                         (JaxWsRefreshCookie)node.getCookie(JaxWsRefreshCookie.class);
116                 refreshCookie.refreshService(false);
117             }
118         }catch(Exception JavaDoc e){
119             ErrorManager.getDefault().notify(e);
120         }
121     }
122     
123     public void save( final Node node, final JaxWsModel jaxWsModel) {
124         final ProgressHandle handle = ProgressHandleFactory.createHandle
125                 ( NbBundle.getMessage(CustomizationWSEditor.class, "TXT_Refreshing")); //NOI18N
126
handle.start(100);
127         handle.switchToIndeterminate();
128         Runnable JavaDoc r = new Runnable JavaDoc(){
129             public void run(){
130                 try{
131                     saveAndRefresh(node, jaxWsModel);
132                 }finally{
133                     handle.finish();
134                 }
135             }
136         };
137         RequestProcessor.getDefault().post(r);
138     }
139     
140     
141     public JComponent JavaDoc createWSEditorComponent(Node node, JaxWsModel jaxWsModel) {
142         
143         try{
144             initializeModels(node);
145         }catch(Exception JavaDoc e){
146             ErrorManager.getDefault().notify(e);
147             return null;
148         }
149         
150         wsTopComponent = new WSCustomizationTopComponent(node, getWSDLModels(), primaryDefinitions,
151                 jaxWsModel);
152         return wsTopComponent;
153     }
154     
155     public String JavaDoc getTitle() {
156         return NbBundle.getMessage(CustomizationWSEditor.class, "TITLE_WSDL_CUSTOMIZATION");
157     }
158     
159     public Set JavaDoc<WSDLModel> getWSDLModels(){
160         return wsdlModels.keySet();
161     }
162     
163     private Map JavaDoc<WSDLModel, Boolean JavaDoc> wsdlModels = new HashMap JavaDoc<WSDLModel, Boolean JavaDoc>();
164     
165     private void initializeModels(Node node) throws Exception JavaDoc {
166         if(wsdlModels.isEmpty()){
167             WSUndoableEditListener listener = new WSUndoableEditListener();
168             WSDLModel primaryModel = getPrimaryModel(node);
169             populateAllModels(primaryModel);
170             Set JavaDoc<WSDLModel> modelSet = wsdlModels.keySet();
171             for(WSDLModel wsdlModel: modelSet){
172                 wsdlModel.addUndoableEditListener(listener);
173             }
174         }
175     }
176     
177     private DataObject getDataObjectOfModel(WSDLModel wsdlModel){
178         ModelSource ms = wsdlModel.getModelSource();
179         return (DataObject)ms.getLookup().lookup(DataObject.class);
180     }
181     
182     private boolean modelExists(final WSDLModel wsdlModel){
183         if(wsdlModels.size() == 0) return false;
184         DataObject modelDobj = getDataObjectOfModel(wsdlModel);
185         if(!modelDobj.isValid()) return true;
186         Set JavaDoc<WSDLModel> wsdls = wsdlModels.keySet();
187         for(WSDLModel wsdl : wsdls){
188             DataObject dobj = getDataObjectOfModel(wsdl);
189             if(!dobj.isValid()) continue;
190             if(modelDobj.equals(dobj)){
191                 return true;
192             }
193         }
194         return false;
195     }
196     
197     private void populateAllModels(WSDLModel wsdlModel)throws Exception JavaDoc{
198         if(modelExists(wsdlModel)) return;
199         DataObject dobj = getDataObjectOfModel(wsdlModel);
200         if(!dobj.isValid()) return;
201         Definitions definitions = wsdlModel.getDefinitions();
202         if(definitions.getImports().size() == 0){
203             wsdlModels.put(wsdlModel, Boolean.valueOf(dobj.isModified()));
204             return;
205         }else{
206             wsdlModels.put(wsdlModel, Boolean.valueOf(dobj.isModified()));
207             Set JavaDoc<WSDLModel> modelSet = getImportedModels(definitions);
208             for(WSDLModel wModel: modelSet){
209                 populateAllModels(wModel);
210             }
211         }
212     }
213     
214     private Set JavaDoc<WSDLModel> getImportedModels(Definitions definitions) throws CatalogModelException{
215         Set JavaDoc<WSDLModel> importedModels = new HashSet JavaDoc<WSDLModel>();
216         Collection JavaDoc<Import> importedWsdls = definitions.getImports();
217         for(Import importedWsdl : importedWsdls){
218             WSDLModel wsdlModel = importedWsdl.getImportedWSDLModel();
219             importedModels.add(wsdlModel);
220         }
221         return importedModels;
222     }
223     
224     private WSDLModel getPrimaryModel(Node node)
225     throws MalformedURLException JavaDoc, Exception JavaDoc{
226         undoableEdits = new Stack JavaDoc<UndoableEdit JavaDoc>();//new HashSet<UndoableEdit>();
227
WSDLModel model = null;
228         //is it a client node?
229
Client client = (Client)node.getLookup().lookup(Client.class);
230         //is it a service node?
231
Service service = (Service)node.getLookup().lookup(Service.class);
232         FileObject srcRoot = (FileObject)node.getLookup().lookup(FileObject.class);
233         assert srcRoot != null;
234         FileObject wsdlFO = null;
235         if(client != null){ //its a client
236
JAXWSClientSupport support = JAXWSClientSupport.getJaxWsClientSupport(srcRoot);
237             wsdlFO =
238                     support.getLocalWsdlFolderForClient(client.getName(),false).getFileObject(client.getLocalWsdlFile());
239         } else if (service != null && service.getWsdlUrl()!=null){ //its a service from wsdl
240
JAXWSSupport support = JAXWSSupport.getJAXWSSupport(srcRoot);
241             wsdlFO =
242                     support.getLocalWsdlFolderForService(service.getName(),false).getFileObject(service.getLocalWsdlFile());
243         } else{ //neither a client nor a service, get out of here
244
throw new Exception JavaDoc("Unable to identify node type");
245         }
246         
247         if(wsdlFO!=null){ //found the wsdl
248
ModelSource ms = Utilities.getModelSource(wsdlFO, true);
249             model = WSDLModelFactory.getDefault().getModel(ms);
250         } else{ //wsdl not found, throw an exception
251
throw new Exception JavaDoc("WSDL file not found");
252         }
253         primaryDefinitions = model.getDefinitions();
254         return model;
255     }
256     
257     class WSUndoableEditListener implements UndoableEditListener JavaDoc{
258         public void undoableEditHappened(UndoableEditEvent JavaDoc e) {
259             undoableEdits.push(e.getEdit());
260         }
261     }
262     
263     public void cancel(Node node, JaxWsModel jaxWsModel) {
264         while(!undoableEdits.empty()){
265             UndoableEdit JavaDoc ue = undoableEdits.pop();
266             ue.undo();
267         }
268         
269         try{
270             Set JavaDoc<WSDLModel>modelSet = wsdlModels.keySet();
271             for(WSDLModel wsdlModel : modelSet){
272                 ModelSource ms = wsdlModel.getModelSource();
273                 FileObject fo = (FileObject)ms.getLookup().lookup(FileObject.class);
274                 DataObject wsdlDobj = DataObject.find(fo);
275                 wsdlDobj.setModified(wsdlModels.get(wsdlModel));
276             }
277         }catch(DataObjectNotFoundException e){
278             ErrorManager.getDefault().notify(e);
279         }
280     }
281 }
282
Popular Tags