11/*
2- * Copyright (c) 2000, 2020 , Oracle and/or its affiliates.
2+ * Copyright (c) 2000, 2022 , Oracle and/or its affiliates.
33 *
44 * Licensed under the Universal Permissive License v 1.0 as shown at
5- * http ://oss.oracle.com/licenses/upl.
5+ * https ://oss.oracle.com/licenses/upl.
66 */
77package com .tangosol .coherence .config .builder ;
88
@@ -32,26 +32,31 @@ public class SocketProviderBuilder implements ParameterizedBuilder<SocketProvide
3232 /**
3333 * Construct a {@link SocketProviderBuilder} from its definition id and its dependencies.
3434 *
35- * @param sId provider definition id. {@link #UNNAMED_PROVIDER_ID} indicates an inlined anonymous socket provider
36- * @param deps SocketProvider dependencies
35+ * @param sId provider definition id. {@link #UNNAMED_PROVIDER_ID} indicates an inlined
36+ * anonymous socket provider
37+ * @param deps SocketProvider dependencies
38+ * @param fCanUseGlobal {@code true} if the global provider builder can be used over this builder
3739 */
38- public SocketProviderBuilder (String sId , SocketProviderFactory .Dependencies deps )
40+ public SocketProviderBuilder (String sId , SocketProviderFactory .Dependencies deps , boolean fCanUseGlobal )
3941 {
40- f_sId = sId ;
41- f_deps = deps ;
42- f_provider = null ;
42+ f_sId = sId ;
43+ f_deps = deps ;
44+ f_provider = null ;
45+ f_fUseGlobal = fCanUseGlobal ;
4346 }
4447
4548 /**
4649 * Wrapper an existing {@link SocketProvider} into a Builder so it can be registered in cluster BuilderRegistry.
4750 *
48- * @param provider a SocketProvider
51+ * @param provider a {@link SocketProvider}
52+ * @param fCanUseGlobal {@code true} if the global provider builder can be used over this builder
4953 */
50- public SocketProviderBuilder (SocketProvider provider )
54+ public SocketProviderBuilder (SocketProvider provider , boolean fCanUseGlobal )
5155 {
52- f_sId = null ;
53- f_deps = null ;
54- f_provider = provider ;
56+ f_sId = null ;
57+ f_deps = null ;
58+ f_provider = provider ;
59+ f_fUseGlobal = fCanUseGlobal ;
5560 }
5661
5762 // ----- SocketProviderBuilder methods -----------------------------------
@@ -83,10 +88,15 @@ public String getId()
8388 * @param nSubport subport for demultiplexed socket provider.
8489 *
8590 * @return the provider
91+ * @throws NullPointerException if this builders {@link #f_deps} field is {@code null}
8692 */
8793 public SocketProvider getDemultiplexedSocketProvider (int nSubport )
8894 {
89- return f_deps .getSocketProviderFactory ().getDemultiplexedSocketProvider (f_sId , f_deps , nSubport );
95+ if (f_deps == null )
96+ {
97+ throw new NullPointerException ("The SocketProviderFactory dependencies field is null" );
98+ }
99+ return f_deps .getSocketProviderFactory ().getDemultiplexedSocketProvider (f_sId , f_deps , nSubport , f_fUseGlobal );
90100 }
91101
92102 /**
@@ -95,30 +105,87 @@ public SocketProvider getDemultiplexedSocketProvider(int nSubport)
95105 * @param nSubport subport for a demultiplexed socket provider.
96106 *
97107 * @return the provider
108+ * @throws NullPointerException if this builders {@link #f_deps} field is {@code null}
98109 */
99110 public DatagramSocketProvider getDatagramSocketProvider (int nSubport )
100111 {
101- return f_deps .getSocketProviderFactory ().getDatagramSocketProvider (f_sId , f_deps , nSubport );
112+ if (f_deps == null )
113+ {
114+ throw new NullPointerException ("The SocketProviderFactory dependencies field is null" );
115+ }
116+ return f_deps .getSocketProviderFactory ().getDatagramSocketProvider (f_sId , f_deps , nSubport , f_fUseGlobal );
102117 }
103118
104119
105120 /**
106121 * Return SSLSettings for {@link SocketProviderBuilder}.
122+ * <p>
123+ * If this builder's {@link #canUseGlobal()} method returns {@code} and there is a
124+ * global {@link SocketProviderBuilder} configured, then the result of calling the
125+ * global builder's getSSLSettings() method will be returned.
107126 *
108127 * @return the sslSettings if the socket provider builder has a ssl settings directly or via delegate.
128+ * @throws NullPointerException if the global builder is not used and this builders {@link #f_deps}
129+ * field is {@code null}
109130 */
110131 public SSLSettings getSSLSettings ()
111132 {
133+ if (canUseGlobal ())
134+ {
135+ SocketProviderBuilder builder = SocketProviderFactory .getGlobalSocketProviderBuilder ();
136+ if (builder != null )
137+ {
138+ return builder .getSSLSettings ();
139+ }
140+ }
141+
142+ if (f_deps == null )
143+ {
144+ throw new NullPointerException ("The SocketProviderFactory dependencies field is null" );
145+ }
146+
112147 SSLSocketProvider .Dependencies depsSSL = f_deps .getSSLDependencies (f_sId );
113148 return depsSSL == null ? null : SocketProviderFactory .createSSLSettings (depsSSL );
114149 }
115150
151+ /**
152+ * Returns {@code true} if the {@link SocketProviderFactory} can use the
153+ * global provider builder over this builder, if a global builder is
154+ * present.
155+ *
156+ * @return {@code true} if the {@link SocketProviderFactory} can use the
157+ * global provider builder over this builder
158+ */
159+ public boolean canUseGlobal ()
160+ {
161+ return f_fUseGlobal ;
162+ }
163+
116164 // ----- ParameterizedBuilder methods ------------------------------------
117165
118166 @ Override
119167 public SocketProvider realize (ParameterResolver resolver , ClassLoader loader , ParameterList listParameters )
120168 {
121- return f_provider == null ? f_deps .getSocketProviderFactory ().getSocketProvider (f_sId , f_deps , 0 ) : f_provider ;
169+ if (f_fUseGlobal )
170+ {
171+ SocketProviderBuilder builder = SocketProviderFactory .getGlobalSocketProviderBuilder ();
172+ if (builder != null )
173+ {
174+ return builder .realize (resolver , loader , listParameters );
175+ }
176+ }
177+
178+ if (f_provider != null )
179+ {
180+ return f_provider ;
181+ }
182+
183+ if (f_deps == null )
184+ {
185+ throw new NullPointerException ("The SocketProviderFactory dependencies field is null" );
186+ }
187+
188+ return f_deps .getSocketProviderFactory ().getSocketProvider (f_sId , f_deps , 0 );
122189 }
123190
124191 // ----- constants -------------------------------------------------------
@@ -133,7 +200,7 @@ public SocketProvider realize(ParameterResolver resolver, ClassLoader loader, Pa
133200 /**
134201 * SocketProvider definition id
135202 */
136- private final String f_sId ;
203+ private final String f_sId ;
137204
138205 /**
139206 * Either an anonymous SocketProviderFactory dependencies for an inlined socket-provider or
@@ -144,5 +211,11 @@ public SocketProvider realize(ParameterResolver resolver, ClassLoader loader, Pa
144211 /**
145212 * A Wrapped SocketProvider.
146213 */
147- private final SocketProvider f_provider ;
214+ private final SocketProvider f_provider ;
215+
216+ /**
217+ * If {@code true} the {@link SocketProviderFactory} can supply the global
218+ * {@link SocketProviderBuilder} over this builder, if one is present.
219+ */
220+ private final boolean f_fUseGlobal ;
148221 }
0 commit comments