You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2020/01/10 12:27:10 UTC

[sling-org-apache-sling-dynamic-include] branch feature/SLING-8982 created (now 0b4d79a)

This is an automated email from the ASF dual-hosted git repository.

rombert pushed a change to branch feature/SLING-8982
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-dynamic-include.git.


      at 0b4d79a  SLING-8982 - dynamic-include: upgrade to parent pom 35

This branch includes the following new commits:

     new 0b4d79a  SLING-8982 - dynamic-include: upgrade to parent pom 35

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[sling-org-apache-sling-dynamic-include] 01/01: SLING-8982 - dynamic-include: upgrade to parent pom 35

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rombert pushed a commit to branch feature/SLING-8982
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-dynamic-include.git

commit 0b4d79a598c433e22e0a0d1afeaec7dc74ee0f9a
Author: Robert Munteanu <ro...@apache.org>
AuthorDate: Fri Jan 10 13:26:46 2020 +0100

    SLING-8982 - dynamic-include: upgrade to parent pom 35
---
 pom.xml                                            |  54 +++----
 .../sling/dynamicinclude/CacheControlFilter.java   |  14 +-
 .../apache/sling/dynamicinclude/Configuration.java | 160 +++++++++------------
 .../dynamicinclude/ConfigurationWhiteboard.java    |  31 ++--
 .../sling/dynamicinclude/IncludeTagFilter.java     |  11 +-
 .../dynamicinclude/SyntheticResourceFilter.java    |  21 ++-
 .../generator/IncludeGeneratorWhiteboard.java      |  25 ++--
 .../dynamicinclude/generator/package-info.java     |   3 +-
 .../generator/types/EsiGenerator.java              |   4 +-
 .../generator/types/JsiGenerator.java              |   6 +-
 .../generator/types/SsiGenerator.java              |   4 +-
 .../generator/types/package-info.java              |   3 +-
 .../apache/sling/dynamicinclude/package-info.java  |   3 +-
 .../dynamicinclude/pathmatcher/package-info.java   |   3 +-
 .../sling/dynamicinclude/ConfigurationTest.java    |  44 +++---
 .../ConfigurationWhiteboardTest.java               |  35 ++---
 16 files changed, 191 insertions(+), 230 deletions(-)

diff --git a/pom.xml b/pom.xml
index f846266..244c94a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,14 +23,13 @@
     
     <parent>
         <groupId>org.apache.sling</groupId>
-        <artifactId>sling</artifactId>
-        <version>26</version>
+        <artifactId>sling-bundle-parent</artifactId>
+        <version>35</version>
         <relativePath />
     </parent>    
     
     <artifactId>org.apache.sling.dynamic-include</artifactId>
     <version>3.1.7-SNAPSHOT</version>
-    <packaging>bundle</packaging>
     
     <name>Apache Sling Dynamic Include</name>
     <description>Dynamic Include filter for Apache Sling</description>
@@ -55,50 +54,36 @@
         </developer>
     </developers>
 
-    <build>
-        <plugins>
-           <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-scr-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>generate-scr-scrdescriptor</id>
-                        <goals>
-                            <goal>scr</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>        
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <extensions>true</extensions>
-            </plugin>
-        </plugins>
-    </build>
-
     <dependencies>
         <!-- osgi -->
         <dependency>
             <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.core</artifactId>
+            <artifactId>osgi.core</artifactId>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.compendium</artifactId>
+            <artifactId>osgi.cmpn</artifactId>
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.scr.annotations</artifactId>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.annotation.versioning</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.service.component.annotations</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.servlets.annotations</artifactId>
             <scope>provided</scope>
         </dependency>
 
         <!-- javax -->
         <dependency>
             <groupId>javax.servlet</groupId>
-            <artifactId>servlet-api</artifactId>
+            <artifactId>javax.servlet-api</artifactId>
             <scope>provided</scope>
         </dependency>
 
@@ -126,7 +111,6 @@
         <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
-            <version>1.7.0</version>
             <scope>provided</scope>
         </dependency>
 
@@ -138,10 +122,10 @@
             <scope>provided</scope>
         </dependency>
 
+        <!-- testing -->
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
-            <version>4.12</version>
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -150,6 +134,12 @@
             <version>2.18.3</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.testing.osgi-mock.junit4</artifactId>
+            <version>2.4.10</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
 </project>
