Skip to content

Commit 0d1a092

Browse files
authored
Merge pull request #781 from scalecube/add-credentialsSupplier-api
Add credentials supplier api
2 parents c44986d + 19bd016 commit 0d1a092

File tree

46 files changed

+1425
-653
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+1425
-653
lines changed

services-api/src/main/java/io/scalecube/services/ServiceCall.java

Lines changed: 27 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
package io.scalecube.services;
22

3-
import static java.util.Objects.requireNonNull;
4-
5-
import io.scalecube.net.Address;
63
import io.scalecube.services.api.ErrorData;
74
import io.scalecube.services.api.ServiceMessage;
85
import io.scalecube.services.exceptions.DefaultErrorMapper;
@@ -162,17 +159,6 @@ public Mono<Void> oneWay(ServiceMessage request) {
162159
return Mono.defer(() -> requestOne(request, Void.class).then());
163160
}
164161

165-
/**
166-
* Issues fire-and-forget request.
167-
*
168-
* @param request request message to send.
169-
* @param address of remote target service to invoke.
170-
* @return mono publisher completing normally or with error.
171-
*/
172-
public Mono<Void> oneWay(ServiceMessage request, Address address) {
173-
return Mono.defer(() -> requestOne(request, Void.class, address).then());
174-
}
175-
176162
/**
177163
* Issues request-and-reply request.
178164
*
@@ -187,48 +173,31 @@ public Mono<ServiceMessage> requestOne(ServiceMessage request) {
187173
* Issues request-and-reply request.
188174
*
189175
* @param request request message to send.
190-
* @param responseType type of response.
176+
* @param responseType type of response (optional).
191177
* @return mono publisher completing with single response message or with error.
192178
*/
193179
public Mono<ServiceMessage> requestOne(ServiceMessage request, Type responseType) {
194180
return Mono.defer(
195181
() -> {
196-
Objects.requireNonNull(request.qualifier(), "qualifier");
197-
198182
ServiceMethodInvoker methodInvoker;
199183
if (methodRegistry != null
200184
&& (methodInvoker = methodRegistry.getInvoker(request.qualifier())) != null) {
201185
// local service
202186
return methodInvoker.invokeOne(request).map(this::throwIfError);
203187
} else {
204188
// remote service
205-
return Mono.fromCallable(() -> addressLookup(request))
206-
.flatMap(address -> requestOne(request, responseType, address));
189+
Objects.requireNonNull(transport, "[requestOne] transport");
190+
return Mono.fromCallable(() -> serviceLookup(request))
191+
.flatMap(
192+
serviceReference ->
193+
transport
194+
.create(serviceReference)
195+
.requestResponse(request, responseType)
196+
.map(this::throwIfError));
207197
}
208198
});
209199
}
210200

211-
/**
212-
* Given an address issues request-and-reply request to a remote address.
213-
*
214-
* @param request request message to send.
215-
* @param responseType type of response.
216-
* @param address of remote target service to invoke.
217-
* @return mono publisher completing with single response message or with error.
218-
*/
219-
public Mono<ServiceMessage> requestOne(
220-
ServiceMessage request, Type responseType, Address address) {
221-
return Mono.defer(
222-
() -> {
223-
requireNonNull(address, "requestOne address parameter is required and must not be null");
224-
requireNonNull(transport, "transport is required and must not be null");
225-
return transport
226-
.create(address)
227-
.requestResponse(request, responseType)
228-
.map(this::throwIfError);
229-
});
230-
}
231-
232201
/**
233202
* Issues request to service which returns stream of service messages back.
234203
*
@@ -243,49 +212,31 @@ public Flux<ServiceMessage> requestMany(ServiceMessage request) {
243212
* Issues request to service which returns stream of service messages back.
244213
*
245214
* @param request request with given headers.
246-
* @param responseType type of responses.
215+
* @param responseType type of responses (optional).
247216
* @return flux publisher of service responses.
248217
*/
249218
public Flux<ServiceMessage> requestMany(ServiceMessage request, Type responseType) {
250219
return Flux.defer(
251220
() -> {
252-
Objects.requireNonNull(request.qualifier(), "qualifier");
253-
254221
ServiceMethodInvoker methodInvoker;
255222
if (methodRegistry != null
256223
&& (methodInvoker = methodRegistry.getInvoker(request.qualifier())) != null) {
257224
// local service
258225
return methodInvoker.invokeMany(request).map(this::throwIfError);
259226
} else {
260227
// remote service
261-
return Mono.fromCallable(() -> addressLookup(request))
262-
.flatMapMany(address -> requestMany(request, responseType, address));
228+
Objects.requireNonNull(transport, "[requestMany] transport");
229+
return Mono.fromCallable(() -> serviceLookup(request))
230+
.flatMapMany(
231+
serviceReference ->
232+
transport
233+
.create(serviceReference)
234+
.requestStream(request, responseType)
235+
.map(this::throwIfError));
263236
}
264237
});
265238
}
266239

