Declarative services make things easier than hand-written blueprint.
Change-Id: Ib4d768c6bf6e2ebd15a6574e217d92e0c16c0f2b
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
<packaging>bundle</packaging>
<dependencies>
- <dependency>
- <groupId>org.apache.felix</groupId>
- <artifactId>org.apache.felix.dependencymanager</artifactId>
- </dependency>
- <dependency>
- <groupId>org.osgi</groupId>
- <artifactId>osgi.cmpn</artifactId>
- </dependency>
- <dependency>
- <groupId>org.osgi</groupId>
- <artifactId>org.osgi.core</artifactId>
- </dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
-
- <!-- Testing Dependencies -->
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <scope>test</scope>
- </dependency>
<dependency>
- <groupId>org.mockito</groupId>
- <artifactId>mockito-core</artifactId>
- <scope>test</scope>
+ <groupId>org.osgi</groupId>
+ <artifactId>osgi.cmpn</artifactId>
</dependency>
</dependencies>
+
<build>
<plugins>
<plugin>
import org.eclipse.jdt.annotation.Nullable;
import org.opendaylight.aaa.filterchain.configuration.CustomFilterAdapterConfiguration;
import org.opendaylight.aaa.filterchain.configuration.CustomFilterAdapterListener;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Modified;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferencePolicy;
+import org.osgi.service.component.annotations.ReferencePolicyOption;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Implementation of CustomFilterAdapterConfiguration.
*/
+@Component(immediate = true, configurationPid = "org.opendaylight.aaa.filterchain")
public final class CustomFilterAdapterConfigurationImpl implements CustomFilterAdapterConfiguration {
private static final Logger LOG = LoggerFactory.getLogger(CustomFilterAdapterConfigurationImpl.class);
private volatile List<FilterDTO> instanceFilterDTOs = Collections.emptyList();
- public CustomFilterAdapterConfigurationImpl(final Map<String, String> properties) {
+ @Activate
+ void activate(final Map<String, String> properties) {
update(properties);
}
- public void close() {
- }
-
+ @Modified
// Invoked in response to configuration admin changes
public void update(final Map<String, String> properties) {
if (properties != null) {
}
// Invoked when a Filter OSGi service is added
- public void onFilterAdded(final Filter filter, final Map<String, String> properties) {
+ @Reference(cardinality = ReferenceCardinality.MULTIPLE,
+ policy = ReferencePolicy.DYNAMIC, policyOption = ReferencePolicyOption.GREEDY)
+ public void addFilter(final Filter filter) {
if (filter == null) {
return;
}
LOG.info("Custom Filter {} added", filter);
-
this.instanceFilterDTOs = ImmutableList.<FilterDTO>builder().addAll(instanceFilterDTOs)
.add(FilterDTO.createFilterDTO(filter)).build();
updateListeners();
}
// Invoked when a Filter OSGi service is removed
- public void onFilterRemoved(final Filter filter, final Map<String, String> properties) {
+ public void removeFilter(final Filter filter) {
if (filter == null) {
return;
}
LOG.info("Custom Filter {} removed", filter);
-
FilterDTO toRemove = FilterDTO.createFilterDTO(filter);
this.instanceFilterDTOs = ImmutableList.copyOf(instanceFilterDTOs.stream().filter(dto -> !dto.equals(toRemove))
.collect(Collectors.toList()));
@Override
public Enumeration<String> getInitParameterNames() {
- return filterConfig != null ? new Enumeration<String>() {
+ return filterConfig != null ? new Enumeration<>() {
final Iterator<String> keySet = filterConfig.keySet().iterator();
@Override
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
- xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.2.0">
-
- <cm:cm-properties id="initialProperties" persistent-id="org.opendaylight.aaa.filterchain"/>
-
- <bean id="adapterConfig"
- class="org.opendaylight.aaa.filterchain.configuration.impl.CustomFilterAdapterConfigurationImpl"
- destroy-method="close">
- <cm:managed-properties persistent-id="org.opendaylight.aaa.filterchain"
- update-strategy="component-managed" update-method="update" />
- <argument ref="initialProperties" />
- </bean>
-
- <reference-list interface="javax.servlet.Filter" availability="optional">
- <reference-listener bind-method="onFilterAdded" unbind-method="onFilterRemoved"
- ref="adapterConfig"/>
- </reference-list>
-
- <service ref="adapterConfig"
- interface="org.opendaylight.aaa.filterchain.configuration.CustomFilterAdapterConfiguration"/>
-
-</blueprint>
import static org.junit.Assert.assertSame;
import static org.mockito.Mockito.mock;
-import com.google.common.collect.ImmutableMap;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
}
}
- private final CustomFilterAdapterConfigurationImpl config = new CustomFilterAdapterConfigurationImpl(null);
+ private final CustomFilterAdapterConfigurationImpl config = new CustomFilterAdapterConfigurationImpl();
private final TestCustomFilterAdapterListener listener = new TestCustomFilterAdapterListener();
@Before
@Test
public void testFilterAddedAndRemoved() {
Filter mockFilter = mock(Filter.class);
- config.onFilterAdded(mockFilter, ImmutableMap.of());
+ config.addFilter(mockFilter);
assertEquals(1, listener.updatedInjectedFilters.size());
assertSame(mockFilter, listener.updatedInjectedFilters.get(0));
- config.onFilterRemoved(mockFilter, ImmutableMap.of());
+ config.removeFilter(mockFilter);
assertEquals(0, listener.updatedInjectedFilters.size());
}