Skip to content

Commit a951cb9

Browse files
authored
Merge pull request aol#375 from jijisv/application_registry_filter
Application registry filter
2 parents b8c375b + 12352ab commit a951cb9

File tree

9 files changed

+349
-90
lines changed

9 files changed

+349
-90
lines changed

micro-application-register/src/main/java/com/aol/micro/server/application/registry/Finder.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import java.io.File;
44
import java.util.ArrayList;
55
import java.util.List;
6+
import java.util.Optional;
7+
import java.util.stream.Collectors;
68
import java.util.stream.Stream;
79

810
import org.apache.commons.io.FileUtils;
@@ -24,8 +26,13 @@ public Finder(RegisterConfig config) {
2426
this.config = config;
2527
}
2628

27-
public List<RegisterEntry> find() {
28-
return findDir(new File(config.getOutputDir()));
29+
public List<RegisterEntry> find(final Optional<RegisterEntry> re) {
30+
31+
List<RegisterEntry> entries = findDir(new File(config.getOutputDir()));
32+
if (re.isPresent()) {
33+
entries = entries.stream().filter( e -> e.matches(re.get())).collect(Collectors.toList());
34+
}
35+
return entries;
2936
}
3037

3138
private List<RegisterEntry> findDir(File dir) {
Lines changed: 46 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
package com.aol.micro.server.application.registry;
22

33
import java.text.SimpleDateFormat;
4-
import java.util.Date;
5-
import java.util.List;
6-
import java.util.Map;
7-
import java.util.UUID;
4+
import java.util.*;
85

6+
import javax.ws.rs.QueryParam;
97
import javax.xml.bind.annotation.XmlAccessType;
108
import javax.xml.bind.annotation.XmlAccessorType;
119
import javax.xml.bind.annotation.XmlRootElement;
@@ -14,6 +12,7 @@
1412
import lombok.AccessLevel;
1513
import lombok.Builder;
1614
import lombok.Getter;
15+
import lombok.ToString;
1716
import lombok.experimental.FieldDefaults;
1817
import lombok.experimental.Wither;
1918

@@ -24,43 +23,44 @@
2423
@Getter
2524
@Wither
2625
@Builder
26+
@ToString
2727
public class RegisterEntry {
2828

29-
private static SimpleDateFormat f = new SimpleDateFormat(
30-
"EEE, d MMM yyyy HH:mm:ss Z");
29+
private static SimpleDateFormat f = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z");
3130
@Wither
32-
int port;
31+
private final int port;
3332
@Wither
34-
String hostname;
33+
private final String hostname;
3534
@Wither
36-
String module;
35+
private final String module;
3736
@Wither
38-
String context;
39-
Date time;
37+
private final String context;
38+
private final Date time;
4039
@Wither
41-
String uuid;
40+
private final String uuid;
4241
@Wither
43-
String target;
44-
String formattedDate;
45-
Map<String, String> manifest = ManifestLoader.instance.getManifest();
42+
private final String target;
43+
private final String formattedDate;
44+
private final Map<String, String> manifest = new HashMap<>();
4645
@Wither
47-
Health health;
46+
private final Health health;
4847
@Wither
49-
List<Map<String, Map<String, String>>> stats;
48+
private final List<Map<String, Map<String, String>>> stats;
5049
@Wither
51-
int externalPort;
50+
private final int externalPort;
5251

5352
public RegisterEntry() {
54-
this(
55-
-1, null, null, null, null, null, null, -1);
53+
this(-1, null, null, null, null, null, null, -1);
5654
}
5755

5856
public RegisterEntry(int port, String hostname, String module, String context, Date time, String uuid,
59-
String target, int externalPort) {
60-
this(
61-
port, hostname, module, context, time, UUID.randomUUID()
62-
.toString(),
63-
target, null, Health.OK, null, externalPort);
57+
String target, int externalPort) {
58+
this(port, hostname, module, context, time, uuid, target, null, Health.OK, null, externalPort);
59+
}
60+
61+
public RegisterEntry(int port, String hostname, String module, String context, Date time, String target,
62+
int externalPort) {
63+
this(port, hostname, module, context, time, UUID.randomUUID().toString(), target, externalPort);
6464
}
6565

6666
private RegisterEntry(int port, String hostname, String module, String context, Date time, String uuid,
@@ -82,14 +82,28 @@ private RegisterEntry(int port, String hostname, String module, String context,
8282
else
8383
this.formattedDate = null;
8484

85+
this.manifest.putAll(ManifestLoader.instance.getManifest());
86+
8587
}
8688

87-
public RegisterEntry(int port, String hostname, String module, String context, Date time, String target,
88-
int externalPort) {
89-
this(
90-
port, hostname, module, context, time, UUID.randomUUID()
91-
.toString(),
92-
target, externalPort);
89+
public boolean matches(RegisterEntry re) {
90+
//Only the fields which make sense to query is added for now.
91+
return (re.port == -1 || re.port == port) &&
92+
(Objects.isNull(re.hostname) || Objects.nonNull(hostname) && hostname.startsWith(re.hostname)) &&
93+
(Objects.isNull(re.module) || Objects.nonNull(module) && module.startsWith(re.module)) &&
94+
(Objects.isNull(re.context) || Objects.nonNull(context) && context.startsWith(re.context)) &&
95+
(Objects.isNull(re.health) || re.health.equals(health)) &&
96+
(re.externalPort == -1 || re.externalPort == externalPort) &&
97+
(Objects.isNull(re.manifest) || re.manifest.isEmpty() || matchManifest(re.manifest));
98+
}
99+
100+
private boolean matchManifest(Map<String, String> manifest) {
101+
return match(manifest, this.manifest, "Implementation-revision") &&
102+
match(manifest, this.manifest, "Implementation-Timestamp") &&
103+
match(manifest, this.manifest, "Implementation-Version");
93104
}
94105

95-
}
106+
private boolean match(Map<String, String> map1, Map<String, String> map2, String key) {
107+
return !map1.containsKey(key) || (map2.containsKey(key) && map2.get(key).startsWith(map1.get(key)));
108+
}
109+
}

micro-application-register/src/main/java/com/aol/micro/server/application/registry/ServiceRegistryResource.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
package com.aol.micro.server.application.registry;
22

33
import java.util.Arrays;
4+
import java.util.Optional;
45

5-
import javax.ws.rs.Consumes;
6-
import javax.ws.rs.GET;
7-
import javax.ws.rs.POST;
8-
import javax.ws.rs.Path;
9-
import javax.ws.rs.Produces;
6+
import javax.ws.rs.*;
107
import javax.ws.rs.container.AsyncResponse;
118
import javax.ws.rs.container.Suspended;
9+
import javax.ws.rs.core.Context;
10+
import javax.ws.rs.core.Response;
11+
import javax.ws.rs.core.Response.Status;
12+
import javax.ws.rs.core.UriInfo;
1213

1314
import cyclops.stream.ReactiveSeq;
1415
import org.slf4j.Logger;
@@ -20,6 +21,8 @@
2021
import com.aol.micro.server.auto.discovery.Rest;
2122
import com.aol.micro.server.utility.HashMapBuilder;
2223

24+
import static javax.ws.rs.core.Response.Status.*;
25+
2326

2427
@Rest
2528
@Path("/service-registry")
@@ -42,18 +45,17 @@ public ServiceRegistryResource(Cleaner cleaner, Finder finder, Register register
4245
@GET
4346
@Path("/list")
4447
@Produces("application/json")
45-
public void list(@Suspended AsyncResponse response) {
48+
public void list(@Context UriInfo uriInfo, @Suspended AsyncResponse response) {
4649
ReactiveSeq.of(this).foldFuture(WorkerThreads.ioExecutor.get(),
4750
s->s.forEach(Long.MAX_VALUE,next -> {
4851
try{
4952
cleaner.clean();
50-
response.resume(finder.find());
53+
response.resume(finder.find(UriInfoParser.toRegisterEntry(uriInfo)));
5154
}catch(Exception e){
5255
logger.error(e.getMessage(),e);
53-
response.resume(Arrays.asList("failed due to error"));
56+
response.resume(Arrays.asList("Bad Request: " + e.getMessage()));
5457
}
5558
}));
56-
5759
}
5860

5961
@POST
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.aol.micro.server.application.registry;
2+
3+
import cyclops.stream.ReactiveSeq;
4+
5+
import javax.ws.rs.core.MultivaluedMap;
6+
import javax.ws.rs.core.UriInfo;
7+
import java.util.Arrays;
8+
import java.util.Map;
9+
import java.util.Objects;
10+
import java.util.Optional;
11+
12+
public class UriInfoParser {
13+
14+
public static Optional<RegisterEntry> toRegisterEntry(UriInfo uriInfo) {
15+
if (uriInfo.getQueryParameters().isEmpty()) {
16+
return Optional.empty();
17+
} else {
18+
MultivaluedMap<String, String> parameters = uriInfo.getQueryParameters();
19+
RegisterEntry re = RegisterEntry.builder()
20+
.context(parameters.getFirst("context"))
21+
.hostname(parameters.getFirst("hostname"))
22+
.port(toInt(parameters.getFirst("port")))
23+
.target(parameters.getFirst("target"))
24+
.externalPort(toInt(parameters.getFirst("externalPort")))
25+
.module(parameters.getFirst("module"))
26+
.health(toHealth(parameters.getFirst("health")))
27+
.build();
28+
29+
Map<String, String> manifest = ReactiveSeq.fromIterable(parameters.entrySet())
30+
.filter(e -> e.getKey().startsWith("manifest."))
31+
.toMap(e -> e.getKey().replace("manifest.", ""), e -> parameters.getFirst(e.getKey()));
32+
33+
re.getManifest().clear();
34+
re.getManifest().putAll(manifest);
35+
36+
return Optional.of(re);
37+
}
38+
}
39+
40+
private static Health toHealth(String health) {
41+
if (Objects.nonNull(health)) {
42+
try {
43+
return Health.valueOf(health);
44+
} catch (Exception e) {
45+
throw new IllegalArgumentException("'" + health + "' is not valid, valid values are " +
46+
Arrays.asList(Health.values()));
47+
}
48+
}
49+
return null;
50+
}
51+
52+
private static int toInt(String port) {
53+
if (Objects.isNull(port))
54+
return -1;
55+
56+
try {
57+
return Integer.valueOf(port);
58+
} catch (Exception e) {
59+
throw new IllegalArgumentException("'" + port + "' is not a valid number.");
60+
}
61+
}
62+
63+
}

0 commit comments

Comments
 (0)