// Path: src/main/java/com/sulaco/fuse/util/IdSource.java
// public class IdSource {
// 
//     static final AtomicInteger intSource  = new AtomicInteger(0);
//     static final AtomicLong    longSource = new AtomicLong(0);
// 
//     public static int getInt() {
//         return intSource.incrementAndGet();
//     }
// 
//     public static long getLong() {
//         return longSource.incrementAndGet();
//     }
// 
//     public static UUID getUUID() {
//         return UUID.randomUUID();
//     }
// 
// }
// 
// Path: src/main/java/com/sulaco/fuse/akka/message/FuseRequestMessageImpl.java
// public class FuseRequestMessageImpl implements FuseRequestMessage {
// 
//     long id;
// 
//     HttpRequest incomingRequest;
// 
//     ChannelHandlerContext channelContext;
// 
//     Route route;
//     
//     volatile boolean flushed = false;
//     
//     public FuseRequestMessageImpl(long id, ChannelHandlerContext context, HttpRequest request) {
//         this.id = id;
//         this.channelContext  = context;
//         this.incomingRequest = request;
//     }
// 
//     @Override
//     public long getId() {
//         return id;
//     }
// 
//     @Override
//     public HttpRequest getRequest() {
//         return incomingRequest;
//     }
// 
//     @Override
//     public ChannelHandlerContext getChannelContext() {
//         return channelContext;
//     }
// 
//     @Override
//     public RouteHandler getHandler() {
//         return route.getHandler();
//     }
// 
//     @Override
//     public Map<String, String> getParams() {
//         return route.getParams();
//     }
// 
//     @Override
//     public Optional<String> getParam(String name) {
//         return route.getParam(name);
//     }
// 
//     @Override
//     public <T> Optional<T> getParam(String name, Class<T> clazz) {
//         Optional<String> param = route.getParam(name);
//         return param.map(v -> PrimitiveConverters.convert(v, clazz));
//     }
// 
//     @Override
//     public String getRequestBody() {
//         return ((DefaultFullHttpRequest) incomingRequest).content().toString(charset_utf8);
//     }
// 
//     public void setRoute(Route route) {
//         this.route = route;
//     }
// 
//     @Override
//     public void flush() {
//         channelContext.flush();
//         flushed = true;
//     }
// 
//     @Override
//     public boolean flushed() {
//         return flushed;
//     }
// 
//     private static final Charset charset_utf8 = Charset.forName("UTF-8");
//     
// }
// 
// Path: src/main/java/com/sulaco/fuse/util/IdSource.java
// public class IdSource {
// 
//     static final AtomicInteger intSource  = new AtomicInteger(0);
//     static final AtomicLong    longSource = new AtomicLong(0);
// 
//     public static int getInt() {
//         return intSource.incrementAndGet();
//     }
// 
//     public static long getLong() {
//         return longSource.incrementAndGet();
//     }
// 
//     public static UUID getUUID() {
//         return UUID.randomUUID();
//     }
// 
// }


import com.sulaco.fuse.util.IdSource;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.codec.http.HttpRequest;
import akka.actor.ActorRef;
import com.sulaco.fuse.akka.message.FuseRequestMessageImpl;
import io.netty.handler.timeout.IdleState;
import io.netty.handler.timeout.IdleStateEvent;
import static com.sulaco.fuse.util.IdSource.*;

package com.sulaco.fuse.netty;




/**
 * Incoming requests are handled by a router actor - it will use a fixed pool of
 * child actors that will match the rest pattern to a preconfigured handling actor.
 * 
 * @author gibffe
 *
 */
public class FuseChannelHandler extends ChannelInboundHandlerAdapter {
      
    protected ActorRef router;