267-
/**
268-
* Given an address issues request to remote service which returns stream of service messages
269-
* back.
270-
*
271-
* @param request request with given headers.
272-
* @param responseType type of responses.
273-
* @param address of remote target service to invoke.
274-
* @return flux publisher of service responses.
275-
*/
276-
public Flux<ServiceMessage> requestMany(
277-
ServiceMessage request, Type responseType, Address address) {
278-
return Flux.defer(
279-
() -> {
280-
requireNonNull(address, "requestMany address parameter is required and must not be null");
281-
requireNonNull(transport, "transport is required and must not be null");
282-
return transport
283-
.create(address)
284-
.requestStream(request, responseType)
285-
.map(this::throwIfError);
286-
});
287-
}
288-
289240
/**
290241
* Issues stream of service requests to service which returns stream of service messages back.
291242
*
@@ -300,7 +251,7 @@ public Flux<ServiceMessage> requestBidirectional(Publisher<ServiceMessage> publi
300251
* Issues stream of service requests to service which returns stream of service messages back.
301252
*
302253
* @param publisher of service requests.
303-
* @param responseType type of responses.
254+
* @param responseType type of responses (optional).
304255
* @return flux publisher of service responses.
305256
*/
306257
public Flux<ServiceMessage> requestBidirectional(
@@ -310,47 +261,27 @@ public Flux<ServiceMessage> requestBidirectional(
310261
(first, messages) -> {
311262
if (first.hasValue()) {
312263
ServiceMessage request = first.get();
313-
Objects.requireNonNull(request.qualifier(), "qualifier");
314-
315264
ServiceMethodInvoker methodInvoker;
316265
if (methodRegistry != null
317266
&& (methodInvoker = methodRegistry.getInvoker(request.qualifier())) != null) {
318267
// local service
319268
return methodInvoker.invokeBidirectional(messages).map(this::throwIfError);
320269
} else {
321270
// remote service
322-
return Mono.fromCallable(() -> addressLookup(request))
271+
Objects.requireNonNull(transport, "[requestBidirectional] transport");
272+
return Mono.fromCallable(() -> serviceLookup(request))
323273
.flatMapMany(
324-
address -> requestBidirectional(messages, responseType, address));
274+
serviceReference ->
275+
transport
276+
.create(serviceReference)
277+
.requestChannel(messages, responseType)
278+
.map(this::throwIfError));
325279
}
326280
}
327281
return messages;
328282
});
329283
}
330284

