Skip to content

Commit 4e19e7a

Browse files
author
Jonathan Knight
committed
Enh 34451765 - [34432231->22.09] Add the ability to configure a global socket provider (merge main -> ce/main 94613)
RQ job.9.20220801124933.24624 [git-p4: depot-paths = "//dev/coherence-ce/main/": change = 94619]
1 parent 8640b27 commit 4e19e7a

33 files changed

+1123
-224
lines changed

prj/coherence-core/src/main/java/com/tangosol/coherence/config/builder/SSLSocketProviderDependenciesBuilder.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* 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
*/
77
package com.tangosol.coherence.config.builder;
88

@@ -60,8 +60,8 @@
6060

6161
/**
6262
* {@link SSLSocketProviderDependenciesBuilder} enables lazy instantiation of SSL SocketProvider.
63-
*
64-
* Builder includes methods that allows one to specify whether to get a datagram or demultiplexed
63+
* <p>
64+
* This builder includes methods that allows one to specify whether to get a datagram or demultiplexed
6565
* {@link SocketProvider} and what subport to use for the socketprovider.
6666
*
6767
* @author jf 2015.11.11
@@ -82,7 +82,7 @@ public class SSLSocketProviderDependenciesBuilder
8282
public SSLSocketProviderDependenciesBuilder(SSLSocketProviderDefaultDependencies deps)
8383
{
8484
m_deps = deps;
85-
m_bldrDelegateSocketProvider = new SocketProviderBuilder(SocketProviderFactory.DEFAULT_SOCKET_PROVIDER);
85+
m_bldrDelegateSocketProvider = new SocketProviderBuilder(SocketProviderFactory.DEFAULT_SOCKET_PROVIDER, false);
8686
m_sNameProtocol = SSLSocketProviderDefaultDependencies.DEFAULT_SSL_PROTOCOL;
8787
}
8888

@@ -314,8 +314,8 @@ public SocketProviderBuilder getSocketProviderBuilder()
314314

315315
/**
316316
* Realize a SSLSocketProviderDefaultDependencies based on configured/defaulted values for config element ssl.
317-
*
318-
* Note: unlike typical builders, this is realize once since sensitive password data is nulled after realizing.
317+
* <p>
318+
* Note: unlike typical builders, this is realized once, since sensitive password data is nullified after realizing.
319319
*
320320
* @return {@link SSLSocketProviderDefaultDependencies}
321321
*/

prj/coherence-core/src/main/java/com/tangosol/coherence/config/builder/SocketProviderBuilder.java

Lines changed: 91 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
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
*/
77
package 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
}

prj/coherence-core/src/main/java/com/tangosol/coherence/config/xml/OperationalConfigNamespaceHandler.java

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22
* 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
*/
77
package com.tangosol.coherence.config.xml;
88

99
import com.tangosol.coherence.config.xml.preprocessor.SystemPropertyPreprocessor;
1010
import com.tangosol.coherence.config.xml.processor.AddressProviderBuilderProcessor;
1111
import com.tangosol.coherence.config.xml.processor.ExecutorProcessor;
12+
import com.tangosol.coherence.config.xml.processor.GlobalSocketProviderProcessor;
1213
import com.tangosol.coherence.config.xml.processor.InitParamProcessor;
1314
import com.tangosol.coherence.config.xml.processor.InitParamsProcessor;
1415
import com.tangosol.coherence.config.xml.processor.InstanceProcessor;
@@ -47,6 +48,7 @@
4748
import com.tangosol.run.xml.XmlElement;
4849

4950
import java.net.URI;
51+
import java.util.ServiceLoader;
5052