diff --git a/src/main/java/org/apache/sling/dynamicinclude/CacheControlFilter.java b/src/main/java/org/apache/sling/dynamicinclude/CacheControlFilter.java
index c515815..3591b3f 100644
--- a/src/main/java/org/apache/sling/dynamicinclude/CacheControlFilter.java
+++ b/src/main/java/org/apache/sling/dynamicinclude/CacheControlFilter.java
@@ -28,15 +28,21 @@ import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.sling.SlingFilter;
-import org.apache.felix.scr.annotations.sling.SlingFilterScope;
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.SlingHttpServletResponse;
+import org.apache.sling.servlets.annotations.SlingServletFilter;
+import org.apache.sling.servlets.annotations.SlingServletFilterScope;
+import org.osgi.framework.Constants;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@SlingFilter(scope = {SlingFilterScope.REQUEST, SlingFilterScope.FORWARD}, order = 0)
+
+@SlingServletFilter(scope = { SlingServletFilterScope.REQUEST, SlingServletFilterScope.FORWARD } )
+@Component(property = { 
+    Constants.SERVICE_RANKING + ":Integer=0"
+})
 public class CacheControlFilter implements Filter {
 
     private static final String HEADER_DATE = "Date";
diff --git a/src/main/java/org/apache/sling/dynamicinclude/Configuration.java b/src/main/java/org/apache/sling/dynamicinclude/Configuration.java
index 51f3823..97a33a1 100755
--- a/src/main/java/org/apache/sling/dynamicinclude/Configuration.java
+++ b/src/main/java/org/apache/sling/dynamicinclude/Configuration.java
@@ -21,101 +21,83 @@ package org.apache.sling.dynamicinclude;
 
 import java.util.Arrays;
 import java.util.List;
-import java.util.Map;
-import java.util.regex.Pattern;
 
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Properties;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.PropertyOption;
-import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.dynamicinclude.pathmatcher.PathMatcher;
 import org.apache.sling.dynamicinclude.pathmatcher.PrefixPathMatcher;
 import org.apache.sling.dynamicinclude.pathmatcher.RegexPathMatcher;
 import org.osgi.framework.Constants;
-import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+import org.osgi.service.metatype.annotations.Option;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * Include filter configuration.
  */
-@Component(metatype = true, configurationFactory = true, label = "Apache Sling Dynamic Include - Configuration", immediate = true, policy = ConfigurationPolicy.REQUIRE)
-@Service(Configuration.class)
-@Properties({
-    @Property(name = Constants.SERVICE_VENDOR, value = "The Apache Software Foundation"),
-    @Property(name = Configuration.PROPERTY_FILTER_ENABLED, boolValue = Configuration.DEFAULT_FILTER_ENABLED, label = "Enabled", description = "Check to enable the filter"),
-    @Property(name = Configuration.PROPERTY_FILTER_PATH, value = Configuration.DEFAULT_FILTER_PATH, label = "Base path regular expression", description = "This SDI configuration will work only for paths matching this value. If value starts with \"^\" sign, regex matching will be performed. Otherwise it will check for path prefix."),
-    @Property(name = Configuration.PROPERTY_FILTER_RESOURCE_TYPES, cardinality = Integer.MAX_VALUE, label = "Resource types", description = "Filter will replace components with selected resource types"),
-    @Property(name = Configuration.PROPERTY_INCLUDE_TYPE, value = Configuration.DEFAULT_INCLUDE_TYPE, label = "Include type", description = "Type of generated include tags", options = {
-        @PropertyOption(name = "SSI", value = "Apache SSI"), @PropertyOption(name = "ESI", value = "ESI"),
-        @PropertyOption(name = "JSI", value = "Javascript")}),
-    @Property(name = Configuration.PROPERTY_ADD_COMMENT, boolValue = Configuration.DEFAULT_ADD_COMMENT, label = "Add comment", description = "Add comment to included components"),
-    @Property(name = Configuration.PROPERTY_FILTER_SELECTOR, value = Configuration.DEFAULT_FILTER_SELECTOR, label = "Filter selector", description = "Selector used to mark included resources"),
-    @Property(name = Configuration.PROPERTY_EXTENSION, value = Configuration.DEFAULT_EXTENSION, label = "Extension", description = "Extension to append to virtual resources to make caching possible"),
-    @Property(name = Configuration.PROPERTY_COMPONENT_TTL, label = "Component TTL", description = "\"Time to live\" cache header for rendered component (in seconds)"),
-    @Property(name = Configuration.PROPERTY_REQUIRED_HEADER, value = Configuration.DEFAULT_REQUIRED_HEADER, label = "Required header", description = "SDI will work only for requests with given header"),
-    @Property(name = Configuration.PROPERTY_IGNORE_URL_PARAMS, cardinality = Integer.MAX_VALUE, label = "Ignore URL params", description = "SDI will process the request even if it contains configured GET parameters"),
-    @Property(name = Configuration.PROPERTY_REWRITE_PATH, boolValue = Configuration.DEFAULT_REWRITE_DISABLED, label = "Include path rewriting", description = "Check to enable include path rewriting"),
-    @Property(name = Configuration.PROPERTY_APPEND_SUFFIX, boolValue = Configuration.DEFAULT_APPEND_SUFFIX, label = "Append suffix to dynamic includes", description = "Check to append the suffix of the parent request to the dynamic include."),
-    @Property(name= Configuration.NAME_HINT_PROPERTY_NAME, value=Configuration.NAME_HINT_VALUE)})
+@Component(service = Configuration.class,
+    immediate = true,
+    configurationPolicy = ConfigurationPolicy.REQUIRE,
+    property = {
+        Constants.SERVICE_VENDOR + "=The Apache Software Foundation",
+        "webconsole.configurationFactory.nameHint={include-filter.config.include-type} for [{include-filter.config.resource-types}] at path: {include-filter.config.path}"
+    })
+@Designate(ocd = Configuration.Config.class, factory = true)
 public class Configuration {
+    
+  @ObjectClassDefinition(name = "Apache Sling Dynamic Include - Configuration")
+  public @interface Config {
+      @AttributeDefinition(name="Enabled", description="Check to enable the filter")
+      boolean include$_$filter_config_enabled() default false;
+      
+      @AttributeDefinition(name="Base path regular expression", description="This SDI configuration will work only for paths matching this value. If value starts with \\\"^\\\" sign, regex matching will be performed. Otherwise it will check for path prefix.")
+      String include$_$filter_config_path() default "/content";
+      
+      @AttributeDefinition(name="Resource types", description="Filter will replace components with selected resource types", cardinality = Integer.MAX_VALUE)
+      String include$_$filter_config_resource$_$types() default "";
+      
+      @AttributeDefinition(name = "Include type", description = "Type of generated include tags", options = {
+          @Option(label = "Apache SSI", value = "SSI"),
+          @Option(label = "ESI", value = "ESI"),
+          @Option(label = "Javascript", value = "JSI")
+      })
+      String include$_$filter_config_include$_$type() default "SSI";
+      
+      @AttributeDefinition(name="Add comment", description = "Add comment to included components")
+      boolean include$_$filter_config_add__comment() default false;
+      
+      @AttributeDefinition(name = "Filter selector", description = "Selector used to mark included resources")
+      String include$_$filter_config_selector() default "nocache";
+
+      @AttributeDefinition(name = "Extension", description = "Extension to append to virtual resources to make caching possible")
+      String include$_$filter_config_extension() default "";
+
+      @AttributeDefinition(name = "Component TTL", description = "\"Time to live\" cache header for rendered component (in seconds)")
+      String include$_$filter_config_ttl() default "";
+
+      @AttributeDefinition(name = "Required header", description = "SDI will work only for requests with given header")
+      String include$_$filter_config_required__header() default "Server-Agent=Communique-Dispatcher";
+
+      @AttributeDefinition(name = "Ignore URL params", description = "SDI will process the request even if it contains configured GET parameters", cardinality = Integer.MAX_VALUE)
+      String include$_$filter_config_ignoreUrlParams() default "";
+
+      @AttributeDefinition(name =  "Include path rewriting", description = "Check to enable include path rewriting")
+      boolean include$_$filter_config_rewrite() default false;
+      
+      @AttributeDefinition(name =  "Append suffix to dynamic includes", description = "Check to append the suffix of the parent request to the dynamic include.")
+      boolean include$_$filter_config_appendSuffix() default true;
+  }
 
   private static final Logger LOG = LoggerFactory.getLogger(Configuration.class);
 
-  static final String PROPERTY_FILTER_PATH = "include-filter.config.path";
-
-  static final String DEFAULT_FILTER_PATH = "/content";
-
-  static final String PROPERTY_FILTER_ENABLED = "include-filter.config.enabled";
-
-  static final boolean DEFAULT_FILTER_ENABLED = false;
-
-  static final String PROPERTY_FILTER_RESOURCE_TYPES = "include-filter.config.resource-types";
-
-  static final String PROPERTY_FILTER_SELECTOR = "include-filter.config.selector";
-
-  static final String DEFAULT_FILTER_SELECTOR = "nocache";
-
-  static final String PROPERTY_EXTENSION = "include-filter.config.extension";
-
-  static final String DEFAULT_EXTENSION = "";
-
-  static final String PROPERTY_COMPONENT_TTL = "include-filter.config.ttl";
-
-  static final String PROPERTY_INCLUDE_TYPE = "include-filter.config.include-type";
-
-  static final String DEFAULT_INCLUDE_TYPE = "SSI";
-
-  static final String PROPERTY_ADD_COMMENT = "include-filter.config.add_comment";
-
-  static final boolean DEFAULT_ADD_COMMENT = false;
-
-  static final String PROPERTY_REQUIRED_HEADER = "include-filter.config.required_header";
-
-  static final String DEFAULT_REQUIRED_HEADER = "Server-Agent=Communique-Dispatcher";
-
-  static final String PROPERTY_IGNORE_URL_PARAMS = "include-filter.config.ignoreUrlParams";
-
-  static final String PROPERTY_REWRITE_PATH = "include-filter.config.rewrite";
-
-  static final String NAME_HINT_PROPERTY_NAME = "webconsole.configurationFactory.nameHint";
-
-  static final String NAME_HINT_VALUE = "{" + PROPERTY_INCLUDE_TYPE + "} for [{"
-            + PROPERTY_FILTER_RESOURCE_TYPES + "}] at path: {" + PROPERTY_FILTER_PATH + "}";
-
-  static final boolean DEFAULT_REWRITE_DISABLED = false;
-
-  static final String PROPERTY_APPEND_SUFFIX = "include-filter.config.appendSuffix";
-
-  static final boolean DEFAULT_APPEND_SUFFIX = true;
-
   private PathMatcher pathMatcher;
 
   private boolean isEnabled;
@@ -141,12 +123,12 @@ public class Configuration {
   private boolean appendSuffix;
 
   @Activate
-  public void activate(ComponentContext context, Map<String, ?> properties) {
-    isEnabled = PropertiesUtil.toBoolean(properties.get(PROPERTY_FILTER_ENABLED), DEFAULT_FILTER_ENABLED);
-    String pathPattern = PropertiesUtil.toString(properties.get(PROPERTY_FILTER_PATH), DEFAULT_FILTER_PATH);
+  public void activate(Config cfg) {
+    isEnabled = cfg.include$_$filter_config_enabled();
+    String pathPattern = cfg.include$_$filter_config_path();
     pathMatcher = choosePathMatcher(pathPattern);
     String[] resourceTypeList;
-    resourceTypeList = PropertiesUtil.toStringArray(properties.get(PROPERTY_FILTER_RESOURCE_TYPES), new String[0]);
+    resourceTypeList = PropertiesUtil.toStringArray(cfg.include$_$filter_config_resource$_$types(), new String[0]);
     for (int i = 0; i < resourceTypeList.length; i++) {
       String[] s = resourceTypeList[i].split(";");
       String name = s[0].trim();
@@ -154,16 +136,16 @@ public class Configuration {
     }
     this.resourceTypes = Arrays.asList(resourceTypeList);
 
-    includeSelector = PropertiesUtil.toString(properties.get(PROPERTY_FILTER_SELECTOR), DEFAULT_FILTER_SELECTOR);
-    extension = PropertiesUtil.toString(properties.get(PROPERTY_EXTENSION), DEFAULT_EXTENSION);
-    ttl = PropertiesUtil.toInteger(properties.get(PROPERTY_COMPONENT_TTL), -1);
-    addComment = PropertiesUtil.toBoolean(properties.get(PROPERTY_ADD_COMMENT), DEFAULT_ADD_COMMENT);
-    includeTypeName = PropertiesUtil.toString(properties.get(PROPERTY_INCLUDE_TYPE), DEFAULT_INCLUDE_TYPE);
-    requiredHeader = PropertiesUtil.toString(properties.get(PROPERTY_REQUIRED_HEADER), DEFAULT_REQUIRED_HEADER);
-    ignoreUrlParams = Arrays.asList(PropertiesUtil.toStringArray(properties.get(PROPERTY_IGNORE_URL_PARAMS),
+    includeSelector = cfg.include$_$filter_config_selector();
+    extension = cfg.include$_$filter_config_extension();
+    ttl = PropertiesUtil.toInteger(cfg.include$_$filter_config_ttl(), -1);
+    addComment = cfg.include$_$filter_config_add__comment();
+    includeTypeName = cfg.include$_$filter_config_include$_$type();
+    requiredHeader = cfg.include$_$filter_config_required__header();
+    ignoreUrlParams = Arrays.asList(PropertiesUtil.toStringArray(cfg.include$_$filter_config_ignoreUrlParams(),
         new String[0]));
-    rewritePath = PropertiesUtil.toBoolean(properties.get(PROPERTY_REWRITE_PATH), DEFAULT_REWRITE_DISABLED);
-    appendSuffix = PropertiesUtil.toBoolean(properties.get(PROPERTY_APPEND_SUFFIX), DEFAULT_APPEND_SUFFIX);
+    rewritePath = cfg.include$_$filter_config_rewrite();
+    appendSuffix = cfg.include$_$filter_config_appendSuffix();
   }
 
   private PathMatcher choosePathMatcher(String pathPattern) {
diff --git a/src/main/java/org/apache/sling/dynamicinclude/ConfigurationWhiteboard.java b/src/main/java/org/apache/sling/dynamicinclude/ConfigurationWhiteboard.java
index 377fbe7..5755dcf 100644
--- a/src/main/java/org/apache/sling/dynamicinclude/ConfigurationWhiteboard.java
+++ b/src/main/java/org/apache/sling/dynamicinclude/ConfigurationWhiteboard.java
@@ -19,23 +19,23 @@
 
 package org.apache.sling.dynamicinclude;
 
-import java.util.Set;
+import static org.osgi.service.component.annotations.FieldOption.UPDATE;
+import static org.osgi.service.component.annotations.ReferenceCardinality.MULTIPLE;
+import static org.osgi.service.component.annotations.ReferencePolicy.DYNAMIC;
+
+import java.util.Collection;
 import java.util.concurrent.CopyOnWriteArraySet;
 
-import java.util.regex.Matcher;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.ReferencePolicy;
-import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.api.SlingHttpServletRequest;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 
-@Component
-@Service(ConfigurationWhiteboard.class)
+@Component(service = ConfigurationWhiteboard.class)
 public class ConfigurationWhiteboard {
 
-    @Reference(referenceInterface = Configuration.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC)
-    private Set<Configuration> configs = new CopyOnWriteArraySet<Configuration>();
+    @Reference(service = Configuration.class, cardinality = MULTIPLE, policy = DYNAMIC, fieldOption = UPDATE)
+    // declared Collection due to SLING-8986
+    private volatile Collection<Configuration> configs = new CopyOnWriteArraySet<Configuration>();
 
     public Configuration getConfiguration(SlingHttpServletRequest request, String resourceType) {
         for (Configuration c : configs) {
@@ -50,12 +50,9 @@ public class ConfigurationWhiteboard {
         final String requestPath = request.getRequestPathInfo().getResourcePath();
         return config.isEnabled() && config.getPathMatcher().match(requestPath);
     }
-
-    protected void bindConfigs(final Configuration config) {
+    
+    // visible for testing
+    void bindConfigs(final Configuration config) {
         configs.add(config);
     }
-
-    protected void unbindConfigs(final Configuration config) {
-        configs.remove(config);
-    }
 }
diff --git a/src/main/java/org/apache/sling/dynamicinclude/IncludeTagFilter.java b/src/main/java/org/apache/sling/dynamicinclude/IncludeTagFilter.java
index 66bdba8..396984b 100644
--- a/src/main/java/org/apache/sling/dynamicinclude/IncludeTagFilter.java
+++ b/src/main/java/org/apache/sling/dynamicinclude/IncludeTagFilter.java
@@ -35,19 +35,22 @@ import javax.servlet.ServletResponse;
 
 import org.apache.commons.lang3.StringEscapeUtils;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.sling.SlingFilter;
-import org.apache.felix.scr.annotations.sling.SlingFilterScope;
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceUtil;
 import org.apache.sling.dynamicinclude.generator.IncludeGenerator;
 import org.apache.sling.dynamicinclude.generator.IncludeGeneratorWhiteboard;
 import org.apache.sling.dynamicinclude.impl.UrlBuilder;
+import org.apache.sling.servlets.annotations.SlingServletFilter;
+import org.apache.sling.servlets.annotations.SlingServletFilterScope;
+import org.osgi.framework.Constants;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@SlingFilter(scope = SlingFilterScope.INCLUDE, order = -500)
+@SlingServletFilter(scope = SlingServletFilterScope.INCLUDE)
+@Component(property = { Constants.SERVICE_RANKING + ":Integer=-500"} )
 public class IncludeTagFilter implements Filter {
 
     private static final Logger LOG = LoggerFactory.getLogger(IncludeTagFilter.class);
diff --git a/src/main/java/org/apache/sling/dynamicinclude/SyntheticResourceFilter.java b/src/main/java/org/apache/sling/dynamicinclude/SyntheticResourceFilter.java
index ef02a96..5073fec 100644
--- a/src/main/java/org/apache/sling/dynamicinclude/SyntheticResourceFilter.java
+++ b/src/main/java/org/apache/sling/dynamicinclude/SyntheticResourceFilter.java
@@ -30,24 +30,21 @@ import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 
 import org.apache.commons.lang3.StringUtils;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Properties;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.request.RequestDispatcherOptions;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceUtil;
-import org.apache.sling.engine.EngineConstants;
+import org.apache.sling.servlets.annotations.SlingServletFilter;
+import org.apache.sling.servlets.annotations.SlingServletFilterScope;
 import org.osgi.framework.Constants;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 
-@Component(metatype = true, label = "Apache Sling Dynamic Include - Synthetic Resource Filter")
-@Service
-@Properties({
-        @Property(name = Constants.SERVICE_VENDOR, value = "The Apache Software Foundation"),
-        @Property(name = EngineConstants.SLING_FILTER_SCOPE, value = EngineConstants.FILTER_SCOPE_REQUEST, propertyPrivate = true),
-        @Property(name = Constants.SERVICE_RANKING, intValue = Integer.MIN_VALUE, propertyPrivate = false) })
+@SlingServletFilter(scope = SlingServletFilterScope.REQUEST)
+@Component(property = { 
+    Constants.SERVICE_RANKING + ":Integer=" + Integer.MIN_VALUE,
+    Constants.SERVICE_VENDOR  +"=The Apache Software Foundation"
+})
 public class SyntheticResourceFilter implements Filter {
 
     @Reference
diff --git a/src/main/java/org/apache/sling/dynamicinclude/generator/IncludeGeneratorWhiteboard.java b/src/main/java/org/apache/sling/dynamicinclude/generator/IncludeGeneratorWhiteboard.java
index aaaaf1a..8294744 100755
--- a/src/main/java/org/apache/sling/dynamicinclude/generator/IncludeGeneratorWhiteboard.java
+++ b/src/main/java/org/apache/sling/dynamicinclude/generator/IncludeGeneratorWhiteboard.java
@@ -19,24 +19,24 @@
 
 package org.apache.sling.dynamicinclude.generator;
 
+import static org.osgi.service.component.annotations.FieldOption.UPDATE;
+import static org.osgi.service.component.annotations.ReferenceCardinality.MULTIPLE;
+import static org.osgi.service.component.annotations.ReferencePolicy.DYNAMIC;
+
 import java.util.Set;
 import java.util.concurrent.CopyOnWriteArraySet;
 
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.ReferencePolicy;
-import org.apache.felix.scr.annotations.Service;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 
 /**
  * Service that provides include generator of given type.
  */
 
-@Component
-@Service(IncludeGeneratorWhiteboard.class)
+@Component(service = IncludeGeneratorWhiteboard.class)
 public class IncludeGeneratorWhiteboard {
 
-    @Reference(referenceInterface = IncludeGenerator.class, cardinality = ReferenceCardinality.MANDATORY_MULTIPLE, policy = ReferencePolicy.DYNAMIC)
+    @Reference(service = IncludeGenerator.class, cardinality = MULTIPLE, policy = DYNAMIC, fieldOption = UPDATE)
     private Set<IncludeGenerator> generators = new CopyOnWriteArraySet<IncludeGenerator>();
 
     public IncludeGenerator getGenerator(String type) {
@@ -47,13 +47,4 @@ public class IncludeGeneratorWhiteboard {
         }
         return null;
     }
-
-    void bindGenerators(IncludeGenerator generator) {
-        generators.add(generator);
-    }
-
-    void unbindGenerators(IncludeGenerator generator) {
-        generators.remove(generator);
-    }
-
 }
diff --git a/src/main/java/org/apache/sling/dynamicinclude/generator/package-info.java b/src/main/java/org/apache/sling/dynamicinclude/generator/package-info.java
index 91d2fc9..823689b 100644
--- a/src/main/java/org/apache/sling/dynamicinclude/generator/package-info.java
+++ b/src/main/java/org/apache/sling/dynamicinclude/generator/package-info.java
@@ -18,5 +18,4 @@
  */
 @Version("3.0.0")
 package org.apache.sling.dynamicinclude.generator;
-import aQute.bnd.annotation.Version;
-
+import org.osgi.annotation.versioning.Version;
diff --git a/src/main/java/org/apache/sling/dynamicinclude/generator/types/EsiGenerator.java b/src/main/java/org/apache/sling/dynamicinclude/generator/types/EsiGenerator.java
index 0e89283..0d47fcd 100755
--- a/src/main/java/org/apache/sling/dynamicinclude/generator/types/EsiGenerator.java
+++ b/src/main/java/org/apache/sling/dynamicinclude/generator/types/EsiGenerator.java
@@ -20,15 +20,13 @@
 package org.apache.sling.dynamicinclude.generator.types;
 
 import org.apache.commons.lang3.StringEscapeUtils;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.dynamicinclude.generator.IncludeGenerator;
+import org.osgi.service.component.annotations.Component;
 
 /**
  * ESI include generator
  */
 @Component
-@Service
 public class EsiGenerator implements IncludeGenerator {
     private static final String GENERATOR_NAME = "ESI";
 
diff --git a/src/main/java/org/apache/sling/dynamicinclude/generator/types/JsiGenerator.java b/src/main/java/org/apache/sling/dynamicinclude/generator/types/JsiGenerator.java
index a251a24..a796022 100755
--- a/src/main/java/org/apache/sling/dynamicinclude/generator/types/JsiGenerator.java
+++ b/src/main/java/org/apache/sling/dynamicinclude/generator/types/JsiGenerator.java
@@ -27,11 +27,10 @@ import java.io.UnsupportedEncodingException;
 import java.net.URL;
 
 import org.apache.commons.lang3.StringEscapeUtils;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.dynamicinclude.generator.IncludeGenerator;
 import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -39,7 +38,6 @@ import org.slf4j.LoggerFactory;
  * Client side include generator - using Ajax/JQuery.
  */
 @Component
-@Service
 public class JsiGenerator implements IncludeGenerator {
     private static final String TEMPLATE_FILENAME = "generators/jquery.html";
 
diff --git a/src/main/java/org/apache/sling/dynamicinclude/generator/types/SsiGenerator.java b/src/main/java/org/apache/sling/dynamicinclude/generator/types/SsiGenerator.java
index efa5712..718d506 100755
--- a/src/main/java/org/apache/sling/dynamicinclude/generator/types/SsiGenerator.java
+++ b/src/main/java/org/apache/sling/dynamicinclude/generator/types/SsiGenerator.java
@@ -19,15 +19,13 @@
 
 package org.apache.sling.dynamicinclude.generator.types;
 
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.dynamicinclude.generator.IncludeGenerator;
+import org.osgi.service.component.annotations.Component;
 
 /**
  * Apache SSI include generator
  */
 @Component
-@Service
 public class SsiGenerator implements IncludeGenerator {
     private static final String GENERATOR_NAME = "SSI";
 
diff --git a/src/main/java/org/apache/sling/dynamicinclude/generator/types/package-info.java b/src/main/java/org/apache/sling/dynamicinclude/generator/types/package-info.java
index 2ffbf94..41f423e 100644
--- a/src/main/java/org/apache/sling/dynamicinclude/generator/types/package-info.java
+++ b/src/main/java/org/apache/sling/dynamicinclude/generator/types/package-info.java
@@ -18,5 +18,4 @@
  */
 @Version("3.0.0")
 package org.apache.sling.dynamicinclude.generator.types;
-import aQute.bnd.annotation.Version;
-
+import org.osgi.annotation.versioning.Version;
diff --git a/src/main/java/org/apache/sling/dynamicinclude/package-info.java b/src/main/java/org/apache/sling/dynamicinclude/package-info.java
index 70512f2..20757e4 100644
--- a/src/main/java/org/apache/sling/dynamicinclude/package-info.java
+++ b/src/main/java/org/apache/sling/dynamicinclude/package-info.java
@@ -18,5 +18,4 @@
  */
 @Version("4.2.1")
 package org.apache.sling.dynamicinclude;
-import aQute.bnd.annotation.Version;
-
+import org.osgi.annotation.versioning.Version;
diff --git a/src/main/java/org/apache/sling/dynamicinclude/pathmatcher/package-info.java b/src/main/java/org/apache/sling/dynamicinclude/pathmatcher/package-info.java
index 1eb7026..e067a58 100644
--- a/src/main/java/org/apache/sling/dynamicinclude/pathmatcher/package-info.java
+++ b/src/main/java/org/apache/sling/dynamicinclude/pathmatcher/package-info.java
@@ -18,5 +18,4 @@
  */
 @Version("3.0.0")
 package org.apache.sling.dynamicinclude.pathmatcher;
-import aQute.bnd.annotation.Version;
-
+import org.osgi.annotation.versioning.Version;
diff --git a/src/test/java/org/apache/sling/dynamicinclude/ConfigurationTest.java b/src/test/java/org/apache/sling/dynamicinclude/ConfigurationTest.java
index d430458..85cdf8a 100644
--- a/src/test/java/org/apache/sling/dynamicinclude/ConfigurationTest.java
+++ b/src/test/java/org/apache/sling/dynamicinclude/ConfigurationTest.java
@@ -24,40 +24,42 @@ import static org.hamcrest.MatcherAssert.assertThat;
 
 import java.util.HashMap;
 import java.util.Map;
-import java.util.regex.PatternSyntaxException;
 import org.apache.sling.dynamicinclude.pathmatcher.PrefixPathMatcher;
+import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 
 public class ConfigurationTest {
 
   private Configuration tested;
+  
+  @Rule
+  public final OsgiContext context = new OsgiContext();
 
   @Before
   public void setUp() {
     tested = new Configuration();
   }
 
-  @Test(expected = PatternSyntaxException.class)
+  @Test(expected = RuntimeException.class)
   public void shouldThrowExceptionWhenRegexisInvalid() throws Exception {
-    Map<String, Object> properties = new HashMap<String, Object>();
-    properties.put(Configuration.PROPERTY_FILTER_PATH, "^(");
-
-    tested.activate(null, properties);
+      
+    context.registerInjectActivateService(tested, "include-filter.config.path", "^(");
   }
 
   @Test
   public void shouldSetDefaultValuesWhenPropertiesAreEmpty() throws Exception {
     Map<String, Object> properties = new HashMap<String, Object>();
 
-    tested.activate(null, properties);
+    context.registerInjectActivateService(tested, properties);
 
     assertThat(tested.getPathMatcher().getClass().isAssignableFrom(PrefixPathMatcher.class), is(true));
     assertThat(tested.getAddComment(), is(false));
     assertThat(tested.getIgnoreUrlParams().size(), is(0));
-    assertThat(tested.getIncludeSelector(), is(Configuration.DEFAULT_FILTER_SELECTOR));
-    assertThat(tested.getIncludeTypeName(), is(Configuration.DEFAULT_INCLUDE_TYPE));
-    assertThat(tested.getRequiredHeader(), is(Configuration.DEFAULT_REQUIRED_HEADER));
+    assertThat(tested.getIncludeSelector(), is("nocache"));
+    assertThat(tested.getIncludeTypeName(), is("SSI"));
+    assertThat(tested.getRequiredHeader(), is("Server-Agent=Communique-Dispatcher"));
     assertThat(tested.getTtl(), is(-1));
     assertThat(tested.isEnabled(), is(false));
     assertThat(tested.hasTtlSet(), is(false));
@@ -67,18 +69,18 @@ public class ConfigurationTest {
   @Test
   public void shouldSetConfigurationValues() throws Exception {
     Map<String, Object> properties = new HashMap<String, Object>();
-    properties.put(Configuration.PROPERTY_FILTER_PATH, "/content/test/path");
-    properties.put(Configuration.PROPERTY_INCLUDE_TYPE, "ESI");
-    properties.put(Configuration.PROPERTY_ADD_COMMENT, true);
-    properties.put(Configuration.PROPERTY_COMPONENT_TTL, 60);
-    properties.put(Configuration.PROPERTY_FILTER_ENABLED, true);
-    properties.put(Configuration.PROPERTY_FILTER_RESOURCE_TYPES, new String[]{"test/resource/type"});
-    properties.put(Configuration.PROPERTY_REQUIRED_HEADER, "CustomHeader: value");
-    properties.put(Configuration.PROPERTY_FILTER_SELECTOR, "cache");
-    properties.put(Configuration.PROPERTY_REWRITE_PATH, true);
-    properties.put(Configuration.PROPERTY_IGNORE_URL_PARAMS, new String[] {"query"});
+    properties.put("include-filter.config.path", "/content/test/path");
+    properties.put("include-filter.config.include-type", "ESI");
+    properties.put("include-filter.config.add_comment", true);
+    properties.put("include-filter.config.ttl", 60);
+    properties.put("include-filter.config.enabled", true);
+    properties.put("include-filter.config.resource-types", new String[]{"test/resource/type"});
+    properties.put("include-filter.config.required_header", "CustomHeader: value");
+    properties.put("include-filter.config.selector", "cache");
+    properties.put("include-filter.config.rewrite", true);
+    properties.put("include-filter.config.ignoreUrlParams", new String[] {"query"});
 
-    tested.activate(null, properties);
+    context.registerInjectActivateService(tested, properties);
 
     assertThat(tested.getPathMatcher().getClass().isAssignableFrom(PrefixPathMatcher.class), is(true));
     assertThat(tested.getAddComment(), is(true));
diff --git a/src/test/java/org/apache/sling/dynamicinclude/ConfigurationWhiteboardTest.java b/src/test/java/org/apache/sling/dynamicinclude/ConfigurationWhiteboardTest.java
index c32e4d9..b53326b 100644
--- a/src/test/java/org/apache/sling/dynamicinclude/ConfigurationWhiteboardTest.java
+++ b/src/test/java/org/apache/sling/dynamicinclude/ConfigurationWhiteboardTest.java
@@ -18,9 +18,6 @@
  */
 package org.apache.sling.dynamicinclude;
 
-import static org.apache.sling.dynamicinclude.Configuration.PROPERTY_FILTER_ENABLED;
-import static org.apache.sling.dynamicinclude.Configuration.PROPERTY_FILTER_PATH;
-import static org.apache.sling.dynamicinclude.Configuration.PROPERTY_FILTER_RESOURCE_TYPES;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.nullValue;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -28,9 +25,12 @@ import static org.mockito.Mockito.when;
 
 import java.util.HashMap;
 import java.util.Map;
+
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.request.RequestPathInfo;
+import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -38,9 +38,12 @@ import org.mockito.junit.MockitoJUnitRunner;
 
 @RunWith(MockitoJUnitRunner.class)
 public class ConfigurationWhiteboardTest {
-
+    
   private static final String TEST_RESOURCE_PATH = "/content/test/engl/home/pageresource";
   public static final String TEST_RESOURCE_TYPE = "test/component/resourceType";
+  
+  @Rule
+  public final OsgiContext context = new OsgiContext();
 
   private ConfigurationWhiteboard tested;
 
@@ -60,11 +63,11 @@ public class ConfigurationWhiteboardTest {
   private Configuration buildConfiguration(boolean enabled, String pathRegex, String[] resourceTypes) {
     Configuration configuration = new Configuration();
     Map<String, Object> properties = new HashMap<String, Object>();
-    properties.put(PROPERTY_FILTER_ENABLED, enabled);
-    properties.put(PROPERTY_FILTER_PATH, pathRegex);
-    properties.put(PROPERTY_FILTER_RESOURCE_TYPES, resourceTypes);
-    configuration.activate(null, properties);
-    return configuration;
+    properties.put("include-filter.config.enabled", enabled);
+    properties.put("include-filter.config.path", pathRegex);
+    properties.put("include-filter.config.resource-types", resourceTypes);
+    
+    return context.registerInjectActivateService(configuration, properties);
   }
 
   @Test
@@ -74,25 +77,25 @@ public class ConfigurationWhiteboardTest {
 
   @Test
   public void shouldNotReturnConfigurationIfResourceTypeDoesNotMatch() throws Exception {
-    Configuration testConfiguration = buildConfiguration(true, "^/content.*$", new String[]{"invalid/resourceType"});
-    tested.bindConfigs(testConfiguration);
+    buildConfiguration(true, "^/content.*$", new String[]{"invalid/resourceType"});
+    context.registerInjectActivateService(tested);
 
     assertThat(tested.getConfiguration(request, TEST_RESOURCE_TYPE), is(nullValue()));
   }
 
   @Test
   public void shouldNotReturnConfigurationIfConfigurationIsDisabled() throws Exception {
-    Configuration testConfiguration = buildConfiguration(false, "^/content.*$", new String[]{TEST_RESOURCE_TYPE});
-    tested.bindConfigs(testConfiguration);
+    buildConfiguration(false, "^/content.*$", new String[]{TEST_RESOURCE_TYPE});
+    context.registerInjectActivateService(tested);
 
     assertThat(tested.getConfiguration(request, TEST_RESOURCE_TYPE), is(nullValue()));
   }
 
   @Test
   public void shouldNotReturnConfigurationIfPathDoesNotMatchRegex() throws Exception {
-    Configuration testConfiguration = buildConfiguration(true, "^/content/notMatched/.*$",
+    buildConfiguration(true, "^/content/notMatched/.*$",
         new String[]{TEST_RESOURCE_TYPE});
-    tested.bindConfigs(testConfiguration);
+    context.registerInjectActivateService(tested);
 
     assertThat(tested.getConfiguration(request, TEST_RESOURCE_TYPE), is(nullValue()));
   }
@@ -100,7 +103,7 @@ public class ConfigurationWhiteboardTest {
   @Test
   public void shouldReturnValidConfiguration() throws Exception {
     Configuration testConfiguration = buildConfiguration(true, "^/content.*$", new String[]{TEST_RESOURCE_TYPE});
-    tested.bindConfigs(testConfiguration);
+    context.registerInjectActivateService(tested);
 
     assertThat(tested.getConfiguration(request, TEST_RESOURCE_TYPE), is(testConfiguration));
   }