package stream.consumer.integration;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.context.annotation.Bean;
import org.springframework.integration.dsl.IntegrationFlow;
import org.springframework.integration.dsl.IntegrationFlows;
import org.springframework.messaging.SubscribableChannel;
import stream.consumer.ConsumerChannels;

@SpringBootApplication
@EnableBinding(ConsumerChannels.class)
// <1>
public class StreamConsumer {

 public static void main(String args[]) {
  SpringApplication.run(StreamConsumer.class, args);
 }

 // <2>
 private IntegrationFlow incomingMessageFlow(SubscribableChannel incoming,
  String prefix) {

  Log log = LogFactory.getLog(getClass());

  return IntegrationFlows
   .from(incoming)
   .transform(String.class, String::toUpperCase)
   .handle(
    String.class,
    (greeting, headers) -> {
     log.info("greeting received in IntegrationFlow (" + prefix + "): "
      + greeting);
     return null;
    }).get();
 }

 @Bean
 IntegrationFlow direct(ConsumerChannels channels) {
  return incomingMessageFlow(channels.directed(), "directed");
 }

 @Bean
 IntegrationFlow broadcast(ConsumerChannels channels) {
  return incomingMessageFlow(channels.broadcasts(), "broadcast");
 }
}