1 19 27 28 package org.netbeans.modules.websvc.customization.core.ui; 29 30 import java.net.MalformedURLException ; 31 import java.util.Collection ; 32 import java.util.HashMap ; 33 import java.util.HashSet ; 34 import java.util.Map ; 35 import java.util.Set ; 36 import java.util.Stack ; 37 import javax.swing.JComponent ; 38 import javax.swing.event.UndoableEditEvent ; 39 import javax.swing.event.UndoableEditListener ; 40 import javax.swing.undo.UndoableEdit ; 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 72 public class CustomizationWSEditor implements WSEditor{ 73 private Stack <UndoableEdit > undoableEdits; 74 private WSCustomizationTopComponent wsTopComponent; 75 private boolean wsdlIsDirty; 76 private boolean jaxwsDirty; 77 private Definitions primaryDefinitions; 78 79 82 public CustomizationWSEditor() { 83 } 84 85 private void saveAndRefresh(Node node, JaxWsModel jaxWsModel){ 86 Collection <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 <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 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")); handle.start(100); 127 handle.switchToIndeterminate(); 128 Runnable r = new Runnable (){ 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 createWSEditorComponent(Node node, JaxWsModel jaxWsModel) { 142 143 try{ 144 initializeModels(node); 145 }catch(Exception 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 getTitle() { 156 return NbBundle.getMessage(CustomizationWSEditor.class, "TITLE_WSDL_CUSTOMIZATION"); 157 } 158 159 public Set <WSDLModel> getWSDLModels(){ 160 return wsdlModels.keySet(); 161 } 162 163 private Map <WSDLModel, Boolean > wsdlModels = new HashMap <WSDLModel, Boolean >(); 164 165 private void initializeModels(Node node) throws Exception { 166 if(wsdlModels.isEmpty()){ 167 WSUndoableEditListener listener = new WSUndoableEditListener(); 168 WSDLModel primaryModel = getPrimaryModel(node); 169 populateAllModels(primaryModel); 170 Set <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 <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 { 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 <WSDLModel> modelSet = getImportedModels(definitions); 208 for(WSDLModel wModel: modelSet){ 209 populateAllModels(wModel); 210 } 211 } 212 } 213 214 private Set <WSDLModel> getImportedModels(Definitions definitions) throws CatalogModelException{ 215 Set <WSDLModel> importedModels = new HashSet <WSDLModel>(); 216 Collection <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 , Exception { 226 undoableEdits = new Stack <UndoableEdit >(); WSDLModel model = null; 228 Client client = (Client)node.getLookup().lookup(Client.class); 230 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){ JAXWSClientSupport support = JAXWSClientSupport.getJaxWsClientSupport(srcRoot); 237 wsdlFO = 238 support.getLocalWsdlFolderForClient(client.getName(),false).getFileObject(client.getLocalWsdlFile()); 239 } else if (service != null && service.getWsdlUrl()!=null){ JAXWSSupport support = JAXWSSupport.getJAXWSSupport(srcRoot); 241 wsdlFO = 242 support.getLocalWsdlFolderForService(service.getName(),false).getFileObject(service.getLocalWsdlFile()); 243 } else{ throw new Exception ("Unable to identify node type"); 245 } 246 247 if(wsdlFO!=null){ ModelSource ms = Utilities.getModelSource(wsdlFO, true); 249 model = WSDLModelFactory.getDefault().getModel(ms); 250 } else{ throw new Exception ("WSDL file not found"); 252 } 253 primaryDefinitions = model.getDefinitions(); 254 return model; 255 } 256 257 class WSUndoableEditListener implements UndoableEditListener { 258 public void undoableEditHappened(UndoableEditEvent e) { 259 undoableEdits.push(e.getEdit()); 260 } 261 } 262 263 public void cancel(Node node, JaxWsModel jaxWsModel) { 264 while(!undoableEdits.empty()){ 265 UndoableEdit ue = undoableEdits.pop(); 266 ue.undo(); 267 } 268 269 try{ 270 Set <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 |