src/share/jaxws_classes/com/sun/xml/internal/ws/server/WSEndpointImpl.java

changeset 368
0989ad8c0860
parent 286
f50545b5e2f1
child 408
b0610cd08440
equal deleted inserted replaced
366:8c0b6bccfe47 368:0989ad8c0860
1 /* 1 /*
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this 7 * published by the Free Software Foundation. Oracle designates this
30 import com.sun.xml.internal.stream.buffer.XMLStreamBuffer; 30 import com.sun.xml.internal.stream.buffer.XMLStreamBuffer;
31 import com.sun.xml.internal.ws.addressing.EPRSDDocumentFilter; 31 import com.sun.xml.internal.ws.addressing.EPRSDDocumentFilter;
32 import com.sun.xml.internal.ws.addressing.WSEPRExtension; 32 import com.sun.xml.internal.ws.addressing.WSEPRExtension;
33 import com.sun.xml.internal.ws.api.Component; 33 import com.sun.xml.internal.ws.api.Component;
34 import com.sun.xml.internal.ws.api.ComponentFeature; 34 import com.sun.xml.internal.ws.api.ComponentFeature;
35 import com.sun.xml.internal.ws.api.ComponentsFeature;
35 import com.sun.xml.internal.ws.api.SOAPVersion; 36 import com.sun.xml.internal.ws.api.SOAPVersion;
36 import com.sun.xml.internal.ws.api.WSBinding; 37 import com.sun.xml.internal.ws.api.WSBinding;
37 import com.sun.xml.internal.ws.api.addressing.AddressingVersion; 38 import com.sun.xml.internal.ws.api.addressing.AddressingVersion;
38 import com.sun.xml.internal.ws.api.addressing.WSEndpointReference; 39 import com.sun.xml.internal.ws.api.addressing.WSEndpointReference;
39 import com.sun.xml.internal.ws.api.message.Message; 40 import com.sun.xml.internal.ws.api.message.Message;
40 import com.sun.xml.internal.ws.api.message.Packet; 41 import com.sun.xml.internal.ws.api.message.Packet;
41 import com.sun.xml.internal.ws.api.model.SEIModel; 42 import com.sun.xml.internal.ws.api.model.SEIModel;
42 import com.sun.xml.internal.ws.api.model.wsdl.WSDLPort; 43 import com.sun.xml.internal.ws.api.model.wsdl.WSDLPort;
43 import com.sun.xml.internal.ws.api.pipe.Codec; 44 import com.sun.xml.internal.ws.api.pipe.*;
44 import com.sun.xml.internal.ws.api.pipe.Engine; 45 import com.sun.xml.internal.ws.api.server.*;
45 import com.sun.xml.internal.ws.api.pipe.Fiber;
46 import com.sun.xml.internal.ws.api.pipe.FiberContextSwitchInterceptor;
47 import com.sun.xml.internal.ws.api.pipe.ServerPipeAssemblerContext;
48 import com.sun.xml.internal.ws.api.pipe.ServerTubeAssemblerContext;
49 import com.sun.xml.internal.ws.api.pipe.SyncStartForAsyncFeature;
50 import com.sun.xml.internal.ws.api.pipe.Tube;
51 import com.sun.xml.internal.ws.api.pipe.TubeCloner;
52 import com.sun.xml.internal.ws.api.pipe.TubelineAssembler;
53 import com.sun.xml.internal.ws.api.pipe.TubelineAssemblerFactory;
54 import com.sun.xml.internal.ws.api.server.Container;
55 import com.sun.xml.internal.ws.api.server.EndpointAwareCodec;
56 import com.sun.xml.internal.ws.api.server.EndpointComponent;
57 import com.sun.xml.internal.ws.api.server.EndpointReferenceExtensionContributor;
58 import com.sun.xml.internal.ws.api.server.LazyMOMProvider;
59 import com.sun.xml.internal.ws.api.server.TransportBackChannel;
60 import com.sun.xml.internal.ws.api.server.WSEndpoint;
61 import com.sun.xml.internal.ws.api.server.WebServiceContextDelegate;
62 import com.sun.xml.internal.ws.binding.BindingImpl; 46 import com.sun.xml.internal.ws.binding.BindingImpl;
63 import com.sun.xml.internal.ws.fault.SOAPFaultBuilder; 47 import com.sun.xml.internal.ws.fault.SOAPFaultBuilder;
64 import com.sun.xml.internal.ws.model.wsdl.WSDLDirectProperties; 48 import com.sun.xml.internal.ws.model.wsdl.WSDLDirectProperties;
65 import com.sun.xml.internal.ws.model.wsdl.WSDLPortImpl; 49 import com.sun.xml.internal.ws.model.wsdl.WSDLPortImpl;
66 import com.sun.xml.internal.ws.model.wsdl.WSDLPortProperties; 50 import com.sun.xml.internal.ws.model.wsdl.WSDLPortProperties;
79 import javax.xml.stream.XMLStreamException; 63 import javax.xml.stream.XMLStreamException;
80 import javax.xml.ws.EndpointReference; 64 import javax.xml.ws.EndpointReference;
81 import javax.xml.ws.WebServiceException; 65 import javax.xml.ws.WebServiceException;
82 import javax.xml.ws.handler.Handler; 66 import javax.xml.ws.handler.Handler;
83 import java.lang.reflect.Method; 67 import java.lang.reflect.Method;
84 import java.util.Arrays; 68 import java.util.*;
85 import java.util.Collection;
86 import java.util.HashMap;
87 import java.util.HashSet;
88 import java.util.Iterator;
89 import java.util.List;
90 import java.util.Map;
91 import java.util.Set;
92 import java.util.concurrent.CopyOnWriteArraySet; 69 import java.util.concurrent.CopyOnWriteArraySet;
93 import java.util.concurrent.Executor; 70 import java.util.concurrent.Executor;
94 import java.util.logging.Level; 71 import java.util.logging.Level;
95 import java.util.logging.Logger; 72 import java.util.logging.Logger;
73 import javax.management.ObjectName;
96 74
97 /** 75 /**
98 * {@link WSEndpoint} implementation. 76 * {@link WSEndpoint} implementation.
99 * 77 *
100 * @author Kohsuke Kawaguchi 78 * @author Kohsuke Kawaguchi
101 * @author Jitendra Kotamraju 79 * @author Jitendra Kotamraju
102 */ 80 */
103 public /*final*/ class WSEndpointImpl<T> extends WSEndpoint<T> implements LazyMOMProvider.WSEndpointScopeChangeListener { 81 public /*final*/ class WSEndpointImpl<T> extends WSEndpoint<T> implements LazyMOMProvider.WSEndpointScopeChangeListener {
104 private static final Logger LOGGER = Logger.getLogger(WSEndpointImpl.class.getName()); 82
83 private static final Logger logger = Logger.getLogger(com.sun.xml.internal.ws.util.Constants.LoggingDomain + ".server.endpoint");
105 84
106 private final @NotNull QName serviceName; 85 private final @NotNull QName serviceName;
107 private final @NotNull QName portName; 86 private final @NotNull QName portName;
108 protected final WSBinding binding; 87 protected final WSBinding binding;
109 private final SEIModel seiModel; 88 private final SEIModel seiModel;
110 private final @NotNull Container container; 89 private final @NotNull Container container;
111 private final WSDLPort port; 90 private final WSDLPort port;
112 91
113 protected final Tube masterTubeline; 92 protected final Tube masterTubeline;
114 private final ServiceDefinitionImpl serviceDef; 93 private final ServiceDefinitionImpl serviceDef;
115 private final SOAPVersion soapVersion; 94 private final SOAPVersion soapVersion;
116 private final Engine engine; 95 private final Engine engine;
117 private final @NotNull Codec masterCodec; 96 private final @NotNull Codec masterCodec;
118 private final @NotNull PolicyMap endpointPolicy; 97 private final @NotNull PolicyMap endpointPolicy;
119 private final Pool<Tube> tubePool; 98 private final Pool<Tube> tubePool;
120 private final OperationDispatcher operationDispatcher; 99 private final OperationDispatcher operationDispatcher;
121 private @NotNull ManagedObjectManager managedObjectManager; 100 private @NotNull ManagedObjectManager managedObjectManager;
122 private boolean managedObjectManagerClosed = false; 101 private boolean managedObjectManagerClosed = false;
123 private Object managedObjectManagerLock = new Object(); 102 private final Object managedObjectManagerLock = new Object();
124 private LazyMOMProvider.Scope lazyMOMProviderScope = LazyMOMProvider.Scope.STANDALONE; 103 private LazyMOMProvider.Scope lazyMOMProviderScope = LazyMOMProvider.Scope.STANDALONE;
125 private final @NotNull ServerTubeAssemblerContext context; 104 private final @NotNull ServerTubeAssemblerContext context;
126 105
127 private Map<QName, WSEndpointReference.EPRExtension> endpointReferenceExtensions = new HashMap<QName, WSEndpointReference.EPRExtension>(); 106 private Map<QName, WSEndpointReference.EPRExtension> endpointReferenceExtensions = new HashMap<QName, WSEndpointReference.EPRExtension>();
128 /** 107 /**
129 * Set to true once we start shutting down this endpoint. 108 * Set to true once we start shutting down this endpoint. Used to avoid
130 * Used to avoid running the clean up processing twice. 109 * running the clean up processing twice.
131 * 110 *
132 * @see #dispose() 111 * @see #dispose()
133 */ 112 */
134 private boolean disposed; 113 private boolean disposed;
135 114 private final Class<T> implementationClass;
136 private final Class<T> implementationClass; 115 private final @NotNull
137 private final @NotNull WSDLProperties wsdlProperties; 116 WSDLProperties wsdlProperties;
138 private final Set<Component> componentRegistry = new CopyOnWriteArraySet<Component>(); 117 private final Set<Component> componentRegistry = new CopyOnWriteArraySet<Component>();
139 118
140 protected WSEndpointImpl(@NotNull QName serviceName, @NotNull QName portName, WSBinding binding, 119 protected WSEndpointImpl(@NotNull QName serviceName, @NotNull QName portName, WSBinding binding,
141 Container container, SEIModel seiModel, WSDLPort port, 120 Container container, SEIModel seiModel, WSDLPort port,
142 Class<T> implementationClass, 121 Class<T> implementationClass,
143 @Nullable ServiceDefinitionImpl serviceDef, 122 @Nullable ServiceDefinitionImpl serviceDef,
155 this.endpointPolicy = endpointPolicy; 134 this.endpointPolicy = endpointPolicy;
156 135
157 LazyMOMProvider.INSTANCE.registerEndpoint(this); 136 LazyMOMProvider.INSTANCE.registerEndpoint(this);
158 initManagedObjectManager(); 137 initManagedObjectManager();
159 138
160 if (serviceDef != null) { 139 if (serviceDef != null) {
161 serviceDef.setOwner(this); 140 serviceDef.setOwner(this);
162 } 141 }
163 142
164 ComponentFeature cf = binding.getFeature(ComponentFeature.class); 143 ComponentFeature cf = binding.getFeature(ComponentFeature.class);
165 if (cf != null) { 144 if (cf != null) {
166 switch(cf.getTarget()) { 145 switch (cf.getTarget()) {
167 case ENDPOINT: 146 case ENDPOINT:
168 componentRegistry.add(cf.getComponent()); 147 componentRegistry.add(cf.getComponent());
169 break; 148 break;
170 case CONTAINER: 149 case CONTAINER:
171 container.getComponents().add(cf.getComponent()); 150 container.getComponents().add(cf.getComponent());
172 default: 151 break;
173 throw new IllegalArgumentException(); 152 default:
174 } 153 throw new IllegalArgumentException();
175 } 154 }
155 }
156 ComponentsFeature csf = binding.getFeature(ComponentsFeature.class);
157 if (csf != null) {
158 for (ComponentFeature cfi : csf.getComponentFeatures()) {
159 switch (cfi.getTarget()) {
160 case ENDPOINT:
161 componentRegistry.add(cfi.getComponent());
162 break;
163 case CONTAINER:
164 container.getComponents().add(cfi.getComponent());
165 break;
166 default:
167 throw new IllegalArgumentException();
168 }
169 }
170 }
176 171
177 TubelineAssembler assembler = TubelineAssemblerFactory.create( 172 TubelineAssembler assembler = TubelineAssemblerFactory.create(
178 Thread.currentThread().getContextClassLoader(), binding.getBindingId(), container); 173 Thread.currentThread().getContextClassLoader(), binding.getBindingId(), container);
179 assert assembler != null; 174 assert assembler != null;
180 175
181 this.operationDispatcher = (port == null) ? null : new OperationDispatcher(port, binding, seiModel); 176 this.operationDispatcher = (port == null) ? null : new OperationDispatcher(port, binding, seiModel);
182 177
183 context = createServerTubeAssemblerContext(terminalTube, isSynchronous); 178 context = createServerTubeAssemblerContext(terminalTube, isSynchronous);
184 this.masterTubeline = assembler.createServer(context); 179 this.masterTubeline = assembler.createServer(context);
185 180
186 Codec c = context.getCodec(); 181 Codec c = context.getCodec();
187 if (c instanceof EndpointAwareCodec) { 182 if (c instanceof EndpointAwareCodec) {
188 // create a copy to avoid sharing the codec between multiple endpoints 183 // create a copy to avoid sharing the codec between multiple endpoints
189 c = c.copy(); 184 c = c.copy();
190 ((EndpointAwareCodec) c).setEndpoint(this); 185 ((EndpointAwareCodec) c).setEndpoint(this);
191 } 186 }
192 this.masterCodec = c; 187 this.masterCodec = c;
193 188
194 tubePool = new TubePool(masterTubeline); 189 tubePool = new TubePool(masterTubeline);
195 terminalTube.setEndpoint(this); 190 terminalTube.setEndpoint(this);
196 engine = new Engine(toString()); 191 engine = new Engine(toString(), container);
197 wsdlProperties = (port == null) ? new WSDLDirectProperties(serviceName, portName, seiModel) : new WSDLPortProperties(port, seiModel); 192 wsdlProperties = (port == null) ? new WSDLDirectProperties(serviceName, portName, seiModel) : new WSDLPortProperties(port, seiModel);
198 193
199 Map<QName, WSEndpointReference.EPRExtension> eprExtensions = new HashMap<QName, WSEndpointReference.EPRExtension>(); 194 Map<QName, WSEndpointReference.EPRExtension> eprExtensions = new HashMap<QName, WSEndpointReference.EPRExtension>();
200 try { 195 try {
201 if (port != null) { 196 if (port != null) {
202 //gather EPR extrensions from WSDL Model 197 //gather EPR extrensions from WSDL Model
228 } 223 }
229 } 224 }
230 225
231 protected ServerTubeAssemblerContext createServerTubeAssemblerContext( 226 protected ServerTubeAssemblerContext createServerTubeAssemblerContext(
232 EndpointAwareTube terminalTube, boolean isSynchronous) { 227 EndpointAwareTube terminalTube, boolean isSynchronous) {
233 ServerTubeAssemblerContext context = new ServerPipeAssemblerContext( 228 ServerTubeAssemblerContext ctx = new ServerPipeAssemblerContext(
234 seiModel, port, this, terminalTube, isSynchronous); 229 seiModel, port, this, terminalTube, isSynchronous);
235 return context; 230 return ctx;
236 } 231 }
237 232
238 protected WSEndpointImpl(@NotNull QName serviceName, @NotNull QName portName, WSBinding binding, Container container, 233 protected WSEndpointImpl(@NotNull QName serviceName, @NotNull QName portName, WSBinding binding, Container container,
239 SEIModel seiModel, WSDLPort port, 234 SEIModel seiModel, WSDLPort port,
240 Tube masterTubeline) { 235 Tube masterTubeline) {
257 this.operationDispatcher = (port == null) ? null : new OperationDispatcher(port, binding, seiModel); 252 this.operationDispatcher = (port == null) ? null : new OperationDispatcher(port, binding, seiModel);
258 this.context = new ServerPipeAssemblerContext( 253 this.context = new ServerPipeAssemblerContext(
259 seiModel, port, this, null /* not known */, false); 254 seiModel, port, this, null /* not known */, false);
260 255
261 tubePool = new TubePool(masterTubeline); 256 tubePool = new TubePool(masterTubeline);
262 engine = new Engine(toString()); 257 engine = new Engine(toString(), container);
263 wsdlProperties = (port == null) ? new WSDLDirectProperties(serviceName, portName, seiModel) : new WSDLPortProperties(port, seiModel); 258 wsdlProperties = (port == null) ? new WSDLDirectProperties(serviceName, portName, seiModel) : new WSDLPortProperties(port, seiModel);
264 } 259 }
265 260
266 public Collection<WSEndpointReference.EPRExtension> getEndpointReferenceExtensions() { 261 public Collection<WSEndpointReference.EPRExtension> getEndpointReferenceExtensions() {
267 return endpointReferenceExtensions.values(); 262 return endpointReferenceExtensions.values();
311 306
312 public void schedule(final Packet request, final CompletionCallback callback, FiberContextSwitchInterceptor interceptor) { 307 public void schedule(final Packet request, final CompletionCallback callback, FiberContextSwitchInterceptor interceptor) {
313 processAsync(request, callback, interceptor, true); 308 processAsync(request, callback, interceptor, true);
314 } 309 }
315 310
316 private void processAsync(final Packet request, final CompletionCallback callback, FiberContextSwitchInterceptor interceptor, boolean schedule) { 311 private void processAsync(final Packet request,
317 request.endpoint = WSEndpointImpl.this; 312 final CompletionCallback callback,
318 request.addSatellite(wsdlProperties); 313 FiberContextSwitchInterceptor interceptor, boolean schedule) {
319 314 Container old = ContainerResolver.getDefault().enterContainer(container);
320 Fiber fiber = engine.createFiber(); 315 try {
321 if (interceptor != null) { 316 request.endpoint = WSEndpointImpl.this;
322 fiber.addInterceptor(interceptor); 317 request.addSatellite(wsdlProperties);
323 } 318
324 final Tube tube = tubePool.take(); 319 Fiber fiber = engine.createFiber();
325 Fiber.CompletionCallback cbak = new Fiber.CompletionCallback() { 320 fiber.setDeliverThrowableInPacket(true);
326 public void onCompletion(@NotNull Packet response) { 321 if (interceptor != null) {
327 tubePool.recycle(tube); 322 fiber.addInterceptor(interceptor);
328 if (callback != null) { 323 }
329 callback.onCompletion(response); 324 final Tube tube = tubePool.take();
330 } 325 Fiber.CompletionCallback cbak = new Fiber.CompletionCallback() {
326 public void onCompletion(@NotNull Packet response) {
327 ThrowableContainerPropertySet tc = response.getSatellite(ThrowableContainerPropertySet.class);
328 if (tc == null) {
329 // Only recycle tubes in non-exception path as some Tubes may be
330 // in invalid state following exception
331 tubePool.recycle(tube);
332 }
333
334 if (callback != null) {
335 if (tc != null) {
336 response = createServiceResponseForException(tc,
337 response,
338 soapVersion,
339 request.endpoint.getPort(),
340 null,
341 request.endpoint.getBinding());
331 } 342 }
332 343 callback.onCompletion(response);
333 public void onCompletion(@NotNull Throwable error) { 344 }
334 // let's not reuse tubes as they might be in a wrong state, so not 345 }
335 // calling tubePool.recycle() 346
336 // Convert all runtime exceptions to Packet so that transport doesn't 347 public void onCompletion(@NotNull Throwable error) {
337 // have to worry about converting to wire message 348 // will never be called now that we are using
338 // TODO XML/HTTP binding 349 // fiber.setDeliverThrowableInPacket(true);
339 Message faultMsg = SOAPFaultBuilder.createSOAPFaultMessage( 350 throw new IllegalStateException();
340 soapVersion, null, error); 351 }
341 Packet response = request.createServerResponse(faultMsg, request.endpoint.getPort(), null, 352 };
342 request.endpoint.getBinding()); 353
343 if (callback != null) { 354 fiber.start(tube, request, cbak,
344 callback.onCompletion(response); 355 binding.isFeatureEnabled(SyncStartForAsyncFeature.class)
345 } 356 || !schedule);
346 } 357 } finally {
347 }; 358 ContainerResolver.getDefault().exitContainer(old);
348 359 }
349 fiber.start(tube, request, cbak, 360 }
350 binding.isFeatureEnabled(SyncStartForAsyncFeature.class) || !schedule); 361
351 } 362 @Override
363 public Packet createServiceResponseForException(final ThrowableContainerPropertySet tc,
364 final Packet responsePacket,
365 final SOAPVersion soapVersion,
366 final WSDLPort wsdlPort,
367 final SEIModel seiModel,
368 final WSBinding binding)
369 {
370 // This will happen in addressing if it is enabled.
371 if (tc.isFaultCreated()) return responsePacket;
372
373 final Message faultMessage = SOAPFaultBuilder.createSOAPFaultMessage(soapVersion, null, tc.getThrowable());
374 final Packet result = responsePacket.createServerResponse(faultMessage, wsdlPort, seiModel, binding);
375 // Pass info to upper layers
376 tc.setFaultMessage(faultMessage);
377 tc.setResponsePacket(responsePacket);
378 tc.setFaultCreated(true);
379 return result;
380 }
352 381
353 @Override 382 @Override
354 public void process(final Packet request, final CompletionCallback callback, FiberContextSwitchInterceptor interceptor) { 383 public void process(final Packet request, final CompletionCallback callback, FiberContextSwitchInterceptor interceptor) {
355 processAsync(request, callback, interceptor, false); 384 processAsync(request, callback, interceptor, false);
356 } 385 }
357 386
358 public @NotNull PipeHead createPipeHead() { 387 public @NotNull
359 return new PipeHead() { 388 PipeHead createPipeHead() {
360 private final Tube tube = TubeCloner.clone(masterTubeline); 389 return new PipeHead() {
361 390 private final Tube tube = TubeCloner.clone(masterTubeline);
362 public @NotNull Packet process(Packet request, WebServiceContextDelegate wscd, TransportBackChannel tbc) { 391
363 request.webServiceContextDelegate = wscd; 392 public @NotNull
364 request.transportBackChannel = tbc; 393 Packet process(Packet request, WebServiceContextDelegate wscd,
365 request.endpoint = WSEndpointImpl.this; 394 TransportBackChannel tbc) {
366 request.addSatellite(wsdlProperties); 395 Container old = ContainerResolver.getDefault().enterContainer(container);
367 396 try {
368 Fiber fiber = engine.createFiber(); 397 request.webServiceContextDelegate = wscd;
369 Packet response; 398 request.transportBackChannel = tbc;
370 try { 399 request.endpoint = WSEndpointImpl.this;
371 response = fiber.runSync(tube, request); 400 request.addSatellite(wsdlProperties);
372 } catch (RuntimeException re) { 401
373 // Catch all runtime exceptions so that transport doesn't 402 Fiber fiber = engine.createFiber();
374 // have to worry about converting to wire message 403 Packet response;
375 // TODO XML/HTTP binding 404 try {
376 Message faultMsg = SOAPFaultBuilder.createSOAPFaultMessage( 405 response = fiber.runSync(tube, request);
377 soapVersion, null, re); 406 } catch (RuntimeException re) {
378 response = request.createServerResponse(faultMsg, request.endpoint.getPort(), null, request.endpoint.getBinding()); 407 // Catch all runtime exceptions so that transport
379 } 408 // doesn't
380 return response; 409 // have to worry about converting to wire message
381 } 410 // TODO XML/HTTP binding
382 }; 411 Message faultMsg = SOAPFaultBuilder
383 } 412 .createSOAPFaultMessage(soapVersion, null, re);
413 response = request.createServerResponse(faultMsg,
414 request.endpoint.getPort(), null,
415 request.endpoint.getBinding());
416 }
417 return response;
418 } finally {
419 ContainerResolver.getDefault().exitContainer(old);
420 }
421 }
422 };
423 }
384 424
385 public synchronized void dispose() { 425 public synchronized void dispose() {
386 if (disposed) 426 if (disposed) {
387 return; 427 return;
388 disposed = true; 428 }
389 429 disposed = true;
390 masterTubeline.preDestroy(); 430
391 431 masterTubeline.preDestroy();
392 for (Handler handler : binding.getHandlerChain()) { 432
393 for (Method method : handler.getClass().getMethods()) { 433 for (Handler handler : binding.getHandlerChain()) {
394 if (method.getAnnotation(PreDestroy.class) == null) { 434 for (Method method : handler.getClass().getMethods()) {
395 continue; 435 if (method.getAnnotation(PreDestroy.class) == null) {
396 } 436 continue;
397 try { 437 }
398 method.invoke(handler); 438 try {
399 } catch (Exception e) { 439 method.invoke(handler);
400 logger.log(Level.WARNING, HandlerMessages.HANDLER_PREDESTROY_IGNORE(e.getMessage()), e); 440 } catch (Exception e) {
401 } 441 logger.log(Level.WARNING, HandlerMessages.HANDLER_PREDESTROY_IGNORE(e.getMessage()), e);
402 break; 442 }
403 } 443 break;
404 } 444 }
405 closeManagedObjectManager(); 445 }
446 closeManagedObjectManager();
447 LazyMOMProvider.INSTANCE.unregisterEndpoint(this);
406 } 448 }
407 449
408 public ServiceDefinitionImpl getServiceDefinition() { 450 public ServiceDefinitionImpl getServiceDefinition() {
409 return serviceDef; 451 return serviceDef;
410 } 452 }
486 return component.hashCode(); 528 return component.hashCode();
487 } 529 }
488 530
489 @Override 531 @Override
490 public boolean equals(Object obj) { 532 public boolean equals(Object obj) {
491 return component.equals(obj); 533 return component.equals(obj);
492 } 534 }
493 } 535 }
494 536
495 private static class EndpointComponentWrapper implements Component { 537 private static class EndpointComponentWrapper implements Component {
496 private final EndpointComponent component; 538 private final EndpointComponent component;
512 public boolean equals(Object obj) { 554 public boolean equals(Object obj) {
513 return component.equals(obj); 555 return component.equals(obj);
514 } 556 }
515 } 557 }
516 558
559 @Override
517 public @NotNull Set<Component> getComponents() { 560 public @NotNull Set<Component> getComponents() {
518 return componentRegistry; 561 return componentRegistry;
519 } 562 }
520 563
521 private static final Logger logger = Logger.getLogger( 564 public <T extends EndpointReference> T getEndpointReference(Class<T> clazz, String address, String wsdlAddress, Element... referenceParameters) {
522 com.sun.xml.internal.ws.util.Constants.LoggingDomain + ".server.endpoint");
523
524 public <T extends EndpointReference> T getEndpointReference(Class<T>
525 clazz, String address, String wsdlAddress, Element... referenceParameters) {
526 List<Element> refParams = null; 565 List<Element> refParams = null;
527 if (referenceParameters != null) { 566 if (referenceParameters != null) {
528 refParams = Arrays.asList(referenceParameters); 567 refParams = Arrays.asList(referenceParameters);
529 } 568 }
530 return getEndpointReference(clazz, address, wsdlAddress, null, refParams); 569 return getEndpointReference(clazz, address, wsdlAddress, null, refParams);
531 } 570 }
571
532 public <T extends EndpointReference> T getEndpointReference(Class<T> clazz, 572 public <T extends EndpointReference> T getEndpointReference(Class<T> clazz,
533 String address, String wsdlAddress, List<Element> metadata, 573 String address, String wsdlAddress, List<Element> metadata,
534 List<Element> referenceParameters) { 574 List<Element> referenceParameters) {
535 QName portType = null; 575 QName portType = null;
536 if (port != null) { 576 if (port != null) {
537 portType = port.getBinding().getPortTypeName(); 577 portType = port.getBinding().getPortTypeName();
538 } 578 }
539 579
540 AddressingVersion av = AddressingVersion.fromSpecClass(clazz); 580 AddressingVersion av = AddressingVersion.fromSpecClass(clazz);
541 return new WSEndpointReference( 581 return new WSEndpointReference(
542 av, address, serviceName, portName, portType, metadata, wsdlAddress, referenceParameters,endpointReferenceExtensions.values(), null).toSpec(clazz); 582 av, address, serviceName, portName, portType, metadata, wsdlAddress, referenceParameters, endpointReferenceExtensions.values(), null).toSpec(clazz);
543 583
544 } 584 }
545 585
546 public @NotNull QName getPortName() { 586 public @NotNull QName getPortName() {
547 return portName; 587 return portName;
548 } 588 }
549 589
581 * @see com.sun.xml.internal.ws.api.server.LazyMOMProvider.Scope 621 * @see com.sun.xml.internal.ws.api.server.LazyMOMProvider.Scope
582 * @return an instance of {@code ManagedObjectManager} 622 * @return an instance of {@code ManagedObjectManager}
583 */ 623 */
584 @NotNull ManagedObjectManager obtainManagedObjectManager() { 624 @NotNull ManagedObjectManager obtainManagedObjectManager() {
585 final MonitorRootService monitorRootService = new MonitorRootService(this); 625 final MonitorRootService monitorRootService = new MonitorRootService(this);
586 final ManagedObjectManager managedObjectManager = monitorRootService.createManagedObjectManager(this); 626 final ManagedObjectManager mOM = monitorRootService.createManagedObjectManager(this);
587 627
588 // ManagedObjectManager was suspended due to root creation (see MonitorBase#initMOM) 628 // ManagedObjectManager was suspended due to root creation (see MonitorBase#initMOM)
589 managedObjectManager.resumeJMXRegistration(); 629 mOM.resumeJMXRegistration();
590 630
591 return managedObjectManager; 631 return mOM;
592 } 632 }
593 633
594 public void scopeChanged(LazyMOMProvider.Scope scope) { 634 public void scopeChanged(LazyMOMProvider.Scope scope) {
595 synchronized (managedObjectManagerLock) { 635 synchronized (managedObjectManagerLock) {
596 if (managedObjectManagerClosed) { 636 if (managedObjectManagerClosed) {
615 } 655 }
616 } 656 }
617 } 657 }
618 } 658 }
619 659
660 private static final Logger monitoringLogger = Logger.getLogger(com.sun.xml.internal.ws.util.Constants.LoggingDomain + ".monitoring");
661
620 // This can be called independently of WSEndpoint.dispose. 662 // This can be called independently of WSEndpoint.dispose.
621 // Example: the WSCM framework calls this before dispose. 663 // Example: the WSCM framework calls this before dispose.
664 @Override
622 public void closeManagedObjectManager() { 665 public void closeManagedObjectManager() {
623 synchronized (managedObjectManagerLock) { 666 synchronized (managedObjectManagerLock) {
624 if (managedObjectManagerClosed == true) { 667 if (managedObjectManagerClosed == true) {
625 return; 668 return;
626 } 669 }
632 && !((WSEndpointMOMProxy)managedObjectManager).isInitialized()) { 675 && !((WSEndpointMOMProxy)managedObjectManager).isInitialized()) {
633 close = false; 676 close = false;
634 } 677 }
635 678
636 if (close) { 679 if (close) {
637 // no further notification on scope change 680 try {
638 LazyMOMProvider.INSTANCE.unregisterEndpoint(this); 681 final ObjectName name = managedObjectManager.getObjectName(managedObjectManager.getRoot());
639 MonitorBase.closeMOM(managedObjectManager); 682 // The name is null when the MOM is a NOOP.
683 if (name != null) {
684 monitoringLogger.log(Level.INFO, "Closing Metro monitoring root: {0}", name);
685 }
686 managedObjectManager.close();
687 } catch (java.io.IOException e) {
688 monitoringLogger.log(Level.WARNING, "Ignoring error when closing Managed Object Manager", e);
689 }
640 } 690 }
641 } 691 }
642 managedObjectManagerClosed = true; 692 managedObjectManagerClosed = true;
643 } 693 }
644 } 694 }
645 695
646 public @NotNull ServerTubeAssemblerContext getAssemblerContext() { 696 public @NotNull @Override ServerTubeAssemblerContext getAssemblerContext() {
647 return context; 697 return context;
648 } 698 }
649 } 699 }

mercurial