331-
/**
332-
* Given an address issues stream of service requests to service which returns stream of service
333-
* messages back.
334-
*
335-
* @param publisher of service requests.
336-
* @param responseType type of responses.
337-
* @param address of remote target service to invoke.
338-
* @return flux publisher of service responses.
339-
*/
340-
public Flux<ServiceMessage> requestBidirectional(
341-
Publisher<ServiceMessage> publisher, Type responseType, Address address) {
342-
return Flux.defer(
343-
() -> {
344-
requireNonNull(
345-
address, "requestBidirectional address parameter is required and must not be null");
346-
requireNonNull(transport, "transport is required and must not be null");
347-
return transport
348-
.create(address)
349-
.requestChannel(publisher, responseType)
350-
.map(this::throwIfError);
351-
});
352-
}
353-
354285
/**
355286
* Create proxy creates a java generic proxy instance by a given service interface.
356287
*
@@ -416,10 +347,9 @@ public Object invoke(Object proxy, Method method, Object[] params) {
416347
});
417348
}
418349

419-
private Address addressLookup(ServiceMessage request) {
350+
private ServiceReference serviceLookup(ServiceMessage request) {
420351
return router
421352
.route(serviceRegistry, request)
422-
.map(ServiceReference::address)
423353
.orElseThrow(() -> noReachableMemberException(request));
424354
}
425355

services-api/src/main/java/io/scalecube/services/ServiceEndpoint.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,11 @@ public class ServiceEndpoint implements Externalizable {
2929
private Collection<ServiceRegistration> serviceRegistrations;
3030

3131
/**
32-
* Constructor for SerDe.
32+
* Constructor for de/serialization purpose.
3333
*
3434
* @deprecated exposed only for de/serialization purpose.
3535
*/
36+
@Deprecated
3637
public ServiceEndpoint() {}
3738

