// Path: src/main/java/com/sulaco/fuse/akka/actor/FuseEndpointActor.java
// public abstract class FuseEndpointActor extends FuseBaseActor {
//     
//     @Autowired protected MetricsRegistry metrics;
//     
//     public FuseEndpointActor() {
//         super();
//     }
// 
//     // TODO: refactor metrics
//     //            meter = metrics.getRegistry().timer(getClass().getName());
// 
//     @Override
//     public void onReceive(Object message) throws Exception {
//         try {
//             if (message instanceof FuseRequestMessage) {
//                 onRequest((FuseRequestMessage) message);
//                 //proto.error((FuseRequestMessage) message);
//             }
//             else {
//                 super.onReceive(message);
//             }
//         }
//         catch (Exception ex) {
//             log.error("Error handling request !", ex);
//             unhandled(message);
//         }
//         finally {
//             // TODO: context flush
//         }
//     }
//     
//     protected void onRequest(final FuseRequestMessage request) {
//         
//         RouteHandler rhandler = request.getHandler();
//         
//         Optional<String> method = rhandler.getMethodName();
//         
//         if (method.isPresent()) {
//             // Invoke configured method instead of default 'onReceive'. Method needs to have correct
//             // signature, otherwise, fallback to 'onReceive' will occur.
//             //
//             Optional<Method> target = lookupMethod(this, method.get());
//             if (target.isPresent()) {
//                 try {
//                     target.get()
//                           .invoke(this, request);
//                 }
//                 catch (Exception ex) {
//                     log.warn("[fuse] Invocation failure. x_x", ex);
//                 }
//             }       
//         }
//         else {
//             log.warn("[fuse] No handling method specified. Override onReceive. x_x");
//         }
//     }
// 
// 
// 
//     @Override
//     public void unhandled(Object message) {
//         super.unhandled(message);
//         if (message instanceof FuseRequestMessage) {
//             proto.error((FuseRequestMessage) message);
//         }
//     }
// 
//     public void setProto(WireProtocol proto) {
//         this.proto = proto;
//     }
// 
//     protected static final Logger log = LoggerFactory.getLogger(FuseEndpointActor.class);
// }
// 
// Path: src/main/java/com/sulaco/fuse/akka/message/FuseInternalMessage.java
// public interface FuseInternalMessage extends FuseOriginChain {
//     
//     FuseMessageContext getContext();
// 
//     long getRequestId();
// 
//     long getTimestamp();
// 
//     FuseInternalMessage timestamp();
// }
// 
// Path: src/main/java/com/sulaco/fuse/akka/message/FuseMessageContext.java
// public interface FuseMessageContext {
// 
//     public int inc(String key);
//     
//     public int dec(String key);
//     
//     public <T> Optional<T> get(String key);
// 
//     public <T> Optional<T> payload();
// 
//     public FuseMessageContext put(String key, Object value);
//     
//     public FuseMessageContext put(String key, Optional<?> value);
// 
//     public FuseMessageContext remove(String key);
//     
//     public Set<String> keys();
//     
//     
//     public void setRequest(FuseRequestMessage request);
//     
//     public Optional<FuseRequestMessage> getRequest();
//     
// }
// 
// Path: src/main/java/com/sulaco/fuse/akka/message/FuseRequestMessage.java
// public interface FuseRequestMessage extends Route {
// 
//     long getId();
// 
//     HttpRequest getRequest();
// 
//     String getRequestBody();
// 
//     ChannelHandlerContext getChannelContext();
// 
//     void flush();
// 
//     boolean flushed();
// 
//     public <T> Optional<T> getParam(String name, Class<T> clazz);
// 
// }


import com.sulaco.fuse.akka.actor.FuseEndpointActor;
import com.sulaco.fuse.akka.message.FuseInternalMessage;
import com.sulaco.fuse.akka.message.FuseMessageContext;
import com.sulaco.fuse.akka.message.FuseRequestMessage;
import com.sulaco.fuse.config.annotation.FuseEndpoint;
package com.sulaco.fuse.example.endpoint;


@FuseEndpoint( path = "/echo" )
public class EchoActor extends FuseEndpointActor {

    @Override
    protected void onRequest(FuseRequestMessage request) {

        // we'll let the Echo actor figure out how to echo the request uri string
        //
        FuseInternalMessage message = newMessage(request);

        message.getContext()
               .put(
                   "echo",
                   request.getRequest().getUri()
               );

        send(message, "/user/echo");

        // once the message is processed by example.actor.Echo, at some point in the future this actor will receive an
        // internal message back
    }

