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 */
25
26package com.sun.xml.internal.ws.server;
27
28import com.sun.istack.internal.NotNull;
29import com.sun.xml.internal.ws.api.SOAPVersion;
30import com.sun.xml.internal.ws.api.WSBinding;
31import com.sun.xml.internal.ws.api.message.Packet;
32import com.sun.xml.internal.ws.api.model.SEIModel;
33import com.sun.xml.internal.ws.api.model.wsdl.WSDLPort;
34import com.sun.xml.internal.ws.api.pipe.Codec;
35import com.sun.xml.internal.ws.api.pipe.FiberContextSwitchInterceptor;
36import com.sun.xml.internal.ws.api.pipe.ServerTubeAssemblerContext;
37import com.sun.xml.internal.ws.api.pipe.ThrowableContainerPropertySet;
38import com.sun.xml.internal.ws.api.server.Container;
39import com.sun.xml.internal.ws.api.server.ServiceDefinition;
40import com.sun.xml.internal.ws.api.server.WSEndpoint;
41import com.sun.xml.internal.ws.policy.PolicyMap;
42import com.sun.xml.internal.ws.wsdl.OperationDispatcher;
43import com.sun.org.glassfish.gmbal.AMXClient;
44import com.sun.org.glassfish.gmbal.GmbalMBean;
45import com.sun.org.glassfish.gmbal.ManagedObjectManager;
46
47import javax.management.MBeanServer;
48import javax.management.ObjectName;
49import java.io.IOException;
50import java.lang.annotation.Annotation;
51import java.lang.reflect.AnnotatedElement;
52import java.util.List;
53import java.util.ResourceBundle;
54import java.util.Set;
55import java.util.concurrent.Executor;
56import javax.xml.namespace.QName;
57import javax.xml.ws.EndpointReference;
58import org.w3c.dom.Element;
59
60/**
61 * {@link ManagedObjectManager} proxy class for {@link WSEndpointImpl} instances that could be used when Gmbal API calls
62 * need to be deferred. The proxy tries to defer a need of a real ManagedObjectManager instance to the time when any
63 * method from {@link ManagedObjectManager} is invoked on it. In this case a real instance of ManagedObjectManager is
64 * obtained from WSEndpointImpl and the method is rather invoked on this object.
65 */
66public class WSEndpointMOMProxy extends WSEndpoint implements ManagedObjectManager {
67
68    private final @NotNull
69    WSEndpointImpl wsEndpoint;
70    private ManagedObjectManager managedObjectManager;
71
72    WSEndpointMOMProxy(@NotNull WSEndpointImpl wsEndpoint) {
73        this.wsEndpoint = wsEndpoint;
74    }
75
76    /**
77     * Returns a real instance of {@link ManagedObjectManager}
78     *
79     * @return an ManagedObjectManager instance
80     */
81    @Override
82    public ManagedObjectManager getManagedObjectManager() {
83        if (managedObjectManager == null) {
84            managedObjectManager = wsEndpoint.obtainManagedObjectManager();
85        }
86        return managedObjectManager;
87    }
88
89    void setManagedObjectManager(ManagedObjectManager managedObjectManager) {
90        this.managedObjectManager = managedObjectManager;
91    }
92
93    /**
94     * Returns {@code true} if this proxy contains a reference to real ManagedObjectManager instance, {@code false}
95     * otherwise.
96     *
97     * @return {@code true} if ManagedObjectManager has been created, {@code false} otherwise.
98     */
99    public boolean isInitialized() {
100        return this.managedObjectManager != null;
101    }
102
103    public WSEndpointImpl getWsEndpoint() {
104        return wsEndpoint;
105    }
106
107    @Override
108    public void suspendJMXRegistration() {
109        getManagedObjectManager().suspendJMXRegistration();
110    }
111
112    @Override
113    public void resumeJMXRegistration() {
114        getManagedObjectManager().resumeJMXRegistration();
115    }
116
117    @Override
118    public boolean isManagedObject(Object obj) {
119        return getManagedObjectManager().isManagedObject(obj);
120    }
121
122    @Override
123    public GmbalMBean createRoot() {
124        return getManagedObjectManager().createRoot();
125    }
126
127    @Override
128    public GmbalMBean createRoot(Object root) {
129        return getManagedObjectManager().createRoot(root);
130    }
131
132    @Override
133    public GmbalMBean createRoot(Object root, String name) {
134        return getManagedObjectManager().createRoot(root, name);
135    }
136
137    @Override
138    public Object getRoot() {
139        return getManagedObjectManager().getRoot();
140    }
141
142    @Override
143    public GmbalMBean register(Object parent, Object obj, String name) {
144        return getManagedObjectManager().register(parent, obj, name);
145    }
146
147    @Override
148    public GmbalMBean register(Object parent, Object obj) {
149        return getManagedObjectManager().register(parent, obj);
150    }
151
152    @Override
153    public GmbalMBean registerAtRoot(Object obj, String name) {
154        return getManagedObjectManager().registerAtRoot(obj, name);
155    }
156
157    @Override
158    public GmbalMBean registerAtRoot(Object obj) {
159        return getManagedObjectManager().registerAtRoot(obj);
160    }
161
162    @Override
163    public void unregister(Object obj) {
164        getManagedObjectManager().unregister(obj);
165    }
166
167    @Override
168    public ObjectName getObjectName(Object obj) {
169        return getManagedObjectManager().getObjectName(obj);
170    }
171
172    @Override
173    public AMXClient getAMXClient(Object obj) {
174        return getManagedObjectManager().getAMXClient(obj);
175    }
176
177    @Override
178    public Object getObject(ObjectName oname) {
179        return getManagedObjectManager().getObject(oname);
180    }
181
182    @Override
183    public void stripPrefix(String... str) {
184        getManagedObjectManager().stripPrefix(str);
185    }
186
187    @Override
188    public void stripPackagePrefix() {
189        getManagedObjectManager().stripPackagePrefix();
190    }
191
192    @Override
193    public String getDomain() {
194        return getManagedObjectManager().getDomain();
195    }
196
197    @Override
198    public void setMBeanServer(MBeanServer server) {
199        getManagedObjectManager().setMBeanServer(server);
200    }
201
202    @Override
203    public MBeanServer getMBeanServer() {
204        return getManagedObjectManager().getMBeanServer();
205    }
206
207    @Override
208    public void setResourceBundle(ResourceBundle rb) {
209        getManagedObjectManager().setResourceBundle(rb);
210    }
211
212    @Override
213    public ResourceBundle getResourceBundle() {
214        return getManagedObjectManager().getResourceBundle();
215    }
216
217    @Override
218    public void addAnnotation(AnnotatedElement element, Annotation annotation) {
219        getManagedObjectManager().addAnnotation(element, annotation);
220    }
221
222    @Override
223    public void setRegistrationDebug(RegistrationDebugLevel level) {
224        getManagedObjectManager().setRegistrationDebug(level);
225    }
226
227    @Override
228    public void setRuntimeDebug(boolean flag) {
229        getManagedObjectManager().setRuntimeDebug(flag);
230    }
231
232    @Override
233    public void setTypelibDebug(int level) {
234        getManagedObjectManager().setTypelibDebug(level);
235    }
236
237    @Override
238    public void setJMXRegistrationDebug(boolean flag) {
239        getManagedObjectManager().setJMXRegistrationDebug(flag);
240    }
241
242    @Override
243    public String dumpSkeleton(Object obj) {
244        return getManagedObjectManager().dumpSkeleton(obj);
245    }
246
247    @Override
248    public void suppressDuplicateRootReport(boolean suppressReport) {
249        getManagedObjectManager().suppressDuplicateRootReport(suppressReport);
250    }
251
252    @Override
253    public void close() throws IOException {
254        getManagedObjectManager().close();
255    }
256
257    @Override
258    public boolean equalsProxiedInstance(WSEndpoint endpoint) {
259        if (wsEndpoint == null) {
260            return (endpoint == null);
261        }
262        return wsEndpoint.equals(endpoint);
263    }
264
265    @Override
266    public Codec createCodec() {
267        return this.wsEndpoint.createCodec();
268    }
269
270    @Override
271    public QName getServiceName() {
272        return this.wsEndpoint.getServiceName();
273    }
274
275    @Override
276    public QName getPortName() {
277        return this.wsEndpoint.getPortName();
278    }
279
280    @Override
281    public Class getImplementationClass() {
282        return this.wsEndpoint.getImplementationClass();
283    }
284
285    @Override
286    public WSBinding getBinding() {
287        return this.wsEndpoint.getBinding();
288    }
289
290    @Override
291    public Container getContainer() {
292        return this.wsEndpoint.getContainer();
293    }
294
295    @Override
296    public WSDLPort getPort() {
297        return this.wsEndpoint.getPort();
298    }
299
300    @Override
301    public void setExecutor(Executor exec) {
302        this.wsEndpoint.setExecutor(exec);
303    }
304
305    @Override
306    public void schedule(Packet request, CompletionCallback callback, FiberContextSwitchInterceptor interceptor) {
307        this.wsEndpoint.schedule(request, callback, interceptor);
308    }
309
310    @Override
311    public PipeHead createPipeHead() {
312        return this.wsEndpoint.createPipeHead();
313    }
314
315    @Override
316    public void dispose() {
317        if (this.wsEndpoint != null) {
318            this.wsEndpoint.dispose();
319        }
320    }
321
322    @Override
323    public ServiceDefinition getServiceDefinition() {
324        return this.wsEndpoint.getServiceDefinition();
325    }
326
327    @Override
328    public Set getComponentRegistry() {
329        return this.wsEndpoint.getComponentRegistry();
330    }
331
332    @Override
333    public SEIModel getSEIModel() {
334        return this.wsEndpoint.getSEIModel();
335    }
336
337    @Override
338    public PolicyMap getPolicyMap() {
339        return this.wsEndpoint.getPolicyMap();
340    }
341
342    @Override
343    public void closeManagedObjectManager() {
344        this.wsEndpoint.closeManagedObjectManager();
345    }
346
347    @Override
348    public ServerTubeAssemblerContext getAssemblerContext() {
349        return this.wsEndpoint.getAssemblerContext();
350    }
351
352    @Override
353    public EndpointReference getEndpointReference(Class clazz, String address, String wsdlAddress, Element... referenceParameters) {
354        return wsEndpoint.getEndpointReference(clazz, address, wsdlAddress, referenceParameters);
355    }
356
357    @Override
358    public EndpointReference getEndpointReference(Class clazz, String address, String wsdlAddress, List metadata, List referenceParameters) {
359        return wsEndpoint.getEndpointReference(clazz, address, wsdlAddress, metadata, referenceParameters);
360    }
361
362    @Override
363    public OperationDispatcher getOperationDispatcher() {
364        return wsEndpoint.getOperationDispatcher();
365    }
366
367    @Override
368    public Packet createServiceResponseForException(final ThrowableContainerPropertySet tc,
369                                                    final Packet      responsePacket,
370                                                    final SOAPVersion soapVersion,
371                                                    final WSDLPort    wsdlPort,
372                                                    final SEIModel    seiModel,
373                                                    final WSBinding   binding)
374    {
375        return wsEndpoint.createServiceResponseForException(tc, responsePacket, soapVersion,
376                                                            wsdlPort, seiModel, binding);
377    }
378}
379