blob: f2f64c27438c69a7d9c9d62591202115df0e0649 [file] [log] [blame]
// 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.gerrit.extensions.annotations.ExtensionPoint;
import com.google.gerrit.server.PluginUser;
import com.google.gerrit.server.config.GerritRuntime;
import java.nio.file.Path;
import org.eclipse.jgit.internal.storage.file.FileSnapshot;
/**
* Provider of one Server plugin from one external file
*
* <p>Allows to load one plugin from one external file or one directory by declaring the ability to
* handle it.
*
* <p>In order to load multiple files into a single plugin, group them into a directory tree and
* then load the directory root as a single plugin.
*/
@ExtensionPoint
public interface ServerPluginProvider {
/** Descriptor of the Plugin that ServerPluginProvider has to load. */
class PluginDescription {
public final PluginUser user;
public final String canonicalUrl;
public final Path dataDir;
final GerritRuntime gerritRuntime;
/**
* Creates a new PluginDescription for ServerPluginProvider.
*
* @param user Gerrit user for interacting with plugins
* @param canonicalUrl plugin root Web URL
* @param dataDir directory for plugin data
* @param gerritRuntime current Gerrit runtime (daemon, batch, ...)
*/
public PluginDescription(
PluginUser user, String canonicalUrl, Path dataDir, GerritRuntime gerritRuntime) {
this.user = user;
this.canonicalUrl = canonicalUrl;
this.dataDir = dataDir;
this.gerritRuntime = gerritRuntime;
}
}
/**
* Declares the availability to manage an external file or directory
*
* @param srcPath the external file or directory
* @return true if file or directory can be loaded into a Server Plugin
*/
boolean handles(Path srcPath);
/**
* Returns the plugin name of an external file or directory
*
* <p>Should be called only if {@link #handles(Path) handles(srcFile)} returns true and thus
* srcFile is a supported plugin format. An IllegalArgumentException is thrown otherwise as
* srcFile is not a valid file format for extracting its plugin name.
*
* @param srcPath external file or directory
* @return plugin name
*/
String getPluginName(Path srcPath);
/**
* Loads an external file or directory into a Server plugin.
*
* <p>Should be called only if {@link #handles(Path) handles(srcFile)} returns true and thus
* srcFile is a supported plugin format. An IllegalArgumentException is thrown otherwise as
* srcFile is not a valid file format for extracting its plugin name.
*
* @param srcPath external file or directory
* @param snapshot snapshot of the external file
* @param pluginDescriptor descriptor of the ServerPlugin to load
* @throws InvalidPluginException if plugin is supposed to be handled but cannot be loaded for any
* other reason
*/
ServerPlugin get(Path srcPath, FileSnapshot snapshot, PluginDescription pluginDescriptor)
throws InvalidPluginException;
/**
* Returns the plugin name of this provider.
*
* <p>Allows to identify which plugin provided the current ServerPluginProvider by returning the
* plugin name. Helpful for troubleshooting plugin loading problems.
*
* @return plugin name of this provider
*/
String getProviderPluginName();
}