Skip to content

Commit

Permalink
feat: add synthetic service provider
Browse files Browse the repository at this point in the history
  • Loading branch information
paullatzelsperger committed Dec 21, 2022
1 parent 7c62610 commit e5c2567
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ public class DependencyGraph {
*/
public List<InjectionContainer<ServiceExtension>> of(List<ServiceExtension> loadedExtensions) {
var extensions = sortByType(loadedExtensions);
var syntheticExtension = new SyntheticExtension();
extensions.add(syntheticExtension);
var dependencyMap = createDependencyMap(extensions);

var sort = new TopologicalSort<ServiceExtension>();
Expand Down Expand Up @@ -112,6 +114,7 @@ public List<InjectionContainer<ServiceExtension>> of(List<ServiceExtension> load
throw new EdcException(string);
}

extensions.remove(syntheticExtension);
sort.sort(extensions);

// todo: should the list of InjectionContainers be generated directly by the flatmap?
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/*
* Copyright (c) 2022 Microsoft Corporation
*
* This program and the accompanying materials are made available under the
* terms of the Apache License, Version 2.0 which is available at
* https://www.apache.org/licenses/LICENSE-2.0
*
* SPDX-License-Identifier: Apache-2.0
*
* Contributors:
* Microsoft Corporation - initial API and implementation
*
*/

package org.eclipse.edc.boot.system;

import org.eclipse.edc.runtime.metamodel.annotation.Provides;
import org.eclipse.edc.spi.monitor.Monitor;
import org.eclipse.edc.spi.telemetry.Telemetry;
import org.eclipse.edc.spi.types.TypeManager;

import java.time.Clock;

@Provides({ Monitor.class, TypeManager.class, Telemetry.class, Clock.class })
class SyntheticExtension implements org.eclipse.edc.spi.system.ServiceExtension {
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,11 @@

class DependencyGraphTest {

private DependencyGraph sorter;
private DependencyGraph graph;

@BeforeEach
void setUp() {
sorter = new DependencyGraph();
graph = new DependencyGraph();
}

@Test
Expand All @@ -38,7 +38,7 @@ void sortExtensions_withDefaultProvider() {

var dependentExtension = TestFunctions.createDependentExtension(true);

var list = sorter.of(TestFunctions.createList(dependentExtension, providerExtension));
var list = graph.of(TestFunctions.createList(dependentExtension, providerExtension));
assertThat(list).extracting(InjectionContainer::getInjectionTarget)
.contains(providerExtension, Index.atIndex(2))
.contains(dependentExtension, Index.atIndex(3));
Expand All @@ -51,7 +51,7 @@ void sortExtensions_withNoDefaultProvider() {
var provider = TestFunctions.createProviderExtension(true);
var dependentExtension = TestFunctions.createDependentExtension(true);

var list = sorter.of(TestFunctions.createList(dependentExtension, provider, defaultProvider));
var list = graph.of(TestFunctions.createList(dependentExtension, provider, defaultProvider));
assertThat(list).extracting(InjectionContainer::getInjectionTarget)
.contains(provider, Index.atIndex(2))
.contains(defaultProvider, Index.atIndex(3))
Expand All @@ -62,14 +62,14 @@ void sortExtensions_withNoDefaultProvider() {
void sortExtensions_missingDependency() {

var dependentExtension = TestFunctions.createDependentExtension(true);
assertThatThrownBy(() -> sorter.of(TestFunctions.createList(dependentExtension))).isInstanceOf(EdcInjectionException.class);
assertThatThrownBy(() -> graph.of(TestFunctions.createList(dependentExtension))).isInstanceOf(EdcInjectionException.class);
}

@Test
void sortExtensions_missingOptionalDependency() {

var dependentExtension = TestFunctions.createDependentExtension(false);
assertThat(sorter.of(TestFunctions.createList(dependentExtension))).hasSize(3)
assertThat(graph.of(TestFunctions.createList(dependentExtension))).hasSize(3)
.extracting(InjectionContainer::getInjectionTarget)
.usingRecursiveFieldByFieldElementComparator()
.containsOnly(dependentExtension);
Expand All @@ -80,5 +80,13 @@ void sortExtensions_multipleDefaultProviders() {

}

@Test
void sortExtension_verifySyntheticProvider() {

var list = graph.of(TestFunctions.createList());
assertThat(list)
.extracting(InjectionContainer::getInjectionTarget)
.noneMatch(se -> se instanceof SyntheticExtension);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -32,33 +32,22 @@
import org.eclipse.edc.runtime.metamodel.annotation.Extension;
import org.eclipse.edc.runtime.metamodel.annotation.Inject;
import org.eclipse.edc.runtime.metamodel.annotation.Provider;
import org.eclipse.edc.runtime.metamodel.annotation.Provides;
import org.eclipse.edc.runtime.metamodel.annotation.Setting;
import org.eclipse.edc.spi.agent.ParticipantAgentService;
import org.eclipse.edc.spi.command.CommandHandlerRegistry;
import org.eclipse.edc.spi.event.EventRouter;
import org.eclipse.edc.spi.message.RemoteMessageDispatcherRegistry;
import org.eclipse.edc.spi.monitor.Monitor;
import org.eclipse.edc.spi.security.PrivateKeyResolver;
import org.eclipse.edc.spi.system.ExecutorInstrumentation;
import org.eclipse.edc.spi.system.Hostname;
import org.eclipse.edc.spi.system.ServiceExtension;
import org.eclipse.edc.spi.system.ServiceExtensionContext;
import org.eclipse.edc.spi.system.health.HealthCheckService;
import org.eclipse.edc.spi.telemetry.Telemetry;
import org.eclipse.edc.spi.types.TypeManager;

import java.security.PrivateKey;
import java.time.Clock;
import java.time.Duration;

@BaseExtension
@Provides({
Monitor.class,
TypeManager.class,
Clock.class,
Telemetry.class
})
@Extension(value = CoreServicesExtension.NAME)
public class CoreServicesExtension implements ServiceExtension {

Expand Down

0 comments on commit e5c2567

Please sign in to comment.