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

Tue, 09 Apr 2013 14:51:13 +0100

author
alanb
date
Tue, 09 Apr 2013 14:51:13 +0100
changeset 368
0989ad8c0860
parent 286
f50545b5e2f1
child 408
b0610cd08440
permissions
-rw-r--r--

8010393: Update JAX-WS RI to 2.2.9-b12941
Reviewed-by: alanb, erikj
Contributed-by: miroslav.kos@oracle.com, martin.grebac@oracle.com

     1 /*
     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.
     4  *
     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
     7  * published by the Free Software Foundation.  Oracle designates this
     8  * particular file as subject to the "Classpath" exception as provided
     9  * by Oracle in the LICENSE file that accompanied this code.
    10  *
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    14  * version 2 for more details (a copy is included in the LICENSE file that
    15  * accompanied this code).
    16  *
    17  * You should have received a copy of the GNU General Public License version
    18  * 2 along with this work; if not, write to the Free Software Foundation,
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    20  *
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    22  * or visit www.oracle.com if you need additional information or have any
    23  * questions.
    24  */
    26 package com.sun.xml.internal.ws.server;
    28 import com.sun.istack.internal.NotNull;
    29 import com.sun.istack.internal.Nullable;
    30 import com.sun.xml.internal.stream.buffer.XMLStreamBuffer;
    31 import com.sun.xml.internal.ws.addressing.EPRSDDocumentFilter;
    32 import com.sun.xml.internal.ws.addressing.WSEPRExtension;
    33 import com.sun.xml.internal.ws.api.Component;
    34 import com.sun.xml.internal.ws.api.ComponentFeature;
    35 import com.sun.xml.internal.ws.api.ComponentsFeature;
    36 import com.sun.xml.internal.ws.api.SOAPVersion;
    37 import com.sun.xml.internal.ws.api.WSBinding;
    38 import com.sun.xml.internal.ws.api.addressing.AddressingVersion;
    39 import com.sun.xml.internal.ws.api.addressing.WSEndpointReference;
    40 import com.sun.xml.internal.ws.api.message.Message;
    41 import com.sun.xml.internal.ws.api.message.Packet;
    42 import com.sun.xml.internal.ws.api.model.SEIModel;
    43 import com.sun.xml.internal.ws.api.model.wsdl.WSDLPort;
    44 import com.sun.xml.internal.ws.api.pipe.*;
    45 import com.sun.xml.internal.ws.api.server.*;
    46 import com.sun.xml.internal.ws.binding.BindingImpl;
    47 import com.sun.xml.internal.ws.fault.SOAPFaultBuilder;
    48 import com.sun.xml.internal.ws.model.wsdl.WSDLDirectProperties;
    49 import com.sun.xml.internal.ws.model.wsdl.WSDLPortImpl;
    50 import com.sun.xml.internal.ws.model.wsdl.WSDLPortProperties;
    51 import com.sun.xml.internal.ws.model.wsdl.WSDLProperties;
    52 import com.sun.xml.internal.ws.policy.PolicyMap;
    53 import com.sun.xml.internal.ws.resources.HandlerMessages;
    54 import com.sun.xml.internal.ws.util.Pool;
    55 import com.sun.xml.internal.ws.util.Pool.TubePool;
    56 import com.sun.xml.internal.ws.util.ServiceFinder;
    57 import com.sun.xml.internal.ws.wsdl.OperationDispatcher;
    58 import com.sun.org.glassfish.gmbal.ManagedObjectManager;
    59 import org.w3c.dom.Element;
    61 import javax.annotation.PreDestroy;
    62 import javax.xml.namespace.QName;
    63 import javax.xml.stream.XMLStreamException;
    64 import javax.xml.ws.EndpointReference;
    65 import javax.xml.ws.WebServiceException;
    66 import javax.xml.ws.handler.Handler;
    67 import java.lang.reflect.Method;
    68 import java.util.*;
    69 import java.util.concurrent.CopyOnWriteArraySet;
    70 import java.util.concurrent.Executor;
    71 import java.util.logging.Level;
    72 import java.util.logging.Logger;
    73 import javax.management.ObjectName;
    75 /**
    76  * {@link WSEndpoint} implementation.
    77  *
    78  * @author Kohsuke Kawaguchi
    79  * @author Jitendra Kotamraju
    80  */
    81 public /*final*/ class WSEndpointImpl<T> extends WSEndpoint<T> implements LazyMOMProvider.WSEndpointScopeChangeListener {
    83     private static final Logger logger = Logger.getLogger(com.sun.xml.internal.ws.util.Constants.LoggingDomain + ".server.endpoint");
    85     private final @NotNull QName serviceName;
    86     private final @NotNull QName portName;
    87     protected final WSBinding binding;
    88     private final SEIModel seiModel;
    89     private final @NotNull Container container;
    90     private final WSDLPort port;
    92     protected final Tube masterTubeline;
    93     private final ServiceDefinitionImpl serviceDef;
    94     private final SOAPVersion soapVersion;
    95     private final Engine engine;
    96     private final @NotNull Codec masterCodec;
    97     private final @NotNull PolicyMap endpointPolicy;
    98     private final Pool<Tube> tubePool;
    99     private final OperationDispatcher operationDispatcher;
   100     private @NotNull ManagedObjectManager managedObjectManager;
   101     private boolean managedObjectManagerClosed = false;
   102     private final Object managedObjectManagerLock = new Object();
   103     private LazyMOMProvider.Scope lazyMOMProviderScope = LazyMOMProvider.Scope.STANDALONE;
   104     private final @NotNull ServerTubeAssemblerContext context;
   106     private Map<QName, WSEndpointReference.EPRExtension> endpointReferenceExtensions = new HashMap<QName, WSEndpointReference.EPRExtension>();
   107     /**
   108      * Set to true once we start shutting down this endpoint. Used to avoid
   109      * running the clean up processing twice.
   110      *
   111      * @see #dispose()
   112      */
   113     private boolean disposed;
   114     private final Class<T> implementationClass;
   115     private final @NotNull
   116     WSDLProperties wsdlProperties;
   117     private final Set<Component> componentRegistry = new CopyOnWriteArraySet<Component>();
   119     protected WSEndpointImpl(@NotNull QName serviceName, @NotNull QName portName, WSBinding binding,
   120                    Container container, SEIModel seiModel, WSDLPort port,
   121                    Class<T> implementationClass,
   122                    @Nullable ServiceDefinitionImpl serviceDef,
   123                    EndpointAwareTube terminalTube, boolean isSynchronous,
   124                    PolicyMap endpointPolicy) {
   125                 this.serviceName = serviceName;
   126                 this.portName = portName;
   127                 this.binding = binding;
   128                 this.soapVersion = binding.getSOAPVersion();
   129                 this.container = container;
   130                 this.port = port;
   131                 this.implementationClass = implementationClass;
   132                 this.serviceDef = serviceDef;
   133                 this.seiModel = seiModel;
   134         this.endpointPolicy = endpointPolicy;
   136         LazyMOMProvider.INSTANCE.registerEndpoint(this);
   137         initManagedObjectManager();
   139         if (serviceDef != null) {
   140             serviceDef.setOwner(this);
   141         }
   143         ComponentFeature cf = binding.getFeature(ComponentFeature.class);
   144         if (cf != null) {
   145             switch (cf.getTarget()) {
   146                 case ENDPOINT:
   147                     componentRegistry.add(cf.getComponent());
   148                     break;
   149                 case CONTAINER:
   150                     container.getComponents().add(cf.getComponent());
   151                     break;
   152                 default:
   153                     throw new IllegalArgumentException();
   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         }
   172         TubelineAssembler assembler = TubelineAssemblerFactory.create(
   173                 Thread.currentThread().getContextClassLoader(), binding.getBindingId(), container);
   174         assert assembler != null;
   176         this.operationDispatcher = (port == null) ? null : new OperationDispatcher(port, binding, seiModel);
   178         context = createServerTubeAssemblerContext(terminalTube, isSynchronous);
   179         this.masterTubeline = assembler.createServer(context);
   181         Codec c = context.getCodec();
   182         if (c instanceof EndpointAwareCodec) {
   183             // create a copy to avoid sharing the codec between multiple endpoints
   184             c = c.copy();
   185             ((EndpointAwareCodec) c).setEndpoint(this);
   186         }
   187         this.masterCodec = c;
   189         tubePool = new TubePool(masterTubeline);
   190         terminalTube.setEndpoint(this);
   191         engine = new Engine(toString(), container);
   192         wsdlProperties = (port == null) ? new WSDLDirectProperties(serviceName, portName, seiModel) : new WSDLPortProperties(port, seiModel);
   194         Map<QName, WSEndpointReference.EPRExtension> eprExtensions = new HashMap<QName, WSEndpointReference.EPRExtension>();
   195         try {
   196             if (port != null) {
   197                 //gather EPR extrensions from WSDL Model
   198                 WSEndpointReference wsdlEpr = ((WSDLPortImpl) port).getEPR();
   199                 if (wsdlEpr != null) {
   200                     for (WSEndpointReference.EPRExtension extnEl : wsdlEpr.getEPRExtensions()) {
   201                         eprExtensions.put(extnEl.getQName(), extnEl);
   202                     }
   203                 }
   204             }
   206             EndpointReferenceExtensionContributor[] eprExtnContributors = ServiceFinder.find(EndpointReferenceExtensionContributor.class).toArray();
   207             for(EndpointReferenceExtensionContributor eprExtnContributor :eprExtnContributors) {
   208                 WSEndpointReference.EPRExtension wsdlEPRExtn = eprExtensions.remove(eprExtnContributor.getQName());
   209                     WSEndpointReference.EPRExtension endpointEprExtn = eprExtnContributor.getEPRExtension(this,wsdlEPRExtn);
   210                     if (endpointEprExtn != null) {
   211                         eprExtensions.put(endpointEprExtn.getQName(), endpointEprExtn);
   212                     }
   213             }
   214             for (WSEndpointReference.EPRExtension extn : eprExtensions.values()) {
   215                 endpointReferenceExtensions.put(extn.getQName(), new WSEPRExtension(
   216                         XMLStreamBuffer.createNewBufferFromXMLStreamReader(extn.readAsXMLStreamReader()),extn.getQName()));
   217             }
   218         } catch (XMLStreamException ex) {
   219             throw new WebServiceException(ex);
   220         }
   221         if(!eprExtensions.isEmpty()) {
   222             serviceDef.addFilter(new EPRSDDocumentFilter(this));
   223         }
   224   }
   226   protected ServerTubeAssemblerContext createServerTubeAssemblerContext(
   227             EndpointAwareTube terminalTube, boolean isSynchronous) {
   228     ServerTubeAssemblerContext ctx = new ServerPipeAssemblerContext(
   229         seiModel, port, this, terminalTube, isSynchronous);
   230     return ctx;
   231   }
   233         protected WSEndpointImpl(@NotNull QName serviceName, @NotNull QName portName, WSBinding binding, Container container,
   234                         SEIModel seiModel, WSDLPort port,
   235                         Tube masterTubeline) {
   236                 this.serviceName = serviceName;
   237                 this.portName = portName;
   238                 this.binding = binding;
   239                 this.soapVersion = binding.getSOAPVersion();
   240                 this.container = container;
   241                 this.endpointPolicy = null;
   242                 this.port = port;
   243                 this.seiModel = seiModel;
   244                 this.serviceDef = null;
   245                 this.implementationClass = null;
   246                 this.masterTubeline = masterTubeline;
   247                 this.masterCodec = ((BindingImpl) this.binding).createCodec();
   249         LazyMOMProvider.INSTANCE.registerEndpoint(this);
   250         initManagedObjectManager();
   252         this.operationDispatcher = (port == null) ? null : new OperationDispatcher(port, binding, seiModel);
   253             this.context = new ServerPipeAssemblerContext(
   254                 seiModel, port, this, null /* not known */, false);
   256                 tubePool = new TubePool(masterTubeline);
   257                 engine = new Engine(toString(), container);
   258                 wsdlProperties = (port == null) ? new WSDLDirectProperties(serviceName, portName, seiModel) : new WSDLPortProperties(port, seiModel);
   259   }
   261     public Collection<WSEndpointReference.EPRExtension> getEndpointReferenceExtensions() {
   262         return endpointReferenceExtensions.values();
   263     }
   265     /**
   266      * Nullable when there is no associated WSDL Model
   267      * @return
   268      */
   269     public @Nullable OperationDispatcher getOperationDispatcher() {
   270         return operationDispatcher;
   271     }
   273     public PolicyMap getPolicyMap() {
   274             return endpointPolicy;
   275     }
   277     public @NotNull Class<T> getImplementationClass() {
   278                 return implementationClass;
   279         }
   281     public @NotNull WSBinding getBinding() {
   282                 return binding;
   283         }
   285     public @NotNull Container getContainer() {
   286                 return container;
   287         }
   289         public WSDLPort getPort() {
   290                 return port;
   291         }
   293         @Override
   294     public @Nullable SEIModel getSEIModel() {
   295                 return seiModel;
   296         }
   298         public void setExecutor(Executor exec) {
   299                 engine.setExecutor(exec);
   300         }
   302         @Override
   303         public Engine getEngine() {
   304                 return engine;
   305         }
   307     public void schedule(final Packet request, final CompletionCallback callback, FiberContextSwitchInterceptor interceptor) {
   308         processAsync(request, callback, interceptor, true);
   309     }
   311     private void processAsync(final Packet request,
   312             final CompletionCallback callback,
   313             FiberContextSwitchInterceptor interceptor, boolean schedule) {
   314         Container old = ContainerResolver.getDefault().enterContainer(container);
   315         try {
   316             request.endpoint = WSEndpointImpl.this;
   317             request.addSatellite(wsdlProperties);
   319             Fiber fiber = engine.createFiber();
   320             fiber.setDeliverThrowableInPacket(true);
   321             if (interceptor != null) {
   322                 fiber.addInterceptor(interceptor);
   323             }
   324             final Tube tube = tubePool.take();
   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                     }
   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());
   342                         }
   343                         callback.onCompletion(response);
   344                     }
   345                 }
   347                 public void onCompletion(@NotNull Throwable error) {
   348                     // will never be called now that we are using
   349                     // fiber.setDeliverThrowableInPacket(true);
   350                     throw new IllegalStateException();
   351                 }
   352             };
   354             fiber.start(tube, request, cbak,
   355                     binding.isFeatureEnabled(SyncStartForAsyncFeature.class)
   356                             || !schedule);
   357         } finally {
   358             ContainerResolver.getDefault().exitContainer(old);
   359         }
   360     }
   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;
   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     }
   382     @Override
   383     public void process(final Packet request, final CompletionCallback callback, FiberContextSwitchInterceptor interceptor) {
   384         processAsync(request, callback, interceptor, false);
   385     }
   387     public @NotNull
   388     PipeHead createPipeHead() {
   389         return new PipeHead() {
   390             private final Tube tube = TubeCloner.clone(masterTubeline);
   392             public @NotNull
   393             Packet process(Packet request, WebServiceContextDelegate wscd,
   394                     TransportBackChannel tbc) {
   395                 Container old = ContainerResolver.getDefault().enterContainer(container);
   396                 try {
   397                     request.webServiceContextDelegate = wscd;
   398                     request.transportBackChannel = tbc;
   399                     request.endpoint = WSEndpointImpl.this;
   400                     request.addSatellite(wsdlProperties);
   402                     Fiber fiber = engine.createFiber();
   403                     Packet response;
   404                     try {
   405                         response = fiber.runSync(tube, request);
   406                     } catch (RuntimeException re) {
   407                         // Catch all runtime exceptions so that transport
   408                         // doesn't
   409                         // have to worry about converting to wire message
   410                         // TODO XML/HTTP binding
   411                         Message faultMsg = SOAPFaultBuilder
   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     }
   425         public synchronized void dispose() {
   426             if (disposed) {
   427                 return;
   428             }
   429             disposed = true;
   431             masterTubeline.preDestroy();
   433             for (Handler handler : binding.getHandlerChain()) {
   434                 for (Method method : handler.getClass().getMethods()) {
   435                     if (method.getAnnotation(PreDestroy.class) == null) {
   436                         continue;
   437                     }
   438                     try {
   439                         method.invoke(handler);
   440                     } catch (Exception e) {
   441                         logger.log(Level.WARNING, HandlerMessages.HANDLER_PREDESTROY_IGNORE(e.getMessage()), e);
   442                     }
   443                     break;
   444                 }
   445             }
   446             closeManagedObjectManager();
   447             LazyMOMProvider.INSTANCE.unregisterEndpoint(this);
   448         }
   450         public ServiceDefinitionImpl getServiceDefinition() {
   451                 return serviceDef;
   452         }
   454         public Set<EndpointComponent> getComponentRegistry() {
   455                 Set<EndpointComponent> sec = new EndpointComponentSet();
   456                 for (Component c : componentRegistry) {
   457                         sec.add(c instanceof EndpointComponentWrapper ?
   458                                 ((EndpointComponentWrapper) c).component :
   459                                 new ComponentWrapper(c));
   460                 }
   461                 return sec;
   462         }
   464         private class EndpointComponentSet extends HashSet<EndpointComponent> {
   466                 @Override
   467                 public Iterator<EndpointComponent> iterator() {
   468                         final Iterator<EndpointComponent> it = super.iterator();
   469                         return new Iterator<EndpointComponent>() {
   470                                 private EndpointComponent last = null;
   472                                 public boolean hasNext() {
   473                                         return it.hasNext();
   474                                 }
   476                                 public EndpointComponent next() {
   477                                         last = it.next();
   478                                         return last;
   479                                 }
   481                                 public void remove() {
   482                                         it.remove();
   483                                         if (last != null) {
   484                                                 componentRegistry.remove(last instanceof ComponentWrapper ?
   485                                                                 ((ComponentWrapper) last).component :
   486                                                                 new EndpointComponentWrapper(last));
   487                                         }
   488                                         last = null;
   489                                 }
   490                         };
   491                 }
   493                 @Override
   494                 public boolean add(EndpointComponent e) {
   495                         boolean result = super.add(e);
   496                         if (result) {
   497                                 componentRegistry.add(new EndpointComponentWrapper(e));
   498                         }
   499                         return result;
   500                 }
   502                 @Override
   503                 public boolean remove(Object o) {
   504                         boolean result = super.remove(o);
   505                         if (result) {
   506                                 componentRegistry.remove(o instanceof ComponentWrapper ?
   507                                                 ((ComponentWrapper) o).component :
   508                                                 new EndpointComponentWrapper((EndpointComponent)o));
   509                         }
   510                         return result;
   511                 }
   513         }
   515         private static class ComponentWrapper implements EndpointComponent {
   516                 private final Component component;
   518                 public ComponentWrapper(Component component) {
   519                         this.component = component;
   520                 }
   522                 public <S> S getSPI(Class<S> spiType) {
   523                         return component.getSPI(spiType);
   524                 }
   526                 @Override
   527                 public int hashCode() {
   528                         return component.hashCode();
   529                 }
   531                 @Override
   532                 public boolean equals(Object obj) {
   533                     return component.equals(obj);
   534                 }
   535         }
   537         private static class EndpointComponentWrapper implements Component {
   538                 private final EndpointComponent component;
   540                 public EndpointComponentWrapper(EndpointComponent component) {
   541                         this.component = component;
   542                 }
   544                 public <S> S getSPI(Class<S> spiType) {
   545                         return component.getSPI(spiType);
   546                 }
   548                 @Override
   549                 public int hashCode() {
   550                         return component.hashCode();
   551                 }
   553                 @Override
   554                 public boolean equals(Object obj) {
   555                         return component.equals(obj);
   556                 }
   557         }
   559         @Override
   560         public @NotNull Set<Component> getComponents() {
   561                 return componentRegistry;
   562         }
   564     public <T extends EndpointReference> T getEndpointReference(Class<T> clazz, String address, String wsdlAddress, Element... referenceParameters) {
   565         List<Element> refParams = null;
   566         if (referenceParameters != null) {
   567             refParams = Arrays.asList(referenceParameters);
   568         }
   569         return getEndpointReference(clazz, address, wsdlAddress, null, refParams);
   570     }
   572     public <T extends EndpointReference> T getEndpointReference(Class<T> clazz,
   573             String address, String wsdlAddress, List<Element> metadata,
   574             List<Element> referenceParameters) {
   575         QName portType = null;
   576         if (port != null) {
   577             portType = port.getBinding().getPortTypeName();
   578         }
   580         AddressingVersion av = AddressingVersion.fromSpecClass(clazz);
   581         return new WSEndpointReference(
   582                 av, address, serviceName, portName, portType, metadata, wsdlAddress, referenceParameters, endpointReferenceExtensions.values(), null).toSpec(clazz);
   584     }
   586     public @NotNull QName getPortName() {
   587                 return portName;
   588         }
   591     public @NotNull Codec createCodec() {
   592                 return masterCodec.copy();
   593         }
   595     public @NotNull QName getServiceName() {
   596                 return serviceName;
   597         }
   599     private void initManagedObjectManager() {
   600         synchronized (managedObjectManagerLock) {
   601             if (managedObjectManager == null) {
   602                 switch (this.lazyMOMProviderScope) {
   603                     case GLASSFISH_NO_JMX:
   604                         managedObjectManager = new WSEndpointMOMProxy(this);
   605                         break;
   606                     default:
   607                         managedObjectManager = obtainManagedObjectManager();
   608                 }
   609             }
   610         }
   611     }
   613     public @NotNull ManagedObjectManager getManagedObjectManager() {
   614         return managedObjectManager;
   615     }
   617     /**
   618      * Obtains a real instance of {@code ManagedObjectManager} class no matter what lazyMOMProviderScope is this endpoint in (or if the
   619      * Gmbal API calls should be deferred).
   620      *
   621      * @see com.sun.xml.internal.ws.api.server.LazyMOMProvider.Scope
   622      * @return an instance of {@code ManagedObjectManager}
   623      */
   624     @NotNull ManagedObjectManager obtainManagedObjectManager() {
   625         final MonitorRootService monitorRootService = new MonitorRootService(this);
   626         final ManagedObjectManager mOM = monitorRootService.createManagedObjectManager(this);
   628         // ManagedObjectManager was suspended due to root creation (see MonitorBase#initMOM)
   629         mOM.resumeJMXRegistration();
   631         return mOM;
   632     }
   634     public void scopeChanged(LazyMOMProvider.Scope scope) {
   635         synchronized (managedObjectManagerLock) {
   636             if (managedObjectManagerClosed) {
   637                 return;
   638             }
   640             this.lazyMOMProviderScope = scope;
   642             // possible lazyMOMProviderScope change can be LazyMOMProvider.Scope.GLASSFISH_NO_JMX or LazyMOMProvider.Scope.GLASSFISH_JMX
   643             if (managedObjectManager == null) {
   644                 if (scope != LazyMOMProvider.Scope.GLASSFISH_NO_JMX) {
   645                     managedObjectManager = obtainManagedObjectManager();
   646                 } else {
   647                     managedObjectManager = new WSEndpointMOMProxy(this);
   648                 }
   649             } else {
   650                 // if ManagedObjectManager for this endpoint has already been created and is uninitialized proxy then
   651                 // fill it with a real instance
   652                 if (managedObjectManager instanceof WSEndpointMOMProxy
   653                         && !((WSEndpointMOMProxy)managedObjectManager).isInitialized()) {
   654                     ((WSEndpointMOMProxy)managedObjectManager).setManagedObjectManager(obtainManagedObjectManager());
   655                 }
   656             }
   657         }
   658     }
   660     private static final Logger monitoringLogger = Logger.getLogger(com.sun.xml.internal.ws.util.Constants.LoggingDomain + ".monitoring");
   662     // This can be called independently of WSEndpoint.dispose.
   663     // Example: the WSCM framework calls this before dispose.
   664     @Override
   665     public void closeManagedObjectManager() {
   666         synchronized (managedObjectManagerLock) {
   667             if (managedObjectManagerClosed == true) {
   668                 return;
   669             }
   670             if (managedObjectManager != null) {
   671                 boolean close = true;
   673                 // ManagedObjectManager doesn't need to be closed because it exists only as a proxy
   674                 if (managedObjectManager instanceof WSEndpointMOMProxy
   675                         && !((WSEndpointMOMProxy)managedObjectManager).isInitialized()) {
   676                     close = false;
   677                 }
   679                 if (close) {
   680                     try {
   681                         final ObjectName name = managedObjectManager.getObjectName(managedObjectManager.getRoot());
   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                     }
   690                 }
   691             }
   692             managedObjectManagerClosed = true;
   693         }
   694     }
   696     public @NotNull @Override ServerTubeAssemblerContext getAssemblerContext() {
   697         return context;
   698     }
   699 }

mercurial