5153
/**
5254
* The {@link OperationalConfigNamespaceHandler} is responsible for capturing and
@@ -77,6 +79,7 @@ public OperationalConfigNamespaceHandler()
7779
// register the type-based ElementProcessors
7880
registerProcessor(AddressProviderBuilderProcessor.class);
7981
registerProcessor(ExecutorProcessor.class);
82+
registerProcessor(GlobalSocketProviderProcessor.class);
8083
registerProcessor(InitParamProcessor.class);
8184
registerProcessor(InitParamsProcessor.class);
8285
registerProcessor(InstanceProcessor.class);
@@ -95,11 +98,11 @@ public OperationalConfigNamespaceHandler()
9598
registerProcessor(SerializerBuilderProcessor.class);
9699
registerProcessor(SerializersProcessor.class);
97100
registerProcessor(SocketProviderProcessor.class);
101+
registerProcessor(SocketProvidersProcessor.class);
98102
registerProcessor(SSLProcessor.class);
99103
registerProcessor(SSLHostnameVerifierProcessor.class);
100104
registerProcessor(StorageAccessAuthorizerBuilderProcessor.class);
101105
registerProcessor(StorageAccessAuthorizersProcessor.class);
102-
registerProcessor(SocketProvidersProcessor.class);
103106

104107
// register customized ElementProcessors
105108
registerProcessor("address-provider", new AddressProviderBuilderProcessor());
@@ -113,12 +116,14 @@ public OperationalConfigNamespaceHandler()
113116
registerProcessor("name-service-addresses", new AddressProviderBuilderProcessor());
114117
registerProcessor("protocol-versions", new SSLNameListProcessor("protocol-versions"));
115118
registerProcessor("remote-addresses", new AddressProviderBuilderProcessor());
116-
registerProcessor("socket-provider", new SocketProviderProcessor());
117119
registerProcessor("trust-manager", new SSLManagerProcessor());
118120
registerProcessor("url", new SimpleElementProcessor<>(URLKeyStoreLoader.class));
119121

120122
// register injectable types (in alphabetical order)
121123
registerProcessor("federation-config", new UnsupportedFeatureProcessor("Federated Caching"));
124+
125+
ServiceLoader<Extension> extensions = ServiceLoader.load(Extension.class);
126+
extensions.forEach(e -> e.extend(this));
122127
}
123128

124129
// ----- NamespaceHandler interface -------------------------------------
@@ -131,4 +136,23 @@ public void onStartNamespace(ProcessingContext context, XmlElement element, Stri
131136
{
132137
super.onStartNamespace(context, element, prefix, uri);
133138
}
139+
140+
// ----- inner interface Extension --------------------------------------
141+
142+
/**
143+
* Implementations of {@link Extension} are able to modify the {@link OperationalConfigNamespaceHandler}
144+
* before it is used.
145+
* <p>
146+
* Instances of {@link Extension} are discovered using the {@link ServiceLoader}. If multiple
147+
* instances are on the class pathe there is no guaranteed order in which they will be applied.
148+
*/
149+
public interface Extension
150+
{
151+
/**
152+
* Add extensions to the {@link OperationalConfigNamespaceHandler}.
153+
*
154+
* @param handler the {@link OperationalConfigNamespaceHandler} to extend
155+
*/
156+
void extend(OperationalConfigNamespaceHandler handler);
157+
}
134158
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* Copyright (c) 2000, 2022, Oracle and/or its affiliates.
3+
*
4+
* Licensed under the Universal Permissive License v 1.0 as shown at
5+
* https://oss.oracle.com/licenses/upl.
6+
*/
7+
package com.tangosol.coherence.config.xml.processor;
8+
9+
import com.tangosol.coherence.config.builder.SocketProviderBuilder;
10+
import com.tangosol.config.ConfigurationException;
11+
import com.tangosol.config.xml.ElementProcessor;
12+
import com.tangosol.config.xml.ProcessingContext;
13+
import com.tangosol.config.xml.XmlSimpleName;
14+
import com.tangosol.net.SocketProviderFactory;
15+
import com.tangosol.run.xml.XmlElement;
16+
17+
/**
18+
* An {@link ElementProcessor} that will parse a &lt;global-socket-provider&gt; and
19+
* produce the global {@link SocketProviderBuilder}.
20+
*
21+
* @author Jonathan Knight 2022.07.26
22+
* @since 22.06.2
23+
*/
24+
@XmlSimpleName("global-socket-provider")
25+
public class GlobalSocketProviderProcessor
26+
extends SocketProviderProcessor
27+
{
28+
@Override
29+
public SocketProviderBuilder process(ProcessingContext ctx, XmlElement xml) throws ConfigurationException
30+
{
31+
SocketProviderBuilder builder = super.process(ctx, xml);
32+
if (!builder.canUseGlobal())
33+
{
34+
SocketProviderFactory.setGlobalSocketProvider(builder);
35+
}
36+
return builder;
37+
}
38+
}

0 commit comments

Comments
 (0)