    @Override
// Path: src/main/java/com/sulaco/fuse/akka/actor/FuseEndpointActor.java
// public abstract class FuseEndpointActor extends FuseBaseActor {
//     
//     @Autowired protected MetricsRegistry metrics;
//     
//     public FuseEndpointActor() {
//         super();
//     }
// 
//     // TODO: refactor metrics
//     //            meter = metrics.getRegistry().timer(getClass().getName());
// 
//     @Override
//     public void onReceive(Object message) throws Exception {
//         try {
//             if (message instanceof FuseRequestMessage) {
//                 onRequest((FuseRequestMessage) message);
//                 //proto.error((FuseRequestMessage) message);
//             }
//             else {
//                 super.onReceive(message);
//             }
//         }
//         catch (Exception ex) {
//             log.error("Error handling request !", ex);
//             unhandled(message);
//         }
//         finally {
//             // TODO: context flush
//         }
//     }
//     
//     protected void onRequest(final FuseRequestMessage request) {
//         
//         RouteHandler rhandler = request.getHandler();
//         
//         Optional<String> method = rhandler.getMethodName();
//         
//         if (method.isPresent()) {
//             // Invoke configured method instead of default 'onReceive'. Method needs to have correct
//             // signature, otherwise, fallback to 'onReceive' will occur.
//             //
//             Optional<Method> target = lookupMethod(this, method.get());
//             if (target.isPresent()) {
//                 try {
//                     target.get()
//                           .invoke(this, request);
//                 }
//                 catch (Exception ex) {
//                     log.warn("[fuse] Invocation failure. x_x", ex);
//                 }
//             }       
//         }
//         else {
//             log.warn("[fuse] No handling method specified. Override onReceive. x_x");
//         }
//     }
// 
// 
// 
//     @Override
//     public void unhandled(Object message) {
//         super.unhandled(message);
//         if (message instanceof FuseRequestMessage) {
//             proto.error((FuseRequestMessage) message);
//         }
//     }
// 
//     public void setProto(WireProtocol proto) {
//         this.proto = proto;
//     }
// 
//     protected static final Logger log = LoggerFactory.getLogger(FuseEndpointActor.class);
// }
// 
// Path: src/main/java/com/sulaco/fuse/akka/message/FuseInternalMessage.java
// public interface FuseInternalMessage extends FuseOriginChain {
//     
//     FuseMessageContext getContext();
// 
//     long getRequestId();
// 
//     long getTimestamp();
// 
//     FuseInternalMessage timestamp();
// }
// 
// Path: src/main/java/com/sulaco/fuse/akka/message/FuseMessageContext.java
// public interface FuseMessageContext {
// 
//     public int inc(String key);
//     
//     public int dec(String key);
//     
//     public <T> Optional<T> get(String key);
// 
//     public <T> Optional<T> payload();
// 
//     public FuseMessageContext put(String key, Object value);
//     
//     public FuseMessageContext put(String key, Optional<?> value);
// 
//     public FuseMessageContext remove(String key);
//     
//     public Set<String> keys();
//     
//     
//     public void setRequest(FuseRequestMessage request);
//     
//     public Optional<FuseRequestMessage> getRequest();
//     
// }
// 
// Path: src/main/java/com/sulaco/fuse/akka/message/FuseRequestMessage.java
// public interface FuseRequestMessage extends Route {
// 
//     long getId();
// 
//     HttpRequest getRequest();
// 
//     String getRequestBody();
// 
//     ChannelHandlerContext getChannelContext();
// 
//     void flush();
// 
//     boolean flushed();
// 
//     public <T> Optional<T> getParam(String name, Class<T> clazz);
// 
// }


// Path: examples/annotations/src/main/java/com/sulaco/fuse/example/endpoint/EchoActor.java
import com.sulaco.fuse.akka.actor.FuseEndpointActor;
import com.sulaco.fuse.akka.message.FuseInternalMessage;
import com.sulaco.fuse.akka.message.FuseMessageContext;
import com.sulaco.fuse.akka.message.FuseRequestMessage;
import com.sulaco.fuse.config.annotation.FuseEndpoint;

package com.sulaco.fuse.example.endpoint;


@FuseEndpoint( path = "/echo" )
public class EchoActor extends FuseEndpointActor {

    @Override
    protected void onRequest(FuseRequestMessage request) {

        // we'll let the Echo actor figure out how to echo the request uri string
        //
        FuseInternalMessage message = newMessage(request);

        message.getContext()
               .put(
                   "echo",
                   request.getRequest().getUri()
               );

        send(message, "/user/echo");

        // once the message is processed by example.actor.Echo, at some point in the future this actor will receive an
        // internal message back
    }

    @Override
    protected void onInternal(FuseInternalMessage message) {