// Copyright (C) 2014 The Android Open Source Project
//
// 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.google.gerrit.server.plugins;

import com.google.common.base.Optional;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Annotation;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Map;
import java.util.jar.Manifest;

/**
 * Scans the plugin returning classes and resources.
 *
 * Gerrit uses the scanner to automatically discover the classes
 * and resources exported by the plugin for auto discovery
 * of exported SSH commands, Servlets and listeners.
 */
public interface PluginContentScanner {

  /**
   * Scanner without resources.
   */
  PluginContentScanner EMPTY = new PluginContentScanner() {
    @Override
    public Manifest getManifest() throws IOException {
      return new Manifest();
    }

    @Override
    public Map<Class<? extends Annotation>, Iterable<ExtensionMetaData>> scan(
        String pluginName, Iterable<Class<? extends Annotation>> annotations)
        throws InvalidPluginException {
     return Collections.emptyMap();
    }

    @Override
    public Optional<PluginEntry> getEntry(String resourcePath)
        throws IOException {
      return Optional.absent();
    }

    @Override
    public InputStream getInputStream(PluginEntry entry) throws IOException {
      throw new FileNotFoundException("Empty plugin");
    }

    @Override
    public Enumeration<PluginEntry> entries() {
      return Collections.emptyEnumeration();
    }
  };

  /**
   * Plugin class extension meta-data
   *
   * Class name and annotation value of the class
   * provided by a plugin to extend an existing
   * extension point in Gerrit.
   */
  public static class ExtensionMetaData {
    public final String className;
    public final String annotationValue;

    public ExtensionMetaData(String className, String annotationValue) {
      this.className = className;
      this.annotationValue = annotationValue;
    }
  }

  /**
   * Return the plugin meta-data manifest
   *
   * @return Manifest of the plugin or null if plugin has no meta-data
   * @throws IOException if an I/O problem occurred whilst accessing the Manifest
   */
  Manifest getManifest() throws IOException;

  /**
   * Scans the plugin for declared public annotated classes
   *
   * @param pluginName the plugin name
   * @param annotations annotations declared by the plugin classes
   * @return map of annotations and associated plugin classes found
   * @throws InvalidPluginException if the plugin is not valid or corrupted
   */
  Map<Class<? extends Annotation>, Iterable<ExtensionMetaData>> scan(
      String pluginName, Iterable<Class<? extends Annotation>> annotations)
      throws InvalidPluginException;

  /**
   * Return the plugin resource associated to a path
   *
   * @param resourcePath full path of the resource inside the plugin package
   * @return the resource object or Optional.absent() if the resource was not found
   * @throws IOException if there was a problem retrieving the resource
   */
  Optional<PluginEntry> getEntry(String resourcePath) throws IOException;

  /**
   * Return the InputStream of the resource entry
   *
   * @param entry resource entry inside the plugin package
   * @return the resource input stream
   * @throws IOException if there was an I/O problem accessing the resource
   */
  InputStream getInputStream(PluginEntry entry) throws IOException;

  /**
   * Return all the resources inside a plugin
   *
   * @return the enumeration of all resources found
   */
  Enumeration<PluginEntry> entries();
}
