1 19 package org.netbeans.modules.websvc.core.jaxws.nodes; 20 21 import java.awt.event.ActionEvent ; 22 import java.awt.event.ActionListener ; 23 import java.io.BufferedReader ; 24 import java.io.BufferedWriter ; 25 import java.io.File ; 26 import java.io.IOException ; 27 import java.io.InputStream ; 28 import java.io.InputStreamReader ; 29 import java.io.OutputStream ; 30 import java.io.OutputStreamWriter ; 31 import java.net.URI ; 32 import java.util.Collection ; 33 import javax.swing.DefaultListModel ; 34 import javax.swing.ListModel ; 35 import org.netbeans.modules.websvc.api.jaxws.client.JAXWSClientSupport; 36 import org.netbeans.modules.websvc.core.jaxws.bindings.model.BindingsComponentFactory; 37 import org.netbeans.modules.websvc.core.jaxws.bindings.model.BindingsHandler; 38 import org.netbeans.modules.websvc.core.jaxws.bindings.model.BindingsHandlerChain; 39 import org.netbeans.modules.websvc.core.jaxws.bindings.model.BindingsHandlerChains; 40 import org.netbeans.modules.websvc.core.jaxws.bindings.model.BindingsHandlerClass; 41 import org.netbeans.modules.websvc.core.jaxws.bindings.model.BindingsModel; 42 import org.netbeans.modules.websvc.core.jaxws.bindings.model.BindingsModelFactory; 43 import org.netbeans.modules.websvc.core.jaxws.bindings.model.DefinitionsBindings; 44 import org.netbeans.modules.websvc.core.jaxws.bindings.model.GlobalBindings; 45 import org.netbeans.modules.websvc.core.webservices.ui.panels.MessageHandlerPanel; 46 import org.netbeans.modules.websvc.api.jaxws.project.config.Binding; 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.xml.xam.ModelSource; 50 import org.netbeans.modules.xml.retriever.catalog.Utilities; 51 import org.openide.ErrorManager; 52 import org.openide.NotifyDescriptor; 53 import org.openide.cookies.SaveCookie; 54 import org.openide.filesystems.FileLock; 55 import org.openide.filesystems.FileObject; 56 import org.openide.filesystems.FileSystem; 57 import org.openide.filesystems.FileUtil; 58 import org.openide.filesystems.Repository; 59 import org.openide.loaders.DataObject; 60 import org.openide.nodes.Node; 61 62 66 public class ClientHandlerButtonListener implements ActionListener { 67 private MessageHandlerPanel panel; 68 private BindingsModel bindingsModel; 69 private Client client; 70 private Node node; 71 private JaxWsModel jaxWsModel; 72 private FileObject bindingHandlerFO; 73 private String wsdlRelativePath; 74 private String bindingsHandlerFile; 75 76 77 public ClientHandlerButtonListener(MessageHandlerPanel panel, 78 BindingsModel bindingsModel, Client client, Node node, JaxWsModel jaxWsModel){ 79 80 this.panel = panel; 81 this.bindingsModel = bindingsModel; 82 this.client = client; 83 this.node = node; 84 this.jaxWsModel = jaxWsModel; 85 } 86 public void actionPerformed(ActionEvent evt) { 87 if(evt.getSource() == NotifyDescriptor.OK_OPTION) { 88 try{ 89 FileObject srcRoot = (FileObject)node.getLookup().lookup(FileObject.class); 90 JAXWSClientSupport support = JAXWSClientSupport.getJaxWsClientSupport(srcRoot); 91 final FileObject bindingsFolder = support.getBindingsFolderForClient(node.getName(), true); 92 Client client = (Client)node.getLookup().lookup(Client.class); 93 assert client != null; 94 bindingsHandlerFile = client.getHandlerBindingFile(); 95 if(bindingsHandlerFile == null){ 96 String baseBindingsHandlerFile = node.getName() + "_handler"; 97 bindingsHandlerFile = FileUtil.findFreeFileName(bindingsFolder, baseBindingsHandlerFile, "xml") + 98 ".xml"; 99 client.setHandlerBindingFile(bindingsHandlerFile); 100 } 101 102 if(bindingsModel == null){ 104 final String bindingsContent = readResource(Repository.getDefault().getDefaultFileSystem(). 105 findResource("jax-ws/default-binding-handler.xml").getInputStream()); 107 bindingsFolder.getFileSystem().runAtomicAction(new FileSystem.AtomicAction() { 108 public void run() throws IOException { 109 bindingHandlerFO = 110 FileUtil.createData(bindingsFolder, bindingsHandlerFile); BufferedWriter bw = null; 112 OutputStream os = null; 113 OutputStreamWriter osw = null; 114 FileLock lock = bindingHandlerFO.lock(); 115 try { 116 os = bindingHandlerFO.getOutputStream(lock); 117 osw = new OutputStreamWriter (os); 118 bw = new BufferedWriter (osw); 119 bw.write(bindingsContent); 120 } finally { 121 try{ 122 if(bw != null){ 123 bw.close(); 124 } 125 if(os != null) { 126 os.close(); 127 } 128 if(osw != null){ 129 osw.close(); 130 } 131 }catch(IOException e){ 132 ErrorManager.getDefault().notify(e); 133 } 134 135 if(lock != null){ 136 lock.releaseLock(); 137 } 138 } 139 } 140 }); 141 142 ModelSource ms = Utilities.getModelSource(bindingHandlerFO, true); 144 bindingsModel = BindingsModelFactory.getDefault().getModel(ms); 145 FileObject localWsdlFile = 147 support.getLocalWsdlFolderForClient(client.getName(),false).getFileObject(client.getLocalWsdlFile()); 148 File f = FileUtil.toFile(bindingHandlerFO); 149 String relativePath = Utilities.relativize(f.toURI(), new URI (localWsdlFile.getURL().toExternalForm())); 150 GlobalBindings gb = bindingsModel.getGlobalBindings(); 151 bindingsModel.startTransaction(); 152 gb.setWsdlLocation(relativePath); 153 bindingsModel.endTransaction(); 154 155 } 157 DefaultListModel listModel = panel.getListModel(); 159 GlobalBindings gb = bindingsModel.getGlobalBindings(); 160 DefinitionsBindings db = gb.getDefinitionsBindings(); 161 BindingsHandlerChains bhc = db.getHandlerChains(); 162 BindingsHandlerChain chain = bhc.getHandlerChains().iterator().next(); 163 164 BindingsComponentFactory factory = bindingsModel.getFactory(); 166 if(listModel.getSize() > 0){ 167 bindingsModel.startTransaction(); 168 for(int i = 0; i < listModel.getSize(); i++){ 169 String className = (String )listModel.getElementAt(i); 170 if(isNewHandler(className, chain)){ 171 BindingsHandler handler = factory.createHandler(); 172 BindingsHandlerClass handlerClass = factory.createHandlerClass(); 173 handlerClass.setClassName(className); 174 handler.setHandlerClass(handlerClass); 175 chain.addHandler(handler); 176 } 177 } 178 bindingsModel.endTransaction(); 179 } 180 181 if(bindingHandlerFO == null){ 183 bindingHandlerFO = bindingsFolder.getFileObject(client.getHandlerBindingFile()); 184 } 185 186 Collection <BindingsHandler> handlers = chain.getHandlers(); 188 bindingsModel.startTransaction(); 189 for(BindingsHandler handler : handlers){ 190 String clsName = handler.getHandlerClass().getClassName(); 191 if(!isInModel(clsName, listModel)){ 192 chain.removeHandler(handler); 193 } 194 } 195 bindingsModel.endTransaction(); 196 197 DataObject dobj = DataObject.find(bindingHandlerFO); 199 if(dobj.isModified()){ 200 SaveCookie saveCookie = (SaveCookie)dobj.getCookie(SaveCookie.class); 201 saveCookie.save(); 202 } 203 204 if(listModel.getSize() > 0){ 205 Binding binding = client.getBindingByFileName(bindingsHandlerFile); 206 if(binding == null){ 207 binding = client.newBinding(); 208 binding.setFileName(bindingsHandlerFile); 209 client.addBinding(binding); 210 } 211 } else{ 212 Binding binding = client.getBindingByFileName(bindingsHandlerFile); 213 if(binding != null){ 214 client.removeBinding(binding); 215 } 216 } 217 jaxWsModel.write(); 219 }catch(Exception e){ 220 ErrorManager.getDefault().notify(e); 221 } 222 } 223 } 224 225 private boolean isInModel(String className, ListModel model){ 226 for(int i = 0; i < model.getSize(); i++){ 227 String cls = (String )model.getElementAt(i); 228 if(className.equals(cls)){ 229 return true; 230 } 231 } 232 return false; 233 } 234 235 private boolean isNewHandler(String className, BindingsHandlerChain handlerChain){ 236 if(handlerChain != null){ 237 Collection <BindingsHandler> handlers = handlerChain.getHandlers(); 238 for(BindingsHandler handler : handlers){ 239 if (handler.getHandlerClass().getClassName().equals(className)){ 240 return false; 241 } 242 } 243 } 244 return true; 245 } 246 247 248 private static String readResource(InputStream is) throws IOException { 250 BufferedReader br= null; 252 StringBuilder sb = new StringBuilder (); 253 try{ 254 255 String lineSep = System.getProperty("line.separator"); br = new BufferedReader (new InputStreamReader (is)); 257 String line = br.readLine(); 258 while (line != null) { 259 sb.append(line); 260 sb.append(lineSep); 261 line = br.readLine(); 262 } 263 }finally{ 264 br.close(); 265 } 266 return sb.toString(); 267 } 268 269 } 270 | Popular Tags |