/*
 * Copyright 2016-2018 shardingsphere.io.
 * <p>
 * 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.
 * </p>
 */

package io.shardingsphere.jdbc.orchestration.internal.state.instance;

import io.shardingsphere.core.event.ShardingEventBusInstance;
import io.shardingsphere.core.event.orche.state.CircuitStateEventBusEvent;
import io.shardingsphere.jdbc.orchestration.internal.config.ConfigurationService;
import io.shardingsphere.jdbc.orchestration.internal.listener.ListenerManager;
import io.shardingsphere.jdbc.orchestration.internal.state.StateNode;
import io.shardingsphere.jdbc.orchestration.internal.state.StateNodeStatus;
import io.shardingsphere.jdbc.orchestration.reg.api.RegistryCenter;
import io.shardingsphere.jdbc.orchestration.reg.listener.DataChangedEvent;
import io.shardingsphere.jdbc.orchestration.reg.listener.EventListener;

import java.util.LinkedList;

/**
 * Instance listener manager.
 *
 * @author caohao
 * @author panjuan
 */
public final class InstanceListenerManager implements ListenerManager {
    
    private final StateNode stateNode;
    
    private final RegistryCenter regCenter;
    
    private final ConfigurationService configService;
    
    public InstanceListenerManager(final String name, final RegistryCenter regCenter) {
        stateNode = new StateNode(name);
        this.regCenter = regCenter;
        configService = new ConfigurationService(name, regCenter);
    }
    
    @Override
    public void watchSharding() {
        regCenter.watch(stateNode.getInstancesNodeFullPath(OrchestrationInstance.getInstance().getInstanceId()), new EventListener() {
            
            @Override
            public void onChange(final DataChangedEvent event) {
                if (DataChangedEvent.Type.UPDATED == event.getEventType()) {
                    if (StateNodeStatus.DISABLED.toString().equalsIgnoreCase(regCenter.get(event.getKey()))) {
                        ShardingEventBusInstance.getInstance().post(new CircuitStateEventBusEvent(configService.loadDataSourceMap().keySet()));
                    } else {
                        ShardingEventBusInstance.getInstance().post(new CircuitStateEventBusEvent(new LinkedList<String>()));
                    }
                }
            }
        });
    }
    
    @Override
    public void watchMasterSlave() {
        regCenter.watch(stateNode.getInstancesNodeFullPath(OrchestrationInstance.getInstance().getInstanceId()), new EventListener() {
            
            @Override
            public void onChange(final DataChangedEvent event) {
                if (DataChangedEvent.Type.UPDATED == event.getEventType()) {
                    if (StateNodeStatus.DISABLED.toString().equalsIgnoreCase(regCenter.get(event.getKey()))) {
                        ShardingEventBusInstance.getInstance().post(new CircuitStateEventBusEvent(configService.loadDataSourceMap().keySet()));
                    } else {
                        ShardingEventBusInstance.getInstance().post(new CircuitStateEventBusEvent(new LinkedList<String>()));
                    }
                }
            }
        });
    }
    
    @Override
    public void watchProxy() {
        regCenter.watch(stateNode.getInstancesNodeFullPath(OrchestrationInstance.getInstance().getInstanceId()), new EventListener() {
            
            @Override
            public void onChange(final DataChangedEvent event) {
                if (DataChangedEvent.Type.UPDATED == event.getEventType()) {
                    if (StateNodeStatus.DISABLED.toString().equalsIgnoreCase(regCenter.get(event.getKey()))) {
                        ShardingEventBusInstance.getInstance().post(new CircuitStateEventBusEvent(configService.loadDataSources().keySet()));
                    } else {
                        ShardingEventBusInstance.getInstance().post(new CircuitStateEventBusEvent(new LinkedList<String>()));
                    }
                }
            }
        });
    }
}

@@ -1348,38 +1348,8 @@
 r;%0A%0A
-import java.util.LinkedList;%0A%0A
 /**%0A
@@ -1596,67 +1596,8 @@
    %0A
-    private final ConfigurationService configService;%0A    %0A
     
@@ -1761,75 +1761,8 @@
 er;%0A
-        configService = new ConfigurationService(name, regCenter);%0A
     
@@ -2341,50 +2341,12 @@
 ent(
-configService.loadDataSourceMap().keySet()
+true
 ));%0A
@@ -2476,32 +2476,13 @@
 ent(
-new LinkedList%3CString%3E()
+false
 ));%0A
@@ -3134,50 +3134,12 @@
 ent(
-configService.loadDataSourceMap().keySet()
+true
 ));%0A
@@ -3269,32 +3269,13 @@
 ent(
-new LinkedList%3CString%3E()
+false
 ));%0A
@@ -3921,48 +3921,12 @@
 ent(
-configService.loadDataSources().keySet()
+true
 ));%0A
@@ -4056,32 +4056,13 @@
 ent(
-new LinkedList%3CString%3E()
+false
 ));%0A

use CircuitStateEventBusEvent