/*
 * Copyright 2013-present Facebook, Inc.
 *
 * 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.facebook.buck.rules;

import com.facebook.buck.event.BuckEventBus;
import com.google.common.base.Preconditions;

import java.io.File;

/**
 * Decorator for wrapping a {@link ArtifactCache} to log a {@link ArtifactCacheEvent} for the start
 * and finish of each event.
 */
public class LoggingArtifactCacheDecorator {
  private final BuckEventBus eventBus;

  public LoggingArtifactCacheDecorator(BuckEventBus eventBus) {
    this.eventBus = Preconditions.checkNotNull(eventBus);
  }

  public final ArtifactCache decorate(final ArtifactCache delegate) {
    return new ArtifactCache() {
      @Override
      public boolean fetch(RuleKey ruleKey, File output) {
        eventBus.post(ArtifactCacheEvent.started(ArtifactCacheEvent.Operation.FETCH));
        boolean isSuccess = delegate.fetch(ruleKey, output);
        eventBus.post(ArtifactCacheEvent.finished(ArtifactCacheEvent.Operation.FETCH, isSuccess));
        return isSuccess;
      }

      @Override
      public void store(RuleKey ruleKey, File output) {
        eventBus.post(ArtifactCacheEvent.started(ArtifactCacheEvent.Operation.STORE));
        delegate.store(ruleKey, output);
        eventBus.post(ArtifactCacheEvent.finished(ArtifactCacheEvent.Operation.STORE, true));
      }
    };
  }
}
