src/share/jaxws_classes/com/sun/xml/internal/ws/binding/BindingImpl.java

changeset 494
2fcd3ddb57a6
parent 368
0989ad8c0860
child 637
9c07ef4934dd
equal deleted inserted replaced
493:b549c5ea34ab 494:2fcd3ddb57a6
35 import com.sun.xml.internal.ws.api.pipe.Codec; 35 import com.sun.xml.internal.ws.api.pipe.Codec;
36 import com.sun.xml.internal.ws.client.HandlerConfiguration; 36 import com.sun.xml.internal.ws.client.HandlerConfiguration;
37 import com.sun.xml.internal.ws.developer.MemberSubmissionAddressingFeature; 37 import com.sun.xml.internal.ws.developer.MemberSubmissionAddressingFeature;
38 import com.sun.xml.internal.ws.developer.BindingTypeFeature; 38 import com.sun.xml.internal.ws.developer.BindingTypeFeature;
39 39
40 import javax.activation.CommandInfo;
41 import javax.activation.CommandMap;
42 import javax.activation.MailcapCommandMap;
40 import javax.xml.namespace.QName; 43 import javax.xml.namespace.QName;
41 import javax.xml.ws.Service; 44 import javax.xml.ws.Service;
42 import javax.xml.ws.WebServiceFeature; 45 import javax.xml.ws.WebServiceFeature;
43 import javax.xml.ws.soap.AddressingFeature; 46 import javax.xml.ws.soap.AddressingFeature;
44 import javax.xml.ws.handler.Handler; 47 import javax.xml.ws.handler.Handler;
149 else 152 else
150 addressingVersion = null; 153 addressingVersion = null;
151 return addressingVersion; 154 return addressingVersion;
152 } 155 }
153 156
154 public final
155 @NotNull 157 @NotNull
156 Codec createCodec() { 158 public final Codec createCodec() {
159
160 // initialization from here should cover most of cases;
161 // if not, it would be necessary to call
162 // BindingImpl.initializeJavaActivationHandlers()
163 // explicitly by programmer
164 initializeJavaActivationHandlers();
165
157 return bindingId.createEncoder(this); 166 return bindingId.createEncoder(this);
167 }
168
169 public static void initializeJavaActivationHandlers() {
170 // DataHandler.writeTo() may search for DCH. So adding some default ones.
171 try {
172 CommandMap map = CommandMap.getDefaultCommandMap();
173 if (map instanceof MailcapCommandMap) {
174 MailcapCommandMap mailMap = (MailcapCommandMap) map;
175
176 // registering our DCH since javamail's DCH doesn't handle
177 if (!cmdMapInitialized(mailMap)) {
178 mailMap.addMailcap("text/xml;;x-java-content-handler=com.sun.xml.internal.ws.encoding.XmlDataContentHandler");
179 mailMap.addMailcap("application/xml;;x-java-content-handler=com.sun.xml.internal.ws.encoding.XmlDataContentHandler");
180 mailMap.addMailcap("image/*;;x-java-content-handler=com.sun.xml.internal.ws.encoding.ImageDataContentHandler");
181 mailMap.addMailcap("text/plain;;x-java-content-handler=com.sun.xml.internal.ws.encoding.StringDataContentHandler");
182 }
183 }
184 } catch (Throwable t) {
185 // ignore the exception.
186 }
187 }
188
189 private static boolean cmdMapInitialized(MailcapCommandMap mailMap) {
190 CommandInfo[] commands = mailMap.getAllCommands("text/xml");
191 if (commands == null || commands.length == 0) {
192 return false;
193 }
194
195 // SAAJ RI implements it's own DataHandlers which can be used for JAX-WS too;
196 // see com.sun.xml.internal.messaging.saaj.soap.AttachmentPartImpl#initializeJavaActivationHandlers
197 // so if found any of SAAJ or our own handler registered, we are ok; anyway using SAAJ directly here
198 // is not good idea since we don't want standalone JAX-WS to depend on specific SAAJ impl.
199 // This is also reason for duplication of Handler's code by JAX-WS
200 String saajClassName = "com.sun.xml.internal.messaging.saaj.soap.XmlDataContentHandler";
201 String jaxwsClassName = "com.sun.xml.internal.ws.encoding.XmlDataContentHandler";
202 for (CommandInfo command : commands) {
203 String commandClass = command.getCommandClass();
204 if (saajClassName.equals(commandClass) ||
205 jaxwsClassName.equals(commandClass)) {
206 return true;
207 }
208 }
209 return false;
158 } 210 }
159 211
160 public static BindingImpl create(@NotNull BindingID bindingId) { 212 public static BindingImpl create(@NotNull BindingID bindingId) {
161 if (bindingId.equals(BindingID.XML_HTTP)) 213 if (bindingId.equals(BindingID.XML_HTTP))
162 return new HTTPBindingImpl(); 214 return new HTTPBindingImpl();

mercurial