1 /*
2  * Copyright (c) 1997, 2012, 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 
26 package com.sun.xml.internal.ws.api.server;
27 
28 import com.sun.istack.internal.NotNull;
29 
30 /**
31  * This class determines an instance of {@link Container} for the runtime.
32  * It applies for both server and client runtimes(for e.g in Servlet could
33  * be accessing a Web Service).
34  *
35  * A client that is invoking a web service may be running in a
36  * container(for e.g servlet). T
37  *
38  * <p>
39  * ContainerResolver uses a static field to keep the instance of the resolver object.
40  * Typically appserver may set its custom container resolver using the static method
41  * {@link #setInstance(ContainerResolver)}
42  *
43  * @author Jitendra Kotamraju
44  */
45 public abstract class ContainerResolver {
46 
47     private static final ThreadLocalContainerResolver DEFAULT = new ThreadLocalContainerResolver();
48 
49     private static volatile ContainerResolver theResolver = DEFAULT;
50 
51     /**
52      * Sets the custom container resolver which can be used to get client's
53      * {@link Container}.
54      *
55      * @param resolver container resolver
56      */
setInstance(ContainerResolver resolver)57     public static void setInstance(ContainerResolver resolver) {
58         if(resolver==null)
59             resolver = DEFAULT;
60         theResolver = resolver;
61     }
62 
63     /**
64      * Returns the container resolver which can be used to get client's {@link Container}.
65      *
66      * @return container resolver instance
67      */
getInstance()68     public static @NotNull ContainerResolver getInstance() {
69         return theResolver;
70     }
71 
72     /**
73      * Returns the default container resolver which can be used to get {@link Container}.
74      *
75      * @return default container resolver
76      */
getDefault()77     public static ThreadLocalContainerResolver getDefault() {
78         return DEFAULT;
79     }
80 
81     /**
82      * Returns the {@link Container} context in which client is running.
83      *
84      * @return container instance for the client
85      */
getContainer()86     public abstract @NotNull Container getContainer();
87 
88 }
89