// Path: tripledframework-demo/src/main/java/eu/tripledframework/demo/application/HelloCommand.java
// public class HelloCommand {
// 
//   @Size(min = 3)
//   private String name;
// 
//   public HelloCommand(String name) {
//     this.name = name;
//   }
// 
//   public String getName() {
//     return name;
//   }
// }
// 
// Path: tripledframework-demo/src/main/java/eu/tripledframework/demo/application/HelloResponse.java
// public class HelloResponse {
// 
//   private String message;
// 
//   public HelloResponse(String message) {
//     this.message = message;
//   }
// 
//   public String getMessage() {
//     return message;
//   }
// }
// 
// Path: eventbus-core/src/main/java/eu/tripledframework/eventbus/CommandDispatcher.java
// public interface CommandDispatcher {
// 
//   /**
//    * Dispatches the given command and invokes the given callback with either success or failure.
//    *
//    * @param command      The command to dispatch.
//    * @param callback     The callback to invoke upon completion.
//    * @param <ReturnType> The return type of the command handling.
//    */
//   <ReturnType> void dispatch(Object command, CommandCallback<ReturnType> callback);
// 
//   /**
//    * Dispatches the given command and invokes the given callback with either success or failure.
//    *
//    * @param command      The command to dispatch.
//    * @param <ReturnType> The return type of the command handling.
//    * @return A future object to be used to retrieve the result.
//    */
//   <ReturnType> Future<ReturnType> dispatch(Object command);
// 
// }


import java.security.Principal;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import eu.tripledframework.demo.application.HelloCommand;
import eu.tripledframework.demo.application.HelloResponse;
import eu.tripledframework.eventbus.CommandDispatcher;
/*
 * Copyright 2015 TripleD framework.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package eu.tripledframework.demo.presentation;




@RestController
public class HelloController {

  private static final Logger LOGGER = LoggerFactory.getLogger(HelloController.class);

  @Autowired
  private CommandDispatcher commandDispatcher;

  @RequestMapping(value = "/hello/{name}", method = RequestMethod.GET)
  public HelloResponse sayHi(@PathVariable String name) throws ExecutionException, InterruptedException {
    Future<HelloResponse> future = commandDispatcher.dispatch(new HelloCommand(name));

    return future.get();
  }

  @RequestMapping(value = "/hello", method = RequestMethod.GET)
  public HelloResponse sayHiAuthenticated(Principal principal) throws ExecutionException, InterruptedException {
    LOGGER.debug("Saying hi to authenticated user {}", principal);

// Path: tripledframework-demo/src/main/java/eu/tripledframework/demo/application/HelloCommand.java
// public class HelloCommand {
// 
//   @Size(min = 3)
//   private String name;
// 
//   public HelloCommand(String name) {
//     this.name = name;
//   }
// 
//   public String getName() {
//     return name;
//   }
// }
// 
// Path: tripledframework-demo/src/main/java/eu/tripledframework/demo/application/HelloResponse.java
// public class HelloResponse {
// 
//   private String message;
// 
//   public HelloResponse(String message) {
//     this.message = message;
//   }
// 
//   public String getMessage() {
//     return message;
//   }
// }
// 
// Path: eventbus-core/src/main/java/eu/tripledframework/eventbus/CommandDispatcher.java
// public interface CommandDispatcher {
// 
//   /**
//    * Dispatches the given command and invokes the given callback with either success or failure.
//    *
//    * @param command      The command to dispatch.
//    * @param callback     The callback to invoke upon completion.
//    * @param <ReturnType> The return type of the command handling.
//    */
//   <ReturnType> void dispatch(Object command, CommandCallback<ReturnType> callback);
// 
//   /**
//    * Dispatches the given command and invokes the given callback with either success or failure.
//    *
//    * @param command      The command to dispatch.
//    * @param <ReturnType> The return type of the command handling.
//    * @return A future object to be used to retrieve the result.
//    */
//   <ReturnType> Future<ReturnType> dispatch(Object command);
// 
// }


// Path: tripledframework-demo/src/main/java/eu/tripledframework/demo/presentation/HelloController.java
import java.security.Principal;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import eu.tripledframework.demo.application.HelloCommand;
import eu.tripledframework.demo.application.HelloResponse;
import eu.tripledframework.eventbus.CommandDispatcher;

/*
 * Copyright 2015 TripleD framework.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package eu.tripledframework.demo.presentation;




@RestController
public class HelloController {

  private static final Logger LOGGER = LoggerFactory.getLogger(HelloController.class);

  @Autowired
  private CommandDispatcher commandDispatcher;

  @RequestMapping(value = "/hello/{name}", method = RequestMethod.GET)
  public HelloResponse sayHi(@PathVariable String name) throws ExecutionException, InterruptedException {
    Future<HelloResponse> future = commandDispatcher.dispatch(new HelloCommand(name));

    return future.get();
  }

  @RequestMapping(value = "/hello", method = RequestMethod.GET)
  public HelloResponse sayHiAuthenticated(Principal principal) throws ExecutionException, InterruptedException {
    LOGGER.debug("Saying hi to authenticated user {}", principal);

    return new HelloResponse("Hello authenticated user " + principal.getName());