package io.muoncore.examples; import io.muoncore.Muon; import io.muoncore.MuonBuilder; import io.muoncore.ServiceDescriptor; import io.muoncore.config.AutoConfiguration; import io.muoncore.config.MuonConfigBuilder; import io.muoncore.protocol.reactivestream.server.PublisherLookup; import io.muoncore.protocol.requestresponse.Response; import org.reactivestreams.Publisher; import reactor.rx.Streams; import java.io.IOException; import java.net.URISyntaxException; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.stream.Collectors; import static io.muoncore.protocol.requestresponse.server.HandlerPredicates.path; /** * An implementation of the Muon HTTP TCK Resources to prove compatibility of the library */ public class TCKService { public static void main(String[] args) throws URISyntaxException, KeyManagementException, NoSuchAlgorithmException, IOException, InterruptedException { String serviceName = "tckservice"; AutoConfiguration config = MuonConfigBuilder.withServiceIdentifier(serviceName).build(); Muon muon = MuonBuilder.withConfig(config).build(); muon.getDiscovery().blockUntilReady(); outboundResourcesSetup(muon); inboundResourcesSetup(muon); streamPublisher(muon); } private static void outboundResourcesSetup(final Muon muon) { final Map storedata = new HashMap(); muon.handleRequest(path("/invokeresponse-store"), queryEvent -> queryEvent.ok(storedata) ); muon.handleRequest(path("/invokeresponse"), queryEvent -> { String url = (String) queryEvent.getRequest().getPayload(Map.class).get("resource"); Response result = null; try { result = muon.request(url, Map.class).get(); storedata.clear(); storedata.putAll(result.getPayload(Map.class)); queryEvent.ok(result.getPayload(Map.class)); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } ); } private static void streamPublisher(Muon muon) { Publisher<Long> pub = Streams.range(1, 100); muon.publishSource("/myStream", PublisherLookup.PublisherType.COLD, pub); } private static void inboundResourcesSetup(final Muon muon) { muon.handleRequest(path("/echo"), queryEvent -> { Map obj = queryEvent.getRequest().getPayload(Map.class); obj.put("method", "GET"); queryEvent.ok(obj); }); muon.handleRequest(path("/discover"), request -> request.ok( muon.getDiscovery().getKnownServices().stream().map(ServiceDescriptor::getIdentifier).collect(Collectors.toList()))); } }