3839
private ServiceEndpoint(Builder builder) {
@@ -112,7 +113,7 @@ public void writeExternal(ObjectOutput out) throws IOException {
112113
out.writeInt(tags.size());
113114
for (Entry<String, String> entry : tags.entrySet()) {
114115
out.writeUTF(entry.getKey());
115-
out.writeUTF(entry.getValue());
116+
out.writeObject(entry.getValue()); // value is nullable
116117
}
117118

118119
// serviceRegistrations
@@ -143,7 +144,7 @@ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundExcept
143144
Map<String, String> tags = new HashMap<>(tagsSize);
144145
for (int i = 0; i < tagsSize; i++) {
145146
String key = in.readUTF();
146-
String value = in.readUTF();
147+
String value = (String) in.readObject(); // value is nullable
147148
tags.put(key, value);
148149
}
149150
this.tags = Collections.unmodifiableMap(tags);

services-api/src/main/java/io/scalecube/services/ServiceInfo.java

Lines changed: 5 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.scalecube.services;
22

3-
import io.scalecube.services.auth.Authenticator;
43
import io.scalecube.services.auth.PrincipalMapper;
54
import io.scalecube.services.exceptions.ServiceProviderErrorMapper;
65
import io.scalecube.services.transport.api.ServiceMessageDataDecoder;
@@ -16,15 +15,13 @@ public class ServiceInfo {
1615
private final Map<String, String> tags;
1716
private final ServiceProviderErrorMapper errorMapper;
1817
private final ServiceMessageDataDecoder dataDecoder;
19-
private final Authenticator<Object> authenticator;
2018
private final PrincipalMapper<Object, Object> principalMapper;
2119

2220
private ServiceInfo(Builder builder) {
2321
this.serviceInstance = builder.serviceInstance;
2422
this.tags = Collections.unmodifiableMap(new HashMap<>(builder.tags));
2523
this.errorMapper = builder.errorMapper;
2624
this.dataDecoder = builder.dataDecoder;
27-
this.authenticator = builder.authenticator;
2825
this.principalMapper = builder.principalMapper;
2926
}
3027

@@ -52,10 +49,6 @@ public ServiceMessageDataDecoder dataDecoder() {
5249
return dataDecoder;
5350
}
5451

55-
public Authenticator<Object> authenticator() {
56-
return authenticator;
57-
}
58-
5952
public PrincipalMapper<Object, Object> principalMapper() {
6053
return principalMapper;
6154
}
@@ -67,26 +60,23 @@ public String toString() {
6760
.add("tags(" + tags.size() + ")")
6861
.add("errorMapper=" + errorMapper)
6962
.add("dataDecoder=" + dataDecoder)
70-
.add("authenticator=" + authenticator)
7163
.add("principalMapper=" + principalMapper)
7264
.toString();
7365
}
7466

7567
public static class Builder {
7668

77-
private Object serviceInstance;
78-
private Map<String, String> tags = new HashMap<>();
69+
private final Object serviceInstance;
70+
private final Map<String, String> tags = new HashMap<>();
7971
private ServiceProviderErrorMapper errorMapper;
8072
private ServiceMessageDataDecoder dataDecoder;
81-
private Authenticator<Object> authenticator;
8273
private PrincipalMapper<Object, Object> principalMapper;
8374

8475
private Builder(ServiceInfo serviceInfo) {
8576
this.serviceInstance = serviceInfo.serviceInstance;
8677
this.tags.putAll(new HashMap<>(serviceInfo.tags));
8778
this.errorMapper = serviceInfo.errorMapper;
8879
this.dataDecoder = serviceInfo.dataDecoder;
89-
this.authenticator = serviceInfo.authenticator;
9080
this.principalMapper = serviceInfo.principalMapper;
9181
}
9282

@@ -131,31 +121,16 @@ public Builder dataDecoder(ServiceMessageDataDecoder dataDecoder) {
131121
return this;
132122
}
133123

134-
/**
135-
* Setter for {@code authenticator}. Overrides default {@code Microservices.authenticator}.
136-
*
137-
* @param authenticator authenticator
138-
* @param <T> type of auth data returned by authenticator
139-
* @return this builder
140-
*/
141-
@SuppressWarnings("unchecked")
142-
public <T> Builder authenticator(Authenticator<? extends T> authenticator) {
143-
Objects.requireNonNull(authenticator, "authenticator");
144-
this.authenticator = (Authenticator<Object>) authenticator;
145-
return this;
146-
}
147-
148124
/**
149125
* Setter for {@code principalMapper}. Overrides default {@code Microservices.principalMapper}.
150126
*
151127
* @param principalMapper principalMapper
152-
* @param <A> type of auth data returned by authenticator
153-
* @param <T> type of principal after mapping auth data to principal
128+
* @param <T> auth data type
129+
* @param <R> principal type
154130
* @return this builder
155131
*/
156132
@SuppressWarnings("unchecked")
157-
public <A, T> Builder principalMapper(
158-
PrincipalMapper<? extends A, ? extends T> principalMapper) {
133+
public <T, R> Builder principalMapper(PrincipalMapper<? super T, ? extends R> principalMapper) {
159134
Objects.requireNonNull(principalMapper, "principalMapper");
160135
this.principalMapper = (PrincipalMapper<Object, Object>) principalMapper;
161136
return this;
@@ -175,13 +150,6 @@ Builder dataDecoderIfAbsent(ServiceMessageDataDecoder dataDecoder) {
175150
return this;
176151
}
177152

178-
Builder authenticatorIfAbsent(Authenticator<Object> authenticator) {
179-
if (this.authenticator == null) {
180-
this.authenticator = authenticator;
181-
}
182-
return this;
183-
}
184-
185153
Builder principalMapperIfAbsent(PrincipalMapper<Object, Object> principalMapper) {
186154
if (this.principalMapper == null) {
187155
this.principalMapper = principalMapper;

services-api/src/main/java/io/scalecube/services/ServiceMethodDefinition.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,11 @@ public class ServiceMethodDefinition implements Externalizable {
2424
private boolean isSecured;
2525

2626
/**
27-
* Constructor for SerDe.
27+
* Constructor for de/serialization purpose.
2828
*
2929
* @deprecated exposed only for de/serialization purpose.
3030
*/
31+
@Deprecated
3132
public ServiceMethodDefinition() {}
3233

3334
/**

services-api/src/main/java/io/scalecube/services/ServiceRegistration.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,11 @@ public class ServiceRegistration implements Externalizable {
2323
private Collection<ServiceMethodDefinition> methods;
2424

2525
/**
26-
* Constructor for SerDe.
26+
* Constructor for de/serialization purpose.
2727
*
2828
* @deprecated exposed only for de/serialization purpose.
2929
*/
30+
@Deprecated
3031
public ServiceRegistration() {}
3132

3233
/**

0 commit comments

Comments
 (0)