    public FuseChannelHandler(ActorRef router) {
        super();
        this.router = router;
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) {
        //ctx.flush();
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        if (msg instanceof HttpRequest) {

            router.tell(

// Path: src/main/java/com/sulaco/fuse/util/IdSource.java
// public class IdSource {
// 
//     static final AtomicInteger intSource  = new AtomicInteger(0);
//     static final AtomicLong    longSource = new AtomicLong(0);
// 
//     public static int getInt() {
//         return intSource.incrementAndGet();
//     }
// 
//     public static long getLong() {
//         return longSource.incrementAndGet();
//     }
// 
//     public static UUID getUUID() {
//         return UUID.randomUUID();
//     }
// 
// }
// 
// Path: src/main/java/com/sulaco/fuse/akka/message/FuseRequestMessageImpl.java
// public class FuseRequestMessageImpl implements FuseRequestMessage {
// 
//     long id;
// 
//     HttpRequest incomingRequest;
// 
//     ChannelHandlerContext channelContext;
// 
//     Route route;
//     
//     volatile boolean flushed = false;
//     
//     public FuseRequestMessageImpl(long id, ChannelHandlerContext context, HttpRequest request) {
//         this.id = id;
//         this.channelContext  = context;
//         this.incomingRequest = request;
//     }
// 
//     @Override
//     public long getId() {
//         return id;
//     }
// 
//     @Override
//     public HttpRequest getRequest() {
//         return incomingRequest;
//     }
// 
//     @Override
//     public ChannelHandlerContext getChannelContext() {
//         return channelContext;
//     }
// 
//     @Override
//     public RouteHandler getHandler() {
//         return route.getHandler();
//     }
// 
//     @Override
//     public Map<String, String> getParams() {
//         return route.getParams();
//     }
// 
//     @Override
//     public Optional<String> getParam(String name) {
//         return route.getParam(name);
//     }
// 
//     @Override
//     public <T> Optional<T> getParam(String name, Class<T> clazz) {
//         Optional<String> param = route.getParam(name);
//         return param.map(v -> PrimitiveConverters.convert(v, clazz));
//     }
// 
//     @Override
//     public String getRequestBody() {
//         return ((DefaultFullHttpRequest) incomingRequest).content().toString(charset_utf8);
//     }
// 
//     public void setRoute(Route route) {
//         this.route = route;
//     }
// 
//     @Override
//     public void flush() {
//         channelContext.flush();
//         flushed = true;
//     }
// 
//     @Override
//     public boolean flushed() {
//         return flushed;
//     }
// 
//     private static final Charset charset_utf8 = Charset.forName("UTF-8");
//     
// }
// 
// Path: src/main/java/com/sulaco/fuse/util/IdSource.java
// public class IdSource {
// 
//     static final AtomicInteger intSource  = new AtomicInteger(0);
//     static final AtomicLong    longSource = new AtomicLong(0);
// 
//     public static int getInt() {
//         return intSource.incrementAndGet();
//     }
// 
//     public static long getLong() {
//         return longSource.incrementAndGet();
//     }
// 
//     public static UUID getUUID() {
//         return UUID.randomUUID();
//     }
// 
// }


// Path: src/main/java/com/sulaco/fuse/netty/FuseChannelHandler.java
import com.sulaco.fuse.util.IdSource;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.codec.http.HttpRequest;
import akka.actor.ActorRef;
import com.sulaco.fuse.akka.message.FuseRequestMessageImpl;
import io.netty.handler.timeout.IdleState;
import io.netty.handler.timeout.IdleStateEvent;
import static com.sulaco.fuse.util.IdSource.*;

package com.sulaco.fuse.netty;




/**
 * Incoming requests are handled by a router actor - it will use a fixed pool of
 * child actors that will match the rest pattern to a preconfigured handling actor.
 * 
 * @author gibffe
 *
 */
public class FuseChannelHandler extends ChannelInboundHandlerAdapter {
      
    protected ActorRef router;

    public FuseChannelHandler(ActorRef router) {
        super();
        this.router = router;
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) {
        //ctx.flush();
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        if (msg instanceof HttpRequest) {

            router.tell(

                new FuseRequestMessageImpl(IdSource.getLong(), ctx, (HttpRequest) msg),
