/*
 * Copyright (c) 2010-2017. Axon 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 org.axonframework.boot.autoconfig;

import org.axonframework.commandhandling.CommandBus;
import org.axonframework.commandhandling.distributed.AnnotationRoutingStrategy;
import org.axonframework.commandhandling.distributed.CommandBusConnector;
import org.axonframework.commandhandling.distributed.CommandRouter;
import org.axonframework.serialization.Serializer;
import org.axonframework.springcloud.commandhandling.SpringCloudCommandRouter;
import org.axonframework.springcloud.commandhandling.SpringHttpCommandBusConnector;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
@AutoConfigureAfter(JpaAutoConfiguration.class)
@AutoConfigureBefore(JGroupsAutoConfiguration.class)
@ConditionalOnProperty("axon.distributed.enabled")
@ConditionalOnClass(name = {
        "org.axonframework.springcloud.commandhandling.SpringCloudCommandRouter",
        "org.axonframework.springcloud.commandhandling.SpringHttpCommandBusConnector",
        "org.springframework.cloud.client.discovery.DiscoveryClient",
        "org.springframework.web.client.RestTemplate"
})
public class SpringCloudAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnBean(DiscoveryClient.class)
    public CommandRouter springCloudCommandRouter(DiscoveryClient discoveryClient) {
        return new SpringCloudCommandRouter(discoveryClient, new AnnotationRoutingStrategy());
    }

    @Bean
    @ConditionalOnMissingBean
    public CommandBusConnector springHttpCommandBusConnector(@Qualifier("localSegment") CommandBus localSegment,
                                                             RestTemplate restTemplate,
                                                             Serializer serializer) {
        return new SpringHttpCommandBusConnector(localSegment, restTemplate, serializer);
    }

    @Bean
    @ConditionalOnMissingBean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

@@ -1040,32 +1040,121 @@
 dCommandRouter;%0A
+import org.axonframework.springcloud.commandhandling.SpringCloudHttpBackupCommandRouter;%0A
 import org.axonf
@@ -1213,32 +1213,32 @@
 ndBusConnector;%0A
-
 import org.sprin
@@ -1280,24 +1280,83 @@
 .Qualifier;%0A
+import org.springframework.beans.factory.annotation.Value;%0A
 import org.s
@@ -1968,16 +1968,71 @@
 ration;%0A
+import org.springframework.context.annotation.Primary;%0A
 import o
@@ -2350,24 +2350,116 @@
 andRouter%22,%0A
+        %22org.axonframework.springcloud.commandhandling.SpringCloudHttpBackupCommandRouter%22,%0A
         %22org
@@ -2660,16 +2660,16 @@
 ate%22%0A%7D)%0A
-
 public c
@@ -2705,16 +2705,859 @@
 tion %7B%0A%0A
+    @Bean%0A    @Primary%0A    @ConditionalOnMissingBean%0A    @ConditionalOnBean(DiscoveryClient.class)%0A    @ConditionalOnProperty(%22axon.distributed.spring-cloud.fallback-to-http-get%22)%0A    public CommandRouter springCloudHttpBackupCommandRouter(DiscoveryClient discoveryClient,%0A                                                            RestTemplate restTemplate,%0A                                                            @Value(%22$%7Baxon.distributed.spring-cloud.fallback-url%7D%22) String messageRoutingInformationEndpoint) %7B%0A        return new SpringCloudHttpBackupCommandRouter(discoveryClient,%0A                                                      new AnnotationRoutingStrategy(),%0A                                                      restTemplate,%0A                                                      messageRoutingInformationEndpoint);%0A    %7D%0A%0A
     @Bea

Add @Bean springCloudHttpBackupCommandRouter()