From 68e4a1240785eef8c9c2fcf266d53f4c92f53fce Mon Sep 17 00:00:00 2001 From: Daniel Gomez-Sanchez Date: Tue, 30 Nov 2021 11:50:43 +0100 Subject: [PATCH 1/2] Add IGemSorter::getFeatureBranchProviderComparator API --- .../gem/core/api/service/IGemSorter.java | 2 + .../core/api/service/IServiceContainer.java | 12 +++-- .../internal/config/ServiceContainer.java | 13 +++++ .../core/impl/service/DefaultGemSorter.java | 50 ++++++++++++++++++- 4 files changed, 71 insertions(+), 6 deletions(-) diff --git a/bundles/org.aposin.gem.core/src/org/aposin/gem/core/api/service/IGemSorter.java b/bundles/org.aposin.gem.core/src/org/aposin/gem/core/api/service/IGemSorter.java index 67dd82f..522dd69 100644 --- a/bundles/org.aposin.gem.core/src/org/aposin/gem/core/api/service/IGemSorter.java +++ b/bundles/org.aposin.gem.core/src/org/aposin/gem/core/api/service/IGemSorter.java @@ -57,4 +57,6 @@ public default String getDisplayName() { */ public Comparator getEnvironmentComparator(); + public Comparator getFeatureBranchProviderComparator(); + } diff --git a/bundles/org.aposin.gem.core/src/org/aposin/gem/core/api/service/IServiceContainer.java b/bundles/org.aposin.gem.core/src/org/aposin/gem/core/api/service/IServiceContainer.java index 8f58313..cd03e33 100644 --- a/bundles/org.aposin.gem.core/src/org/aposin/gem/core/api/service/IServiceContainer.java +++ b/bundles/org.aposin.gem.core/src/org/aposin/gem/core/api/service/IServiceContainer.java @@ -44,7 +44,9 @@ public default IGemSorter getGemSorter() { final Collection sorters = getGemServices(IGemSorter.class); switch (sorters.size()) { case 0: - return new DefaultGemSorter(); + final DefaultGemSorter sorter = new DefaultGemSorter(); + sorter.setConfig(getConfiguration()); + return sorter; case 1: return sorters.iterator().next(); default: @@ -61,12 +63,14 @@ public default IGemSorter getGemSorter() { /** * Retrieve the {@link IFeatureBranchProvider} core service. + *
+ * Implementations should sort the result with + * {@link IGemSorter#getFeatureBranchProviderComparator()} + * after calling {@link #getGemServices(Class)}. * * @return {@link #getService(Class)} for {@link IFeatureBranchProvider}. */ - public default Collection getFeatureBranchProviders() { - return getGemServices(IFeatureBranchProvider.class); - } + public Collection getFeatureBranchProviders(); /** * Retrieve the {@link IEnvironmentLauncherProvider} core service. diff --git a/bundles/org.aposin.gem.core/src/org/aposin/gem/core/impl/internal/config/ServiceContainer.java b/bundles/org.aposin.gem.core/src/org/aposin/gem/core/impl/internal/config/ServiceContainer.java index 32843db..56589e8 100644 --- a/bundles/org.aposin.gem.core/src/org/aposin/gem/core/impl/internal/config/ServiceContainer.java +++ b/bundles/org.aposin.gem.core/src/org/aposin/gem/core/impl/internal/config/ServiceContainer.java @@ -24,6 +24,7 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; +import java.util.stream.Collectors; import org.aposin.gem.core.Activator; import org.aposin.gem.core.api.IRefreshable; @@ -59,6 +60,7 @@ public class ServiceContainer implements IServiceContainer, IConfigurable { private final Map, Map> misconfiguredServices = new HashMap<>(); + private List featureBranchProviders; /* package */ ServiceContainer(final ConfigurationImpl configuration) { this.configuration = configuration; @@ -106,6 +108,16 @@ public IFeatureBranchProvider getDefaultFeatureBranchProvider() { return provider; } + @Override + public Collection getFeatureBranchProviders() { + if (featureBranchProviders == null) { + featureBranchProviders = getGemServices(IFeatureBranchProvider.class).stream() // + .sorted(getGemSorter().getFeatureBranchProviderComparator()) // + .collect(Collectors.toUnmodifiableList()); + } + return featureBranchProviders; + } + @Override public T getService(Class type, String id) { return getGemServicesById(type).get(id); @@ -206,5 +218,6 @@ public void refresh() { loadedServices.clear(); misconfiguredServices.clear(); misconfiguredServiceCreators.clear(); + featureBranchProviders = null; } } diff --git a/bundles/org.aposin.gem.core/src/org/aposin/gem/core/impl/service/DefaultGemSorter.java b/bundles/org.aposin.gem.core/src/org/aposin/gem/core/impl/service/DefaultGemSorter.java index cbc2644..ba4cc78 100644 --- a/bundles/org.aposin.gem.core/src/org/aposin/gem/core/impl/service/DefaultGemSorter.java +++ b/bundles/org.aposin.gem.core/src/org/aposin/gem/core/impl/service/DefaultGemSorter.java @@ -18,26 +18,48 @@ import java.util.Comparator; import org.aposin.gem.core.api.config.GemConfigurationException; +import org.aposin.gem.core.api.config.IConfigurable; import org.aposin.gem.core.api.config.IConfiguration; import org.aposin.gem.core.api.model.IEnvironment; import org.aposin.gem.core.api.model.IProject; +import org.aposin.gem.core.api.service.IFeatureBranchProvider; import org.aposin.gem.core.api.service.IGemSorter; /** * Default {@link IGemSorter}. *
* This sorter can be extended by plug-ins and be registered as a service (only one is allowed). + *
+ * On the constructor, sub-classes should register the core serice comparators. + * If other services that are plug-in specific are provided, it can either be registered by the + * plug-in itself {@link #registerServiceComparator(Class, Comparator)} or by the sorter if it is + * application-specific. */ -public class DefaultGemSorter implements IGemSorter { +public class DefaultGemSorter implements IGemSorter, IConfigurable { + + private IConfiguration config; /** * {@inheritDoc} */ @Override - public void setConfig(final IConfiguration config) throws GemConfigurationException { + public final void setConfig(final IConfiguration config) throws GemConfigurationException { + this.config = config; + loadConfig(); + } + + /** + * Hook-method for sub-classes, to load the configuration on {@link #setConfig(IConfiguration)); + */ + protected void loadConfig() { // NO-OP } + @Override + public final IConfiguration getConfiguration() { + return config; + } + /** * {@inheritDoc} */ @@ -53,4 +75,28 @@ public Comparator getEnvironmentComparator() { public Comparator getProjectComparator() { return Comparator.naturalOrder(); } + + /** + * {@inheritDoc} + */ + @Override + public Comparator getFeatureBranchProviderComparator() { + return new Comparator() { + + @Override + public int compare(IFeatureBranchProvider o1, IFeatureBranchProvider o2) { + final IFeatureBranchProvider defaultFBP = config.getServiceContainer() + .getDefaultFeatureBranchProvider(); + if (o1 == defaultFBP) { + return -1; + } else if (o2 == defaultFBP) { + return 1; + } else { + return o1.compareTo(o2); + } + } + + }; + } + } From c75b8440fa970d3ad797fd3e821894f7cd082994 Mon Sep 17 00:00:00 2001 From: Daniel Gomez-Sanchez Date: Tue, 30 Nov 2021 11:52:42 +0100 Subject: [PATCH 2/2] Improve IDs to identify core-provided FBP --- .../gem/core/api/service/IFeatureBranchProvider.java | 9 +++++++++ .../impl/internal/service/AbstractGitBranchProvider.java | 5 +++++ .../core/impl/internal/service/GemGitBranchProvider.java | 9 +++++---- .../jira/internal/service/JiraFeatureBranchProvider.java | 2 +- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/bundles/org.aposin.gem.core/src/org/aposin/gem/core/api/service/IFeatureBranchProvider.java b/bundles/org.aposin.gem.core/src/org/aposin/gem/core/api/service/IFeatureBranchProvider.java index 18950a9..b3f1c94 100644 --- a/bundles/org.aposin.gem.core/src/org/aposin/gem/core/api/service/IFeatureBranchProvider.java +++ b/bundles/org.aposin.gem.core/src/org/aposin/gem/core/api/service/IFeatureBranchProvider.java @@ -17,6 +17,7 @@ import java.util.List; import java.util.Optional; + import org.aposin.gem.core.api.IRefreshable; import org.aposin.gem.core.api.model.IEnvironment; import org.aposin.gem.core.api.workflow.IFeatureBranch; @@ -26,6 +27,14 @@ */ public interface IFeatureBranchProvider extends IGemService, IRefreshable { + /** + * ID prefix to identify feature-branch providers provided by GEM Core. + *
+ * IMPORTANT NOTE: should only be used on {@link #getId()} from plug-ins provided + * by the GEM Core (including extra plug-ins). + */ + public static final String CORE_ID_PREFIX = "org.aposin.gem.fbp."; + /** * Get the feature-branches for the environment. * diff --git a/bundles/org.aposin.gem.core/src/org/aposin/gem/core/impl/internal/service/AbstractGitBranchProvider.java b/bundles/org.aposin.gem.core/src/org/aposin/gem/core/impl/internal/service/AbstractGitBranchProvider.java index 94c5ac4..a36c0a8 100644 --- a/bundles/org.aposin.gem.core/src/org/aposin/gem/core/impl/internal/service/AbstractGitBranchProvider.java +++ b/bundles/org.aposin.gem.core/src/org/aposin/gem/core/impl/internal/service/AbstractGitBranchProvider.java @@ -42,6 +42,11 @@ public abstract class AbstractGitBranchProvider implements IFeatureBranchProvide private IConfiguration config; private Map> blackListedBranches; + @Override + public String getId() { + return CORE_ID_PREFIX + getName(); + } + @Override public final void setConfig(final IConfiguration config) { this.config = config; diff --git a/bundles/org.aposin.gem.core/src/org/aposin/gem/core/impl/internal/service/GemGitBranchProvider.java b/bundles/org.aposin.gem.core/src/org/aposin/gem/core/impl/internal/service/GemGitBranchProvider.java index f268ace..2625d11 100644 --- a/bundles/org.aposin.gem.core/src/org/aposin/gem/core/impl/internal/service/GemGitBranchProvider.java +++ b/bundles/org.aposin.gem.core/src/org/aposin/gem/core/impl/internal/service/GemGitBranchProvider.java @@ -18,6 +18,7 @@ import java.util.LinkedHashSet; import java.util.Set; import java.util.stream.Collectors; + import org.aposin.gem.core.api.model.IEnvironment; import org.aposin.gem.core.api.service.IFeatureBranchProvider; import org.aposin.gem.core.api.workflow.IFeatureBranch; @@ -26,15 +27,15 @@ @Component(service = IFeatureBranchProvider.class) public class GemGitBranchProvider extends AbstractGitBranchProvider { + private static final String NAME = "gem_branches"; + /** * ID for this provider, which is also the default Core provider. */ - public static final String ID = GemGitBranchProvider.class.getName(); + public static final String ID = CORE_ID_PREFIX + NAME; /** * {@inheritDoc} - * - * @return {@link #ID} */ @Override public String getId() { @@ -43,7 +44,7 @@ public String getId() { @Override public String getName() { - return "gem_branches"; + return NAME; } @Override diff --git a/bundles/org.aposin.gem.jira/src/org/aposin/gem/jira/internal/service/JiraFeatureBranchProvider.java b/bundles/org.aposin.gem.jira/src/org/aposin/gem/jira/internal/service/JiraFeatureBranchProvider.java index 29e20ba..e80d664 100644 --- a/bundles/org.aposin.gem.jira/src/org/aposin/gem/jira/internal/service/JiraFeatureBranchProvider.java +++ b/bundles/org.aposin.gem.jira/src/org/aposin/gem/jira/internal/service/JiraFeatureBranchProvider.java @@ -67,7 +67,7 @@ public JiraProviderConfigBean getConfigBean() { @Override public String getId() { - return this.getClass().getName() + "." + getName(); + return CORE_ID_PREFIX + "jira." + getName(); } @Override