package org.kne.cloud.network.srv6; import java.io.IOException; import java.lang.ref.Cleaner; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.ArrayList; import java.util.UUID; import java.util.function.BiConsumer; import org.kne.cloud.network.MultipurposeSocketAddress; import org.kne.cloud.network.ThreadTool; import org.kne.cloud.network.congress.SendPacketSlidingWindow; import org.kne.cloud.network.klalb.KLALBController; import org.kne.opencl64.Releaser; public class KLALBRoutingProtocolAPIServer { private KLALBController controller; private KLALBRoutingProtocol routingProtocol; private static final Cleaner clr=Cleaner.create(); private BiConsumer rec=(addr,data)->{ try { KLALBRoutingProtocolJsonData dataobj= data.getDecodedData(); InetSocketAddress addrs=(InetSocketAddress) addr; switch(dataobj.getType()){ case KLALBRoutingProtocolJsonData.OPEN_LINES_REQ: KLALBRoutingProtocolJsonData json=new KLALBRoutingProtocolJsonData(KLALBRoutingProtocolJsonData.OPEN_LINES_RESP,dataobj.getUuid(),controller.getSelflineTable()); routingProtocol.sendJsonPacketToAddress(new JsonDataPacket(json),addr); break; } } catch (IOException e) { e.printStackTrace(); } }; public KLALBRoutingProtocolAPIServer(KLALBRoutingProtocol routingProtocol,KLALBController controller) { this.controller=controller; this.routingProtocol=routingProtocol; routingProtocol.addReceiver(rec); this.releaser=new KLALBRoutingProtocolAPIServerReleaser(this.routingProtocol,rec); clr.register(this, releaser); } public KLALBController getController() { return controller; } public KLALBRoutingProtocol getRoutingProtocol() { return routingProtocol; } private KLALBRoutingProtocolAPIServerReleaser releaser; public void close() { releaser.run(); } public boolean isClosed() { return releaser.isReleased(); } } class KLALBRoutingProtocolAPIServerReleaser extends Releaser>{ private KLALBRoutingProtocol routingProtocol; public KLALBRoutingProtocolAPIServerReleaser(KLALBRoutingProtocol routingProtocol,BiConsumer resource) { super(resource); this.routingProtocol=routingProtocol; } @Override protected void release(BiConsumer resource) { routingProtocol.removeReceiver(resource); } }