Files
gerrit/java/com/google/gerrit/server/change/ChangeAttributeFactory.java
Dave Borowitz 9d2894f966 Bind ChangeAttributeFactory as a DynamicSet
DynamicMaps allow a view of plugin-provided bindings keyed by export
names. The main use case for an export name is to provide something with
that name that is visible to an end user, such as a new SSH command. In
the case of ChangeAttributeFactory, the export name is entirely unused;
it's just an arbitrary string that the plugin author provides, which has
to be unique to their plugin, but is otherwise meaningless.

By using DynamicSet instead of DynamicMap for these bindings, we
eliminate one line of boilerplate for plugin authors, and avoid
confusing them with the impression that this arbitrary string has
meaning.

The good news is that old plugins that use an explicit, arbitrary export
name will continue to work, because DynamicSet is implemented internally
by using separate binding annotations per instance. If callers use the
DynamicSet interface, they get a unique annotation for free, but it
still works if they explicitly pass the export annotation.

Convert most tests in PluginFieldsIT to demonstrate the new way, but
leave one test that uses the old explicit export to ensure that it still
works.

Change-Id: Iaf7e6ac8a53be115f1bc01e716e0fb3c04033754
2019-03-18 09:02:44 -07:00

49 lines
1.8 KiB
Java

// Copyright (C) 2019 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.change;
import com.google.gerrit.extensions.common.PluginDefinedInfo;
import com.google.gerrit.server.DynamicOptions.BeanProvider;
import com.google.gerrit.server.query.change.ChangeData;
/**
* Interface for plugins to provide additional fields in {@link
* com.google.gerrit.extensions.common.ChangeInfo ChangeInfo}.
*
* <p>Register a {@code ChangeAttributeFactory} in a plugin {@code Module} like this:
*
* <pre>
* DynamicSet.bind(binder(), ChangeAttributeFactory.class).to(YourClass.class);
* </pre>
*
* <p>See the <a
* href="https://gerrit-review.googlesource.com/Documentation/dev-plugins.html#query_attributes">plugin
* developer documentation for more details and examples.
*/
public interface ChangeAttributeFactory {
/**
* Create a plugin-provided info field.
*
* <p>Typically, implementations will subclass {@code PluginDefinedInfo} to add additional fields.
*
* @param cd change.
* @param beanProvider provider of {@code DynamicBean}s, which may be used for reading options.
* @param plugin plugin name.
* @return the plugin's special change info.
*/
PluginDefinedInfo create(ChangeData cd, BeanProvider beanProvider, String plugin);
}