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.api.server;
27
28import 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 */
45public 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     */
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     */
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     */
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     */
86    public abstract @NotNull Container getContainer();
87
88}
89