// 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.googlesource.gerrit.plugins.gitblit;

import com.gitblit.manager.IManager;
import com.gitblit.manager.IPluginManager;
import com.gitblit.models.PluginRegistry.InstallState;
import com.gitblit.models.PluginRegistry.PluginRegistration;
import com.gitblit.models.PluginRegistry.PluginRelease;
import com.google.inject.Singleton;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import ro.fortsoft.pf4j.PluginState;
import ro.fortsoft.pf4j.PluginWrapper;
import ro.fortsoft.pf4j.Version;

@Singleton
public class NullPluginManager implements IPluginManager {

  @Override
  public IManager start() {
    return this;
  }

  @Override
  public IManager stop() {
    return this;
  }

  @Override
  public Version getSystemVersion() {
    return Version.ZERO;
  }

  @Override
  public void startPlugins() {}

  @Override
  public void stopPlugins() {}

  @Override
  public PluginState startPlugin(String pluginId) {
    return null;
  }

  @Override
  public PluginState stopPlugin(String pluginId) {
    return null;
  }

  @Override
  public List<Class<?>> getExtensionClasses(String pluginId) {
    return Collections.emptyList();
  }

  @Override
  public <T> List<T> getExtensions(Class<T> type) {
    return Collections.emptyList();
  }

  @Override
  public List<PluginWrapper> getPlugins() {
    return Collections.emptyList();
  }

  @Override
  public PluginWrapper getPlugin(String pluginId) {
    return null;
  }

  @Override
  public PluginWrapper whichPlugin(Class<?> clazz) {
    return null;
  }

  @Override
  public boolean disablePlugin(String pluginId) {
    return false;
  }

  @Override
  public boolean enablePlugin(String pluginId) {
    return false;
  }

  @Override
  public boolean uninstallPlugin(String pluginId) {
    return false;
  }

  @Override
  public boolean refreshRegistry(boolean verifyChecksum) {
    return false;
  }

  @Override
  public boolean installPlugin(String url, boolean verifyChecksum) throws IOException {
    return false;
  }

  @Override
  public boolean upgradePlugin(String pluginId, String url, boolean verifyChecksum)
      throws IOException {
    return false;
  }

  @Override
  public List<PluginRegistration> getRegisteredPlugins() {
    return null;
  }

  @Override
  public List<PluginRegistration> getRegisteredPlugins(InstallState state) {
    return null;
  }

  @Override
  public PluginRegistration lookupPlugin(String idOrName) {
    return null;
  }

  @Override
  public PluginRelease lookupRelease(String idOrName, String version) {
    return null;
  }
}
