1.1 --- a/src/share/jaxws_classes/com/sun/xml/internal/ws/server/WSEndpointImpl.java Thu Apr 04 19:05:24 2013 -0700 1.2 +++ b/src/share/jaxws_classes/com/sun/xml/internal/ws/server/WSEndpointImpl.java Tue Apr 09 14:51:13 2013 +0100 1.3 @@ -1,5 +1,5 @@ 1.4 /* 1.5 - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. 1.6 + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. 1.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 1.8 * 1.9 * This code is free software; you can redistribute it and/or modify it 1.10 @@ -32,6 +32,7 @@ 1.11 import com.sun.xml.internal.ws.addressing.WSEPRExtension; 1.12 import com.sun.xml.internal.ws.api.Component; 1.13 import com.sun.xml.internal.ws.api.ComponentFeature; 1.14 +import com.sun.xml.internal.ws.api.ComponentsFeature; 1.15 import com.sun.xml.internal.ws.api.SOAPVersion; 1.16 import com.sun.xml.internal.ws.api.WSBinding; 1.17 import com.sun.xml.internal.ws.api.addressing.AddressingVersion; 1.18 @@ -40,25 +41,8 @@ 1.19 import com.sun.xml.internal.ws.api.message.Packet; 1.20 import com.sun.xml.internal.ws.api.model.SEIModel; 1.21 import com.sun.xml.internal.ws.api.model.wsdl.WSDLPort; 1.22 -import com.sun.xml.internal.ws.api.pipe.Codec; 1.23 -import com.sun.xml.internal.ws.api.pipe.Engine; 1.24 -import com.sun.xml.internal.ws.api.pipe.Fiber; 1.25 -import com.sun.xml.internal.ws.api.pipe.FiberContextSwitchInterceptor; 1.26 -import com.sun.xml.internal.ws.api.pipe.ServerPipeAssemblerContext; 1.27 -import com.sun.xml.internal.ws.api.pipe.ServerTubeAssemblerContext; 1.28 -import com.sun.xml.internal.ws.api.pipe.SyncStartForAsyncFeature; 1.29 -import com.sun.xml.internal.ws.api.pipe.Tube; 1.30 -import com.sun.xml.internal.ws.api.pipe.TubeCloner; 1.31 -import com.sun.xml.internal.ws.api.pipe.TubelineAssembler; 1.32 -import com.sun.xml.internal.ws.api.pipe.TubelineAssemblerFactory; 1.33 -import com.sun.xml.internal.ws.api.server.Container; 1.34 -import com.sun.xml.internal.ws.api.server.EndpointAwareCodec; 1.35 -import com.sun.xml.internal.ws.api.server.EndpointComponent; 1.36 -import com.sun.xml.internal.ws.api.server.EndpointReferenceExtensionContributor; 1.37 -import com.sun.xml.internal.ws.api.server.LazyMOMProvider; 1.38 -import com.sun.xml.internal.ws.api.server.TransportBackChannel; 1.39 -import com.sun.xml.internal.ws.api.server.WSEndpoint; 1.40 -import com.sun.xml.internal.ws.api.server.WebServiceContextDelegate; 1.41 +import com.sun.xml.internal.ws.api.pipe.*; 1.42 +import com.sun.xml.internal.ws.api.server.*; 1.43 import com.sun.xml.internal.ws.binding.BindingImpl; 1.44 import com.sun.xml.internal.ws.fault.SOAPFaultBuilder; 1.45 import com.sun.xml.internal.ws.model.wsdl.WSDLDirectProperties; 1.46 @@ -81,18 +65,12 @@ 1.47 import javax.xml.ws.WebServiceException; 1.48 import javax.xml.ws.handler.Handler; 1.49 import java.lang.reflect.Method; 1.50 -import java.util.Arrays; 1.51 -import java.util.Collection; 1.52 -import java.util.HashMap; 1.53 -import java.util.HashSet; 1.54 -import java.util.Iterator; 1.55 -import java.util.List; 1.56 -import java.util.Map; 1.57 -import java.util.Set; 1.58 +import java.util.*; 1.59 import java.util.concurrent.CopyOnWriteArraySet; 1.60 import java.util.concurrent.Executor; 1.61 import java.util.logging.Level; 1.62 import java.util.logging.Logger; 1.63 +import javax.management.ObjectName; 1.64 1.65 /** 1.66 * {@link WSEndpoint} implementation. 1.67 @@ -101,41 +79,42 @@ 1.68 * @author Jitendra Kotamraju 1.69 */ 1.70 public /*final*/ class WSEndpointImpl<T> extends WSEndpoint<T> implements LazyMOMProvider.WSEndpointScopeChangeListener { 1.71 - private static final Logger LOGGER = Logger.getLogger(WSEndpointImpl.class.getName()); 1.72 + 1.73 + private static final Logger logger = Logger.getLogger(com.sun.xml.internal.ws.util.Constants.LoggingDomain + ".server.endpoint"); 1.74 1.75 private final @NotNull QName serviceName; 1.76 private final @NotNull QName portName; 1.77 - protected final WSBinding binding; 1.78 - private final SEIModel seiModel; 1.79 + protected final WSBinding binding; 1.80 + private final SEIModel seiModel; 1.81 private final @NotNull Container container; 1.82 - private final WSDLPort port; 1.83 + private final WSDLPort port; 1.84 1.85 - protected final Tube masterTubeline; 1.86 - private final ServiceDefinitionImpl serviceDef; 1.87 - private final SOAPVersion soapVersion; 1.88 - private final Engine engine; 1.89 + protected final Tube masterTubeline; 1.90 + private final ServiceDefinitionImpl serviceDef; 1.91 + private final SOAPVersion soapVersion; 1.92 + private final Engine engine; 1.93 private final @NotNull Codec masterCodec; 1.94 private final @NotNull PolicyMap endpointPolicy; 1.95 - private final Pool<Tube> tubePool; 1.96 + private final Pool<Tube> tubePool; 1.97 private final OperationDispatcher operationDispatcher; 1.98 - private @NotNull ManagedObjectManager managedObjectManager; 1.99 - private boolean managedObjectManagerClosed = false; 1.100 - private Object managedObjectManagerLock = new Object(); 1.101 - private LazyMOMProvider.Scope lazyMOMProviderScope = LazyMOMProvider.Scope.STANDALONE; 1.102 + private @NotNull ManagedObjectManager managedObjectManager; 1.103 + private boolean managedObjectManagerClosed = false; 1.104 + private final Object managedObjectManagerLock = new Object(); 1.105 + private LazyMOMProvider.Scope lazyMOMProviderScope = LazyMOMProvider.Scope.STANDALONE; 1.106 private final @NotNull ServerTubeAssemblerContext context; 1.107 1.108 private Map<QName, WSEndpointReference.EPRExtension> endpointReferenceExtensions = new HashMap<QName, WSEndpointReference.EPRExtension>(); 1.109 - /** 1.110 - * Set to true once we start shutting down this endpoint. 1.111 - * Used to avoid running the clean up processing twice. 1.112 - * 1.113 - * @see #dispose() 1.114 - */ 1.115 - private boolean disposed; 1.116 - 1.117 - private final Class<T> implementationClass; 1.118 - private final @NotNull WSDLProperties wsdlProperties; 1.119 - private final Set<Component> componentRegistry = new CopyOnWriteArraySet<Component>(); 1.120 + /** 1.121 + * Set to true once we start shutting down this endpoint. Used to avoid 1.122 + * running the clean up processing twice. 1.123 + * 1.124 + * @see #dispose() 1.125 + */ 1.126 + private boolean disposed; 1.127 + private final Class<T> implementationClass; 1.128 + private final @NotNull 1.129 + WSDLProperties wsdlProperties; 1.130 + private final Set<Component> componentRegistry = new CopyOnWriteArraySet<Component>(); 1.131 1.132 protected WSEndpointImpl(@NotNull QName serviceName, @NotNull QName portName, WSBinding binding, 1.133 Container container, SEIModel seiModel, WSDLPort port, 1.134 @@ -157,44 +136,60 @@ 1.135 LazyMOMProvider.INSTANCE.registerEndpoint(this); 1.136 initManagedObjectManager(); 1.137 1.138 - if (serviceDef != null) { 1.139 - serviceDef.setOwner(this); 1.140 + if (serviceDef != null) { 1.141 + serviceDef.setOwner(this); 1.142 + } 1.143 + 1.144 + ComponentFeature cf = binding.getFeature(ComponentFeature.class); 1.145 + if (cf != null) { 1.146 + switch (cf.getTarget()) { 1.147 + case ENDPOINT: 1.148 + componentRegistry.add(cf.getComponent()); 1.149 + break; 1.150 + case CONTAINER: 1.151 + container.getComponents().add(cf.getComponent()); 1.152 + break; 1.153 + default: 1.154 + throw new IllegalArgumentException(); 1.155 + } 1.156 + } 1.157 + ComponentsFeature csf = binding.getFeature(ComponentsFeature.class); 1.158 + if (csf != null) { 1.159 + for (ComponentFeature cfi : csf.getComponentFeatures()) { 1.160 + switch (cfi.getTarget()) { 1.161 + case ENDPOINT: 1.162 + componentRegistry.add(cfi.getComponent()); 1.163 + break; 1.164 + case CONTAINER: 1.165 + container.getComponents().add(cfi.getComponent()); 1.166 + break; 1.167 + default: 1.168 + throw new IllegalArgumentException(); 1.169 } 1.170 - 1.171 - ComponentFeature cf = binding.getFeature(ComponentFeature.class); 1.172 - if (cf != null) { 1.173 - switch(cf.getTarget()) { 1.174 - case ENDPOINT: 1.175 - componentRegistry.add(cf.getComponent()); 1.176 - break; 1.177 - case CONTAINER: 1.178 - container.getComponents().add(cf.getComponent()); 1.179 - default: 1.180 - throw new IllegalArgumentException(); 1.181 - } 1.182 - } 1.183 + } 1.184 + } 1.185 1.186 TubelineAssembler assembler = TubelineAssemblerFactory.create( 1.187 Thread.currentThread().getContextClassLoader(), binding.getBindingId(), container); 1.188 - assert assembler != null; 1.189 + assert assembler != null; 1.190 1.191 this.operationDispatcher = (port == null) ? null : new OperationDispatcher(port, binding, seiModel); 1.192 1.193 context = createServerTubeAssemblerContext(terminalTube, isSynchronous); 1.194 - this.masterTubeline = assembler.createServer(context); 1.195 + this.masterTubeline = assembler.createServer(context); 1.196 1.197 - Codec c = context.getCodec(); 1.198 - if (c instanceof EndpointAwareCodec) { 1.199 + Codec c = context.getCodec(); 1.200 + if (c instanceof EndpointAwareCodec) { 1.201 // create a copy to avoid sharing the codec between multiple endpoints 1.202 - c = c.copy(); 1.203 - ((EndpointAwareCodec) c).setEndpoint(this); 1.204 - } 1.205 - this.masterCodec = c; 1.206 + c = c.copy(); 1.207 + ((EndpointAwareCodec) c).setEndpoint(this); 1.208 + } 1.209 + this.masterCodec = c; 1.210 1.211 - tubePool = new TubePool(masterTubeline); 1.212 - terminalTube.setEndpoint(this); 1.213 - engine = new Engine(toString()); 1.214 - wsdlProperties = (port == null) ? new WSDLDirectProperties(serviceName, portName, seiModel) : new WSDLPortProperties(port, seiModel); 1.215 + tubePool = new TubePool(masterTubeline); 1.216 + terminalTube.setEndpoint(this); 1.217 + engine = new Engine(toString(), container); 1.218 + wsdlProperties = (port == null) ? new WSDLDirectProperties(serviceName, portName, seiModel) : new WSDLPortProperties(port, seiModel); 1.219 1.220 Map<QName, WSEndpointReference.EPRExtension> eprExtensions = new HashMap<QName, WSEndpointReference.EPRExtension>(); 1.221 try { 1.222 @@ -230,9 +225,9 @@ 1.223 1.224 protected ServerTubeAssemblerContext createServerTubeAssemblerContext( 1.225 EndpointAwareTube terminalTube, boolean isSynchronous) { 1.226 - ServerTubeAssemblerContext context = new ServerPipeAssemblerContext( 1.227 + ServerTubeAssemblerContext ctx = new ServerPipeAssemblerContext( 1.228 seiModel, port, this, terminalTube, isSynchronous); 1.229 - return context; 1.230 + return ctx; 1.231 } 1.232 1.233 protected WSEndpointImpl(@NotNull QName serviceName, @NotNull QName portName, WSBinding binding, Container container, 1.234 @@ -259,7 +254,7 @@ 1.235 seiModel, port, this, null /* not known */, false); 1.236 1.237 tubePool = new TubePool(masterTubeline); 1.238 - engine = new Engine(toString()); 1.239 + engine = new Engine(toString(), container); 1.240 wsdlProperties = (port == null) ? new WSDLDirectProperties(serviceName, portName, seiModel) : new WSDLPortProperties(port, seiModel); 1.241 } 1.242 1.243 @@ -313,96 +308,143 @@ 1.244 processAsync(request, callback, interceptor, true); 1.245 } 1.246 1.247 - private void processAsync(final Packet request, final CompletionCallback callback, FiberContextSwitchInterceptor interceptor, boolean schedule) { 1.248 - request.endpoint = WSEndpointImpl.this; 1.249 - request.addSatellite(wsdlProperties); 1.250 + private void processAsync(final Packet request, 1.251 + final CompletionCallback callback, 1.252 + FiberContextSwitchInterceptor interceptor, boolean schedule) { 1.253 + Container old = ContainerResolver.getDefault().enterContainer(container); 1.254 + try { 1.255 + request.endpoint = WSEndpointImpl.this; 1.256 + request.addSatellite(wsdlProperties); 1.257 1.258 - Fiber fiber = engine.createFiber(); 1.259 - if (interceptor != null) { 1.260 - fiber.addInterceptor(interceptor); 1.261 + Fiber fiber = engine.createFiber(); 1.262 + fiber.setDeliverThrowableInPacket(true); 1.263 + if (interceptor != null) { 1.264 + fiber.addInterceptor(interceptor); 1.265 + } 1.266 + final Tube tube = tubePool.take(); 1.267 + Fiber.CompletionCallback cbak = new Fiber.CompletionCallback() { 1.268 + public void onCompletion(@NotNull Packet response) { 1.269 + ThrowableContainerPropertySet tc = response.getSatellite(ThrowableContainerPropertySet.class); 1.270 + if (tc == null) { 1.271 + // Only recycle tubes in non-exception path as some Tubes may be 1.272 + // in invalid state following exception 1.273 + tubePool.recycle(tube); 1.274 + } 1.275 + 1.276 + if (callback != null) { 1.277 + if (tc != null) { 1.278 + response = createServiceResponseForException(tc, 1.279 + response, 1.280 + soapVersion, 1.281 + request.endpoint.getPort(), 1.282 + null, 1.283 + request.endpoint.getBinding()); 1.284 + } 1.285 + callback.onCompletion(response); 1.286 + } 1.287 } 1.288 - final Tube tube = tubePool.take(); 1.289 - Fiber.CompletionCallback cbak = new Fiber.CompletionCallback() { 1.290 - public void onCompletion(@NotNull Packet response) { 1.291 - tubePool.recycle(tube); 1.292 - if (callback != null) { 1.293 - callback.onCompletion(response); 1.294 - } 1.295 - } 1.296 1.297 - public void onCompletion(@NotNull Throwable error) { 1.298 - // let's not reuse tubes as they might be in a wrong state, so not 1.299 - // calling tubePool.recycle() 1.300 - // Convert all runtime exceptions to Packet so that transport doesn't 1.301 - // have to worry about converting to wire message 1.302 - // TODO XML/HTTP binding 1.303 - Message faultMsg = SOAPFaultBuilder.createSOAPFaultMessage( 1.304 - soapVersion, null, error); 1.305 - Packet response = request.createServerResponse(faultMsg, request.endpoint.getPort(), null, 1.306 - request.endpoint.getBinding()); 1.307 - if (callback != null) { 1.308 - callback.onCompletion(response); 1.309 - } 1.310 - } 1.311 - }; 1.312 + public void onCompletion(@NotNull Throwable error) { 1.313 + // will never be called now that we are using 1.314 + // fiber.setDeliverThrowableInPacket(true); 1.315 + throw new IllegalStateException(); 1.316 + } 1.317 + }; 1.318 1.319 - fiber.start(tube, request, cbak, 1.320 - binding.isFeatureEnabled(SyncStartForAsyncFeature.class) || !schedule); 1.321 + fiber.start(tube, request, cbak, 1.322 + binding.isFeatureEnabled(SyncStartForAsyncFeature.class) 1.323 + || !schedule); 1.324 + } finally { 1.325 + ContainerResolver.getDefault().exitContainer(old); 1.326 } 1.327 + } 1.328 + 1.329 + @Override 1.330 + public Packet createServiceResponseForException(final ThrowableContainerPropertySet tc, 1.331 + final Packet responsePacket, 1.332 + final SOAPVersion soapVersion, 1.333 + final WSDLPort wsdlPort, 1.334 + final SEIModel seiModel, 1.335 + final WSBinding binding) 1.336 + { 1.337 + // This will happen in addressing if it is enabled. 1.338 + if (tc.isFaultCreated()) return responsePacket; 1.339 + 1.340 + final Message faultMessage = SOAPFaultBuilder.createSOAPFaultMessage(soapVersion, null, tc.getThrowable()); 1.341 + final Packet result = responsePacket.createServerResponse(faultMessage, wsdlPort, seiModel, binding); 1.342 + // Pass info to upper layers 1.343 + tc.setFaultMessage(faultMessage); 1.344 + tc.setResponsePacket(responsePacket); 1.345 + tc.setFaultCreated(true); 1.346 + return result; 1.347 + } 1.348 1.349 @Override 1.350 public void process(final Packet request, final CompletionCallback callback, FiberContextSwitchInterceptor interceptor) { 1.351 processAsync(request, callback, interceptor, false); 1.352 } 1.353 1.354 - public @NotNull PipeHead createPipeHead() { 1.355 - return new PipeHead() { 1.356 - private final Tube tube = TubeCloner.clone(masterTubeline); 1.357 + public @NotNull 1.358 + PipeHead createPipeHead() { 1.359 + return new PipeHead() { 1.360 + private final Tube tube = TubeCloner.clone(masterTubeline); 1.361 1.362 - public @NotNull Packet process(Packet request, WebServiceContextDelegate wscd, TransportBackChannel tbc) { 1.363 - request.webServiceContextDelegate = wscd; 1.364 - request.transportBackChannel = tbc; 1.365 - request.endpoint = WSEndpointImpl.this; 1.366 - request.addSatellite(wsdlProperties); 1.367 + public @NotNull 1.368 + Packet process(Packet request, WebServiceContextDelegate wscd, 1.369 + TransportBackChannel tbc) { 1.370 + Container old = ContainerResolver.getDefault().enterContainer(container); 1.371 + try { 1.372 + request.webServiceContextDelegate = wscd; 1.373 + request.transportBackChannel = tbc; 1.374 + request.endpoint = WSEndpointImpl.this; 1.375 + request.addSatellite(wsdlProperties); 1.376 1.377 - Fiber fiber = engine.createFiber(); 1.378 - Packet response; 1.379 - try { 1.380 - response = fiber.runSync(tube, request); 1.381 - } catch (RuntimeException re) { 1.382 - // Catch all runtime exceptions so that transport doesn't 1.383 - // have to worry about converting to wire message 1.384 - // TODO XML/HTTP binding 1.385 - Message faultMsg = SOAPFaultBuilder.createSOAPFaultMessage( 1.386 - soapVersion, null, re); 1.387 - response = request.createServerResponse(faultMsg, request.endpoint.getPort(), null, request.endpoint.getBinding()); 1.388 - } 1.389 - return response; 1.390 - } 1.391 - }; 1.392 - } 1.393 + Fiber fiber = engine.createFiber(); 1.394 + Packet response; 1.395 + try { 1.396 + response = fiber.runSync(tube, request); 1.397 + } catch (RuntimeException re) { 1.398 + // Catch all runtime exceptions so that transport 1.399 + // doesn't 1.400 + // have to worry about converting to wire message 1.401 + // TODO XML/HTTP binding 1.402 + Message faultMsg = SOAPFaultBuilder 1.403 + .createSOAPFaultMessage(soapVersion, null, re); 1.404 + response = request.createServerResponse(faultMsg, 1.405 + request.endpoint.getPort(), null, 1.406 + request.endpoint.getBinding()); 1.407 + } 1.408 + return response; 1.409 + } finally { 1.410 + ContainerResolver.getDefault().exitContainer(old); 1.411 + } 1.412 + } 1.413 + }; 1.414 + } 1.415 1.416 public synchronized void dispose() { 1.417 - if (disposed) 1.418 - return; 1.419 - disposed = true; 1.420 + if (disposed) { 1.421 + return; 1.422 + } 1.423 + disposed = true; 1.424 1.425 - masterTubeline.preDestroy(); 1.426 + masterTubeline.preDestroy(); 1.427 1.428 - for (Handler handler : binding.getHandlerChain()) { 1.429 - for (Method method : handler.getClass().getMethods()) { 1.430 - if (method.getAnnotation(PreDestroy.class) == null) { 1.431 - continue; 1.432 - } 1.433 - try { 1.434 - method.invoke(handler); 1.435 - } catch (Exception e) { 1.436 - logger.log(Level.WARNING, HandlerMessages.HANDLER_PREDESTROY_IGNORE(e.getMessage()), e); 1.437 - } 1.438 - break; 1.439 - } 1.440 + for (Handler handler : binding.getHandlerChain()) { 1.441 + for (Method method : handler.getClass().getMethods()) { 1.442 + if (method.getAnnotation(PreDestroy.class) == null) { 1.443 + continue; 1.444 + } 1.445 + try { 1.446 + method.invoke(handler); 1.447 + } catch (Exception e) { 1.448 + logger.log(Level.WARNING, HandlerMessages.HANDLER_PREDESTROY_IGNORE(e.getMessage()), e); 1.449 + } 1.450 + break; 1.451 } 1.452 - closeManagedObjectManager(); 1.453 + } 1.454 + closeManagedObjectManager(); 1.455 + LazyMOMProvider.INSTANCE.unregisterEndpoint(this); 1.456 } 1.457 1.458 public ServiceDefinitionImpl getServiceDefinition() { 1.459 @@ -488,7 +530,7 @@ 1.460 1.461 @Override 1.462 public boolean equals(Object obj) { 1.463 - return component.equals(obj); 1.464 + return component.equals(obj); 1.465 } 1.466 } 1.467 1.468 @@ -514,34 +556,32 @@ 1.469 } 1.470 } 1.471 1.472 + @Override 1.473 public @NotNull Set<Component> getComponents() { 1.474 return componentRegistry; 1.475 } 1.476 1.477 - private static final Logger logger = Logger.getLogger( 1.478 - com.sun.xml.internal.ws.util.Constants.LoggingDomain + ".server.endpoint"); 1.479 - 1.480 - public <T extends EndpointReference> T getEndpointReference(Class<T> 1.481 - clazz, String address, String wsdlAddress, Element... referenceParameters) { 1.482 + public <T extends EndpointReference> T getEndpointReference(Class<T> clazz, String address, String wsdlAddress, Element... referenceParameters) { 1.483 List<Element> refParams = null; 1.484 if (referenceParameters != null) { 1.485 refParams = Arrays.asList(referenceParameters); 1.486 } 1.487 return getEndpointReference(clazz, address, wsdlAddress, null, refParams); 1.488 } 1.489 + 1.490 public <T extends EndpointReference> T getEndpointReference(Class<T> clazz, 1.491 - String address, String wsdlAddress, List<Element> metadata, 1.492 - List<Element> referenceParameters) { 1.493 - QName portType = null; 1.494 - if (port != null) { 1.495 - portType = port.getBinding().getPortTypeName(); 1.496 - } 1.497 + String address, String wsdlAddress, List<Element> metadata, 1.498 + List<Element> referenceParameters) { 1.499 + QName portType = null; 1.500 + if (port != null) { 1.501 + portType = port.getBinding().getPortTypeName(); 1.502 + } 1.503 1.504 AddressingVersion av = AddressingVersion.fromSpecClass(clazz); 1.505 return new WSEndpointReference( 1.506 - av, address, serviceName, portName, portType, metadata, wsdlAddress, referenceParameters,endpointReferenceExtensions.values(), null).toSpec(clazz); 1.507 + av, address, serviceName, portName, portType, metadata, wsdlAddress, referenceParameters, endpointReferenceExtensions.values(), null).toSpec(clazz); 1.508 1.509 - } 1.510 + } 1.511 1.512 public @NotNull QName getPortName() { 1.513 return portName; 1.514 @@ -583,12 +623,12 @@ 1.515 */ 1.516 @NotNull ManagedObjectManager obtainManagedObjectManager() { 1.517 final MonitorRootService monitorRootService = new MonitorRootService(this); 1.518 - final ManagedObjectManager managedObjectManager = monitorRootService.createManagedObjectManager(this); 1.519 + final ManagedObjectManager mOM = monitorRootService.createManagedObjectManager(this); 1.520 1.521 // ManagedObjectManager was suspended due to root creation (see MonitorBase#initMOM) 1.522 - managedObjectManager.resumeJMXRegistration(); 1.523 + mOM.resumeJMXRegistration(); 1.524 1.525 - return managedObjectManager; 1.526 + return mOM; 1.527 } 1.528 1.529 public void scopeChanged(LazyMOMProvider.Scope scope) { 1.530 @@ -617,8 +657,11 @@ 1.531 } 1.532 } 1.533 1.534 + private static final Logger monitoringLogger = Logger.getLogger(com.sun.xml.internal.ws.util.Constants.LoggingDomain + ".monitoring"); 1.535 + 1.536 // This can be called independently of WSEndpoint.dispose. 1.537 // Example: the WSCM framework calls this before dispose. 1.538 + @Override 1.539 public void closeManagedObjectManager() { 1.540 synchronized (managedObjectManagerLock) { 1.541 if (managedObjectManagerClosed == true) { 1.542 @@ -634,16 +677,23 @@ 1.543 } 1.544 1.545 if (close) { 1.546 - // no further notification on scope change 1.547 - LazyMOMProvider.INSTANCE.unregisterEndpoint(this); 1.548 - MonitorBase.closeMOM(managedObjectManager); 1.549 + try { 1.550 + final ObjectName name = managedObjectManager.getObjectName(managedObjectManager.getRoot()); 1.551 + // The name is null when the MOM is a NOOP. 1.552 + if (name != null) { 1.553 + monitoringLogger.log(Level.INFO, "Closing Metro monitoring root: {0}", name); 1.554 + } 1.555 + managedObjectManager.close(); 1.556 + } catch (java.io.IOException e) { 1.557 + monitoringLogger.log(Level.WARNING, "Ignoring error when closing Managed Object Manager", e); 1.558 + } 1.559 } 1.560 } 1.561 managedObjectManagerClosed = true; 1.562 } 1.563 } 1.564 1.565 - public @NotNull ServerTubeAssemblerContext getAssemblerContext() { 1.566 + public @NotNull @Override ServerTubeAssemblerContext getAssemblerContext() { 1.567 return context; 1.568 } 1.569 }