package org.cad.interruptus.repository.zookeeper.listener; import com.google.gson.Gson; import java.util.concurrent.atomic.AtomicReference; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.recipes.cache.ChildData; import org.apache.curator.framework.recipes.cache.NodeCache; import org.cad.interruptus.core.GsonSerializer; import org.cad.interruptus.entity.Configuration; public class ConfigurationZookeeperListener implements ZookeeperConfigurationListener { final Log logger = LogFactory.getLog(getClass()); final AtomicReference<Configuration> reference; final GsonSerializer<Configuration> serializer; final ConfigurationEventDispatcher dispatcher; public ConfigurationZookeeperListener(final AtomicReference<Configuration> configuration, final ConfigurationEventDispatcher dispatcher, final Gson gson) { this(configuration, dispatcher, new GsonSerializer(Configuration.class, gson)); } public ConfigurationZookeeperListener(final AtomicReference<Configuration> configuration, final ConfigurationEventDispatcher dispatcher, final GsonSerializer<Configuration> serializer) { this.reference = configuration; this.serializer = serializer; this.dispatcher = dispatcher; } @Override public void onChange(final CuratorFramework curator, final NodeCache cache, final String path) { logger.debug("Config change .."); if (cache.getCurrentData() == null) { logger.warn("Empty config data .."); } final ChildData eData = cache.getCurrentData(); final String data = eData != null ? new String(eData.getData()) : null; final Configuration newConfig = data != null ? serializer.fromJson(data) : new Configuration(); final Configuration oldConfig = reference.get() != null ? reference.get() : new Configuration(); if (newConfig == null) { logger.warn(String.format("Ignoring entity for path '%s', It cannot be NULL", path)); return; } if (newConfig.equals(oldConfig)) { logger.debug(String.format("No changes detected...")); return; } logger.debug("Apply configuration : " + newConfig); reference.set(newConfig); dispatcher.dispatchEvents(newConfig, oldConfig); } }