// Copyright (C) 2015 Ericsson
//
// 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 com.ericsson.gerrit.plugins.highavailability.cache;

import com.google.common.cache.RemovalNotification;
import com.google.gerrit.server.cache.CacheRemovalListener;
import com.google.inject.Inject;

import com.ericsson.gerrit.plugins.highavailability.forwarder.Context;
import com.ericsson.gerrit.plugins.highavailability.forwarder.Forwarder;

import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.regex.Pattern;

class CacheEvictionHandler<K, V> implements CacheRemovalListener<K, V> {
  private final ScheduledThreadPoolExecutor executor;
  private final Forwarder forwarder;
  private final Pattern pattern;

  @Inject
  CacheEvictionHandler(Forwarder forwarder,
      @CacheExecutor ScheduledThreadPoolExecutor executor) {
    this.forwarder = forwarder;
    this.executor = executor;
    pattern = Pattern.compile(
        "^accounts.*|^groups.*|ldap_groups|ldap_usernames|^project.*|sshkeys|web_sessions");
  }

  @Override
  public void onRemoval(String pluginName, String cacheName,
      RemovalNotification<K, V> notification) {
    if (!Context.isForwardedEvent() && !notification.wasEvicted()
        && isSynchronized(cacheName)) {
      executor.execute(new CacheEvictionTask(cacheName, notification.getKey()));
    }
  }

  private boolean isSynchronized(String cacheName) {
    return pattern.matcher(cacheName).matches();
  }

  class CacheEvictionTask implements Runnable {
    private String cacheName;
    private Object key;

    CacheEvictionTask(String cacheName, Object key) {
      this.cacheName = cacheName;
      this.key = key;
    }

    @Override
    public void run() {
      forwarder.evict(cacheName, key);
    }

    @Override
    public String toString() {
      return String.format("Evict key '%s' from cache '%s' in target instance",
          key, cacheName);
    }
  }
}
