diff --git a/duniter4j-core-client/src/main/java/org/duniter/core/client/dao/mem/MemoryPeerDaoImpl.java b/duniter4j-core-client/src/main/java/org/duniter/core/client/dao/mem/MemoryPeerDaoImpl.java index 7e02285b85033e22394d74d80c15f5193f2d90b5..2692269d15f281d6d8330368311490d547eee69c 100644 --- a/duniter4j-core-client/src/main/java/org/duniter/core/client/dao/mem/MemoryPeerDaoImpl.java +++ b/duniter4j-core-client/src/main/java/org/duniter/core/client/dao/mem/MemoryPeerDaoImpl.java @@ -160,8 +160,8 @@ public class MemoryPeerDaoImpl implements PeerDao { @Override public void updatePeersAsDown(String currencyId, long minUpTimeInMs, Collection<String> endpointApis) { - long minUpTimeInS = Math.round(minUpTimeInMs / 1000); - long firstDownTimeInMs = Math.round(System.currentTimeMillis() / 1000); + long minUpTimeInSec = minUpTimeInMs / 1000L; + long firstDownTime = System.currentTimeMillis() / 1000L; getPeersByCurrencyId(currencyId).stream() .filter(peer -> @@ -169,13 +169,13 @@ public class MemoryPeerDaoImpl implements PeerDao { && peer.getStats().isReacheable() && ( peer.getStats().getLastUpTime() == null - || peer.getStats().getLastUpTime() < minUpTimeInS + || peer.getStats().getLastUpTime() < minUpTimeInSec ) && (endpointApis == null || endpointApis.contains(peer.getApi())) ) .forEach(peer -> { peer.getStats().setStatus(Peer.PeerStatus.DOWN); - peer.getStats().setFirstDownTime(firstDownTimeInMs); + peer.getStats().setFirstDownTime(firstDownTime); }); } diff --git a/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/Endpoints.java b/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/Endpoints.java index 206a788220359bae381e302e5da40a0bdb07f3b6..ca095458defe4ea9600e1a631c316f57983528c0 100644 --- a/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/Endpoints.java +++ b/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/Endpoints.java @@ -28,6 +28,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; +import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -54,7 +55,7 @@ public class Endpoints { // helper class } - public static NetworkPeering.Endpoint parse(String raw) throws IOException { + public static Optional<NetworkPeering.Endpoint> parse(String raw) throws IOException { NetworkPeering.Endpoint endpoint = new NetworkPeering.Endpoint(); endpoint.setRaw(raw); @@ -64,7 +65,7 @@ public class Endpoints { if (mather.matches()) { endpoint.api = EndpointApi.BASIC_MERKLED_API; parseDefaultFormatEndPoint(mather, endpoint, 1); - return endpoint; + return Optional.of(endpoint); } // BMAS API @@ -72,7 +73,7 @@ public class Endpoints { if (mather.matches()) { endpoint.api = EndpointApi.BMAS; parseDefaultFormatEndPoint(mather, endpoint, 1); - return endpoint; + return Optional.of(endpoint); } // WS2P API @@ -83,7 +84,7 @@ public class Endpoints { endpoint.api = EndpointApi.valueOf(api); endpoint.id = mather.group(2); parseDefaultFormatEndPoint(mather, endpoint, 3); - return endpoint; + return Optional.of(endpoint); } catch(Exception e) { // Unknown API throw new IOException("Unable to deserialize endpoint: WS2P api [" + api + "]", e); // link the exception @@ -97,7 +98,7 @@ public class Endpoints { try { endpoint.api = EndpointApi.valueOf(api); parseDefaultFormatEndPoint(mather, endpoint, 2); - return endpoint; + return Optional.of(endpoint); } catch(Exception e) { // Unknown API throw new IOException("Unable to deserialize endpoint: unknown api [" + api + "]", e); // link the exception @@ -105,7 +106,7 @@ public class Endpoints { } log.warn("Unable to parse Endpoint: " + raw); - return endpoint; + return Optional.empty(); } public static void parseDefaultFormatEndPoint(Matcher matcher, NetworkPeering.Endpoint endpoint, int startGroup) { diff --git a/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/NetworkPeerings.java b/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/NetworkPeerings.java index 5545c74e72ec98bb44147925612f234914318db3..d2850757a747133afa80b30948cd8e9c0746db43 100644 --- a/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/NetworkPeerings.java +++ b/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/NetworkPeerings.java @@ -80,9 +80,11 @@ public class NetworkPeerings { List<NetworkPeering.Endpoint> endpoints = Lists.newArrayList(); for (; i < lines.length - 1; ) { line = lines[i++].trim(); - NetworkPeering.Endpoint ep = Endpoints.parse(line); - Preconditions.checkNotNull(ep, "Unable to parse endpoint: " + line); - endpoints.add(ep); + NetworkPeering.Endpoint ep = Endpoints.parse(line).orElse(null); + // Add to endpoint, only if not null + if (ep != null) { + endpoints.add(ep); + } } result.setEndpoints(endpoints.toArray(new NetworkPeering.Endpoint[endpoints.size()])); diff --git a/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/jackson/EndpointDeserializer.java b/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/jackson/EndpointDeserializer.java index e892615944d70555e54bf85fed7d372da61cf041..86e694f940bff17c29cb9c31a5fd567fbd26fa32 100644 --- a/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/jackson/EndpointDeserializer.java +++ b/duniter4j-core-client/src/main/java/org/duniter/core/client/model/bma/jackson/EndpointDeserializer.java @@ -51,7 +51,7 @@ public class EndpointDeserializer extends JsonDeserializer<NetworkPeering.Endpoi String ept = jp.getText(); try { - return Endpoints.parse(ept); + return Endpoints.parse(ept).orElse(null); } catch(IOException e) { // Unable to parse endpoint: continue (will skip this endpoint) if (debug) { diff --git a/duniter4j-core-client/src/test/java/org/duniter/core/client/model/bma/EndpointsTest.java b/duniter4j-core-client/src/test/java/org/duniter/core/client/model/bma/EndpointsTest.java index 3271e2664943f9bffc3415200801b7d7449c7471..ec1da27f243fd4ed0ce1fe5282978cb1d83d8c71 100644 --- a/duniter4j-core-client/src/test/java/org/duniter/core/client/model/bma/EndpointsTest.java +++ b/duniter4j-core-client/src/test/java/org/duniter/core/client/model/bma/EndpointsTest.java @@ -9,7 +9,7 @@ public class EndpointsTest { public void parse() throws Exception { // Parse valid endpoints - NetworkPeering.Endpoint ep = Endpoints.parse("BASIC_MERKLED_API g1.duniter.fr 81.81.81.81 80"); + NetworkPeering.Endpoint ep = Endpoints.parse("BASIC_MERKLED_API g1.duniter.fr 81.81.81.81 80").orElse(null); Assert.assertNotNull(ep); Assert.assertEquals(EndpointApi.BASIC_MERKLED_API, ep.api); Assert.assertEquals("g1.duniter.fr", ep.dns); @@ -19,7 +19,7 @@ public class EndpointsTest { Assert.assertNull(ep.id); Assert.assertNull(ep.path); - ep = Endpoints.parse("BMAS g1.duniter.fr 443"); + ep = Endpoints.parse("BMAS g1.duniter.fr 443").orElse(null); Assert.assertNotNull(ep); Assert.assertEquals(EndpointApi.BMAS, ep.api); Assert.assertEquals("g1.duniter.fr", ep.dns); @@ -28,7 +28,7 @@ public class EndpointsTest { Assert.assertNull(ep.id); Assert.assertNull(ep.path); - ep = Endpoints.parse("WS2P fb17fcd4 g1.duniter.fr 443 /ws2p"); + ep = Endpoints.parse("WS2P fb17fcd4 g1.duniter.fr 443 /ws2p").orElse(null); Assert.assertNotNull(ep); Assert.assertNotNull(ep.id); Assert.assertNotNull(ep.path); @@ -38,13 +38,13 @@ public class EndpointsTest { Assert.assertEquals(443, ep.port.intValue()); // ws2pId on 7 characters - ep = Endpoints.parse("WS2P 90e9b12 duniter.g1.1000i100.fr 443 /ws2p"); + ep = Endpoints.parse("WS2P 90e9b12 duniter.g1.1000i100.fr 443 /ws2p").orElse(null); Assert.assertNotNull(ep); Assert.assertEquals(ep.api, EndpointApi.WS2P); Assert.assertNotNull(ep.id); Assert.assertNotNull(ep.path); - ep = Endpoints.parse("WS2PTOR 1be86653 3k2zovlpihbt3j3g.onion 20901"); + ep = Endpoints.parse("WS2PTOR 1be86653 3k2zovlpihbt3j3g.onion 20901").orElse(null); Assert.assertNotNull(ep); Assert.assertNotNull(ep.id); Assert.assertNull(ep.path); @@ -53,7 +53,7 @@ public class EndpointsTest { Assert.assertNotNull(ep.port); Assert.assertEquals(20901, ep.port.intValue()); - ep = Endpoints.parse("GCHANGE_API data.gchange.fr 443"); + ep = Endpoints.parse("GCHANGE_API data.gchange.fr 443").orElse(null); Assert.assertNotNull(ep); Assert.assertEquals(ep.api, EndpointApi.GCHANGE_API); Assert.assertNull(ep.id); @@ -61,20 +61,17 @@ public class EndpointsTest { // Parse Invalid endpoints - // FIXME: make sure this must failed (missing port) - ep = Endpoints.parse("BMAS g1.cgeek.fr"); - Assert.assertNotNull(ep); - Assert.assertNull(ep.api); + // This must failed (missing port) + ep = Endpoints.parse("BMAS g1.cgeek.fr").orElse(null); + Assert.assertNull(ep); - // FIXME: make sure this must failed (because bad ID) - ep = Endpoints.parse("WS2P R8t2sg7w g1.ambau.ovh 443"); - Assert.assertNotNull(ep); - Assert.assertNull(ep.api); + // This must failed (because bad ID) + ep = Endpoints.parse("WS2P R8t2sg7w g1.ambau.ovh 443").orElse(null); + Assert.assertNull(ep); - // FIXME: make sure this must failed (missing path first '/') - ep = Endpoints.parse("WS2P 90e9b12 duniter.g1.1000i100.fr 443 ws2p"); - Assert.assertNotNull(ep); - Assert.assertNull(ep.api); + // This must failed (missing path first '/') + ep = Endpoints.parse("WS2P 90e9b12 duniter.g1.1000i100.fr 443 ws2p").orElse(null); + Assert.assertNull(ep); } } diff --git a/duniter4j-core-client/src/test/resources/duniter4j-core-client-test.properties b/duniter4j-core-client/src/test/resources/duniter4j-core-client-test.properties index de6f268f00007ff207b88204433c68c0192e0f09..5d010a60aa627012851a0e62ba36d5233f756f9d 100644 --- a/duniter4j-core-client/src/test/resources/duniter4j-core-client-test.properties +++ b/duniter4j-core-client/src/test/resources/duniter4j-core-client-test.properties @@ -1,5 +1,5 @@ duniter4j.node.host=g1-test.duniter.org -duniter4j.node.port=10900 +duniter4j.node.port=443 duniter4j.node.elasticsearch.host=localhost duniter4j.node.elasticsearch.port=9200