import org.apache.geode.cache.GemFireCache;
import org.apache.geode.cache.Operation;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.query.CqEvent;
import org.apache.geode.cache.query.CqListener;

public class MigrationListener implements CqListener {

  private final GemFireCache cache;

  private final Region region;

  public MigrationListener(GemFireCache cache, String regionName) {
    this.cache = cache;
    this.region = this.cache.getRegion(regionName);
  }

  @Override
  public void onEvent(CqEvent cqEvent) {
    processEvent(cqEvent.getBaseOperation(), cqEvent.getKey(), cqEvent.getNewValue());
  }

  @Override
  public void onError(CqEvent cqEvent) {
    this.cache.getLogger().warning("An unexpected exception occurred handling CQ event: " + cqEvent, cqEvent.getThrowable());
  }

  protected void processEvent(Operation operation, Object key, Object value) {
    this.cache.getLogger().info("MigrationListener.processEvent processing operation=" + operation + "; key=" + key + "; value=" + value);
    if (operation.isCreate()) {
      this.region.put(key, value);
    } else if (operation.isUpdate()) {
      this.region.put(key, value);
    } else if (operation.isDestroy()) {
      this.region.destroy(key);
    } else {
      this.cache.getLogger().warning("MigrationListener.processEvent skipped unknown operation=" + operation + "; key=" + key + "; value=" + value);
    }
  }
}
