You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ra...@apache.org on 2020/09/29 15:51:43 UTC

[sling-org-apache-sling-scripting-bundle-tracker] branch master updated: deprecated the Bundle Tracker

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

radu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-scripting-bundle-tracker.git


The following commit(s) were added to refs/heads/master by this push:
     new ccbdb32  deprecated the Bundle Tracker
ccbdb32 is described below

commit ccbdb324a7254167de69621329ae4f6c14db2628
Author: Radu Cotescu <ra...@apache.org>
AuthorDate: Tue Sep 29 17:50:09 2020 +0200

    deprecated the Bundle Tracker
---
 .asf.yaml                                          |   7 +
 CODE_OF_CONDUCT.md                                 |  22 --
 CONTRIBUTING.md                                    |  24 --
 Jenkinsfile                                        |  20 -
 LICENSE                                            | 202 ----------
 README.md                                          |  94 +----
 pom.xml                                            | 201 ----------
 .../bundle/tracker/BundledRenderUnit.java          | 104 -----
 .../tracker/BundledRenderUnitCapability.java       |  91 -----
 .../scripting/bundle/tracker/ResourceType.java     | 161 --------
 .../scripting/bundle/tracker/TypeProvider.java     |  45 ---
 .../internal/AbstractBundledRenderUnit.java        | 158 --------
 .../bundle/tracker/internal/BundledHooks.java      |  57 ---
 .../internal/BundledRenderUnitCapabilityImpl.java  | 159 --------
 .../tracker/internal/BundledScriptContext.java     | 174 ---------
 .../tracker/internal/BundledScriptFinder.java      | 132 -------
 .../tracker/internal/BundledScriptServlet.java     |  92 -----
 .../tracker/internal/BundledScriptTracker.java     | 429 ---------------------
 .../bundle/tracker/internal/Executable.java        |  60 ---
 .../bundle/tracker/internal/LogWriter.java         | 126 ------
 .../bundle/tracker/internal/PrecompiledScript.java |  75 ----
 .../bundle/tracker/internal/ProtectedBindings.java | 147 -------
 .../scripting/bundle/tracker/internal/Script.java  | 101 -----
 .../tracker/internal/ScriptContextProvider.java    | 146 -------
 .../bundle/tracker/internal/TypeProviderImpl.java  |  70 ----
 .../tracker/internal/request/OnDemandReader.java   |  97 -----
 .../tracker/internal/request/OnDemandWriter.java   | 103 -----
 .../tracker/internal/request/RequestWrapper.java   |  94 -----
 .../tracker/internal/request/ResponseWrapper.java  |  50 ---
 .../scripting/bundle/tracker/package-info.java     |  22 --
 .../scripting/bundle/tracker/ResourceTypeTest.java |  87 -----
 .../bundle/tracker/internal/BundledHooksTest.java  | 130 -------
 .../tracker/internal/BundledScriptContextTest.java | 151 --------
 .../tracker/internal/BundledScriptTrackerTest.java |  47 ---
 .../bundle/tracker/internal/LogWriterTest.java     |  60 ---
 .../tracker/internal/ProtectedBindingsTest.java    | 205 ----------
 src/test/resources/findbugs-exclude.xml            |  23 --
 37 files changed, 11 insertions(+), 3955 deletions(-)

diff --git a/.asf.yaml b/.asf.yaml
new file mode 100644
index 0000000..f9cd802
--- /dev/null
+++ b/.asf.yaml
@@ -0,0 +1,7 @@
+github:
+  description: "Apache Sling Scripting Bundle Tracker (deprecated)"
+  homepage: "https://sling.apache.org"
+  labels:
+    - java
+    - sling
+    - deprecated
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
deleted file mode 100644
index 0fa18e5..0000000
--- a/CODE_OF_CONDUCT.md
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-  ~ Licensed to the Apache Software Foundation (ASF) under one
-  ~ or more contributor license agreements.  See the NOTICE file
-  ~ distributed with this work for additional information
-  ~ regarding copyright ownership.  The ASF licenses this file
-  ~ to you 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.
-  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/-->
-Apache Software Foundation Code of Conduct
-====
-
-Being an Apache project, Apache Sling adheres to the Apache Software Foundation's [Code of Conduct](https://www.apache.org/foundation/policies/conduct.html).
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
deleted file mode 100644
index ac82a1a..0000000
--- a/CONTRIBUTING.md
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-  ~ Licensed to the Apache Software Foundation (ASF) under one
-  ~ or more contributor license agreements.  See the NOTICE file
-  ~ distributed with this work for additional information
-  ~ regarding copyright ownership.  The ASF licenses this file
-  ~ to you 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.
-  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/-->
-Contributing
-====
-
-Thanks for choosing to contribute!
-
-You will find all the necessary details about how you can do this at https://sling.apache.org/contributing.html.
diff --git a/Jenkinsfile b/Jenkinsfile
deleted file mode 100644
index 3882176..0000000
--- a/Jenkinsfile
+++ /dev/null
@@ -1,20 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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.
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
-// please rebuild
-slingOsgiBundleBuild()
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index d645695..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   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.
diff --git a/README.md b/README.md
index aafa0d3..5df35c7 100644
--- a/README.md
+++ b/README.md
@@ -1,96 +1,10 @@
 [![Apache Sling](https://sling.apache.org/res/logos/sling.png)](https://sling.apache.org)
 
-&#32;[![Build Status](https://ci-builds.apache.org/job/Sling/job/modules/job/sling-org-apache-sling-scripting-bundle-tracker/job/master/badge/icon)](https://ci-builds.apache.org/job/Sling/job/modules/job/sling-org-apache-sling-scripting-bundle-tracker/job/master/)&#32;[![Test Status](https://img.shields.io/jenkins/tests.svg?jobUrl=https://ci-builds.apache.org/job/Sling/job/modules/job/sling-org-apache-sling-scripting-bundle-tracker/job/master/)](https://ci-builds.apache.org/job/Sling/job [...]
-
-Apache Sling Scripting Bundle Tracker
+Apache Sling Scripting Bundle Tracker (deprecated)
 ====
 
-## DEPRECATED?
-
-Note that this code has **moved to the [o.a.s.servlets.resolver](https://github.com/apache/sling-org-apache-sling-servlets-resolver/tree/master/src/main/java/org/apache/sling/servlets/resolver/bundle/tracker) module** - as I write this, 
-[discussions are ongoing](https://lists.apache.org/thread.html/r73ffc8f89706444db41cf9e3688799be58b41cd5f16c49468ab4bda5%40%3Cdev.sling.apache.org%3E)
-on the Sling dev list on whether this module needs to be deprecated or repurposed.
-
-## What
-The `org.apache.sling.scripting.bundle.tracker` bundle represents an add-on module that can be deployed on a Sling 10 instance or newer to
-enhance the scripting resolving capabilities. Being an add-on, the bundle hooks into Sling's current mechanisms for
-content-to-servlet resolution and essentially acts as a service registration broker for bundles providing scripting
-capabilities (more details in the ["How"](#how) section).
-
-## Why
-Although traditionally scripts are deployed as content stored in the search paths of a Sling instance, this leaves very little
-room for script evolution in a backwards compatible way. Furthermore, versioning scripts is a difficult process if the only
-mechanism to do this is the `sling:resourceType` property, since consumers (content nodes or other resource types) have then to
-explicitly mention the version expected to be executed.
-
-Scripts should not be considered content, since their only purpose is to actually generate the rendering for a certain content
-structure. They are not consumed by users, but rather by the Sling Engine itself and have very little meaning outside this
-context. As such, scripts should be handled like code:
-
-  1. they _provide an HTTP API_;
-  2. they can evolve in a _semantical_ [1] way;
-  3. they have a _developer audience_.
-
-## How
-Being built around a `BundleTrackerCustomizer` [2], the Scripting Bundle Tracker monitors the instance's bundles wired to itself and
-scans the ones providing a `sling.resourceType` capability [3]. The wiring is created by placing a `Require-Capability` header in
-the bundles that provide the `sling.resourceType` capability:
-
-```
-osgi.extender;filter:="(&(osgi.extender=sling.scripting)(version>=1.0.0)(!(version>=2.0.0)))"
-```
-
-
-A `sling.resourceType` capability has the following attributes:
-
-  1. `sling.resourceType:String` - mandatory; defines the provided resource type; its value is a valid Java package identifier,
-  though it does not need to correspond to one;
-  2. `sling.resourceType.selectors:List` - optional; defines the list of selectors that this resource type can handle;
-  3. `sling.resourceType.extensions:List` - optional; defines the list of extensions that this resource type can handle;
-  4. `version:Version` - mandatory; defines the version of the provided `resourceType`;
-  5. `extends:String` - optional; defines which resource type it extends; the version range of the extended resource type is defined in a
-    `Require-Capability`.
-
-The `BundleTrackerCustomizer` will register a Sling Servlet with the appropriate `sling.servlet` properties for each `sling.resourceType`
-capability. The servlets will be registered using the bundle context of the bundle providing the `sling.resourceType` capability, making
-sure to expose the different versions of a resource type as part of the registered servlet's properties. On top of this, a plain resource
-type bound servlet will also be registered, which will be automatically wired to the highest version of `resourceType`. All the mentioned
-service registrations are managed automatically by the `BundleTrackerCustomizer`.
-
-### So how do I deploy my scripts?
-Short answer: exactly like you deploy your code, preferably right next to it. Pack your scripts using the following conventions:
-
-  1. create a `javax.script` folder in your bundle;
-  2. each folder under `javax.script` will identify a `resourceType`; the folder name should preferably be a valid Java package identifier,
-  but it does not need to refer to an existing one;
-  3. inside each `resourceType` folder create a `Version` folder; this has to follow the Semantic Versioning constraints described at [1];
-  4. add your scripts, using the same naming conventions that you were used to from before [4];
-  5. manually define your provide and require capabilities; just kidding; add the
-  [`scriptingbundle-maven-plugin`](https://github.com/apache/sling-scriptingbundle-maven-plugin) to your build section and add its required
-  properties in the `maven-bundle-plugin`'s instructions (check [this](https://github.com/apache/sling-org-apache-sling-scripting-bundle-tracker-it/tree/master/examples/org-apache-sling-scripting-examplebundle/pom.xml)
-  example);
-  6. `mvn clean sling:install`.
-
-### Integration Tests
-
-The integration tests are provided by the [`org.apache.sling.scripting.bundle.tracker.it`](https://github.com/apache/sling-org-apache-sling-scripting-bundle-tracker-it) project. To run the integration tests execute the following command:
-
-```
-mvn clean verify -Pit
-```
-
-### Example
-
-To play around with a Sling instance on localhost port 8080 (override with -Dhttp.port=<port>) that has the [examples](https://github.com/apache/sling-org-apache-sling-scripting-bundle-tracker-it/tree/master/examples/) installed run:
-
-```
-mvn clean verify -Pexample
-``` 
+This module is part of the [Apache Sling](https://sling.apache.org) project, but it is no longer maintained.
 
-from the [`org.apache.sling.scripting.bundle.tracker.it`](https://github.com/apache/sling-org-apache-sling-scripting-bundle-tracker-it) project.
+Version 2.7.0 of the [`org.apache.sling.servlets.resolver`](https://github.com/apache/sling-org-apache-sling-servlets-resolver) and version 2.3.0 of the [`org.apache.sling.scripting.core`](https://github.com/apache/sling-org-apache-sling-scripting-core) modules provide now the same functionality.
 
-## Resources
-[1] - https://semver.org/  
-[2] - https://osgi.org/javadoc/r6/core/org/osgi/util/tracker/BundleTrackerCustomizer.html  
-[3] - https://osgi.org/download/r6/osgi.core-6.0.0.pdf, Page 41, section 3.3.3 "Bundle Capabilities"  
-[4] - https://sling.apache.org/documentation/the-sling-engine/url-to-script-resolution.html
+For reference or potential bugfix releases please use the [`maintenance`](https://github.com/apache/sling-org-apache-sling-scripting-bundle-tracker/tree/maintenance) branch.
diff --git a/pom.xml b/pom.xml
deleted file mode 100644
index de4f3b9..0000000
--- a/pom.xml
+++ /dev/null
@@ -1,201 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-  ~ Licensed to the Apache Software Foundation (ASF) under one
-  ~ or more contributor license agreements.  See the NOTICE file
-  ~ distributed with this work for additional information
-  ~ regarding copyright ownership.  The ASF licenses this file
-  ~ to you 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.
-  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <groupId>org.apache.sling</groupId>
-        <artifactId>sling-bundle-parent</artifactId>
-        <version>35</version>
-        <relativePath />
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <properties>
-        <jacoco.maven.plugin.version>0.8.2</jacoco.maven.plugin.version>
-    </properties>
-
-    <artifactId>org.apache.sling.scripting.bundle.tracker</artifactId>
-    <version>0.1.1-SNAPSHOT</version>
-    <name>Apache Sling Scripting Bundle Tracker</name>
-    <description>
-        The Apache Sling Scripting Bundle Tracker bundle represents an add-on module that can be deployed on a Sling 10 instance or
-        newer to enhance the scripting resolving capabilities. Being an add-on, the bundle hooks into Sling's current mechanisms for
-        content-to-servlet resolution and essentially acts as a service registration broker for bundles providing scripting capabilities
-    </description>
-
-    <scm>
-        <connection>scm:git:https://gitbox.apache.org/repos/asf/sling-org-apache-sling-scripting-bundle-tracker.git</connection>
-        <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/sling-org-apache-sling-scripting-bundle-tracker.git</developerConnection>
-        <url>https://gitbox.apache.org/repos/asf?p=sling-org-apache-sling-scripting-bundle-tracker.git</url>
-        <tag>HEAD</tag>
-    </scm>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>biz.aQute.bnd</groupId>
-                <artifactId>bnd-maven-plugin</artifactId>
-            </plugin>
-            <plugin>
-                <groupId>biz.aQute.bnd</groupId>
-                <artifactId>bnd-baseline-maven-plugin</artifactId>
-                <configuration>
-                    <failOnMissing>false</failOnMissing>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>com.github.spotbugs</groupId>
-                <artifactId>spotbugs-maven-plugin</artifactId>
-                <version>3.1.11</version>
-                <configuration>
-                    <effort>Max</effort>
-                    <xmlOutput>true</xmlOutput>
-                    <excludeFilterFile>src/test/resources/findbugs-exclude.xml</excludeFilterFile>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>find-bugs</id>
-                        <phase>process-classes</phase>
-                        <goals>
-                            <goal>check</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <configuration>
-                    <argLine>@{argLine}</argLine>
-                </configuration>
-            </plugin>
-
-            <plugin>
-                <groupId>org.jacoco</groupId>
-                <artifactId>jacoco-maven-plugin</artifactId>
-                <version>${jacoco.maven.plugin.version}</version>
-                <executions>
-                    <execution>
-                        <id>prepare-agent</id>
-                        <goals>
-                            <goal>prepare-agent</goal>
-                        </goals>
-                        <configuration>
-                            <destFile>${project.build.directory}/jacoco-unit.exec</destFile>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.jetbrains</groupId>
-            <artifactId>annotations</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.sling</groupId>
-            <artifactId>org.apache.sling.api</artifactId>
-            <version>2.22.0</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.sling</groupId>
-            <artifactId>org.apache.sling.commons.osgi</artifactId>
-            <version>2.4.0</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>javax.servlet-api</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>osgi.core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>osgi.cmpn</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.annotation.versioning</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.annotation.bundle</artifactId>
-            <version>1.0.0</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-lang3</artifactId>
-            <version>3.7</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>commons-io</groupId>
-            <artifactId>commons-io</artifactId>
-            <version>2.6</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.sling</groupId>
-            <artifactId>org.apache.sling.scripting.api</artifactId>
-            <version>2.2.0</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.sling</groupId>
-            <artifactId>org.apache.sling.scripting.core</artifactId>
-            <version>2.0.54</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.sling</groupId>
-            <artifactId>org.apache.sling.commons.compiler</artifactId>
-            <version>2.3.7-SNAPSHOT</version>
-            <scope>provided</scope>
-        </dependency>
-        <!-- TESTING -->
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.mockito</groupId>
-            <artifactId>mockito-core</artifactId>
-            <version>2.25.1</version>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-</project>
diff --git a/src/main/java/org/apache/sling/scripting/bundle/tracker/BundledRenderUnit.java b/src/main/java/org/apache/sling/scripting/bundle/tracker/BundledRenderUnit.java
deleted file mode 100644
index 3849a36..0000000
--- a/src/main/java/org/apache/sling/scripting/bundle/tracker/BundledRenderUnit.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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 org.apache.sling.scripting.bundle.tracker;
-
-import java.util.Set;
-
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.osgi.annotation.versioning.ProviderType;
-import org.osgi.framework.Bundle;
-
-/**
- * <p>
- * A {@code BundledRenderUnit} represents a pre-packaged script or precompiled script that will be executed in order to render a
- * {@link org.apache.sling.api.SlingHttpServletRequest}.
- * </p>
- * <p>
- * If the current {@link org.apache.sling.api.SlingHttpServletRequest} is served by a {@code BundledRenderUnit}, the
- * {@code org.apache.sling.scripting.bundle.tracker} will set the {@code BundledRenderUnit} in the {@link javax.script.Bindings} map associated to the request,
- * under the {@link #VARIABLE} key.
- * </p>
- */
-@ProviderType
-public interface BundledRenderUnit {
-
-    /**
-     * The variable available in the {@link javax.script.Bindings} associated to a {@link org.apache.sling.api.SlingHttpServletRequest}
-     * if that request is served by a {@code BundledRenderUnit}.
-     */
-    String VARIABLE = BundledRenderUnit.class.getName();
-
-    /**
-     * In case this {@code BundledRenderUnit} wraps a precompiled script, this method will return an instance of that object.
-     *
-     * @return a precompiled unit, if {@code this} unit wraps a precompiled script; {@code null} otherwise
-     */
-    @Nullable
-    default Object getUnit() {
-        return null;
-    }
-
-    /**
-     * Returns the name of {@code this BundledRenderUnit}. This can be the name of the wrapped script or precompiled script.
-     *
-     * @return the name {@code this BundledRenderUnit}
-     */
-    @NotNull String getName();
-
-    /**
-     * Returns the {@link Bundle} in which the script or precompiled script is packaged. This method can be useful for getting an
-     * instance of the bundle's classloader, when needed to load dependencies at run time. To do so the following code example can help:
-     *
-     * <pre>
-     * Bundle bundle = bundledRenderUnit.getBundle();
-     * Classloader bundleClassloader = bundle.adapt(BundleWiring.class).getClassLoader();
-     * </pre>
-     */
-    @NotNull Bundle getBundle();
-
-    /**
-     * Returns the {@code Set} of {@link TypeProvider}s which are related to this unit.
-     *
-     * @return the set of providers; if the unit doesn't have any inheritance chains, then the set will contain only one {@link
-     * TypeProvider}
-     */
-    @NotNull Set<TypeProvider> getTypeProviders();
-
-    /**
-     * Retrieves an OSGi runtime dependency of the wrapped script identified by the passed {@code className} parameter.
-     *
-     * @param className the fully qualified class name
-     * @param <T>       the expected service type
-     * @return an instance of the {@link T} or {@code null}
-     */
-    @Nullable <T> T getService(@NotNull String className);
-
-    /**
-     * Retrieves multiple instances of an OSGi runtime dependency of the wrapped script identified by the passed {@code className}
-     * parameter, filtered according to the passed {@code filter}.
-     *
-     * @param className the fully qualified class name
-     * @param filter    a filter expression or {@code null} if all the instances should be returned; for more details about the {@code
-     *                  filter}'s syntax check {@link org.osgi.framework.BundleContext#getServiceReferences(String, String)}
-     * @param <T>       the expected service type
-     * @return an instance of the {@link T} or {@code null}
-     */
-    @Nullable <T> T[] getServices(@NotNull String className, @Nullable String filter);
-}
diff --git a/src/main/java/org/apache/sling/scripting/bundle/tracker/BundledRenderUnitCapability.java b/src/main/java/org/apache/sling/scripting/bundle/tracker/BundledRenderUnitCapability.java
deleted file mode 100644
index dbda3d6..0000000
--- a/src/main/java/org/apache/sling/scripting/bundle/tracker/BundledRenderUnitCapability.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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 org.apache.sling.scripting.bundle.tracker;
-
-import java.util.List;
-import java.util.Set;
-
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.osgi.annotation.versioning.ProviderType;
-
-/**
- * A {@code BundledRenderUnitCapability} encapsulates the values of a {@code Provided-Capability}, based on which {@link BundledRenderUnit}s
- * are generated.
- */
-@ProviderType
-public interface BundledRenderUnitCapability {
-
-    /**
-     * Returns the resource types to which a {@link BundledRenderUnit} described by this capability will be bound to.
-     *
-     * @return the resource types to which a {@link BundledRenderUnit} described by this capability will be bound to
-     */
-    @NotNull Set<ResourceType> getResourceTypes();
-
-    /**
-     * Returns the path to which a {@link BundledRenderUnit} described by this capability will be bound to.
-     *
-     * @return the path to which a {@link BundledRenderUnit} described by this capability will be bound to; this can be {@code null} if the
-     * {@link #getResourceTypes()} doesn't return an empty set
-     */
-    @Nullable String getPath();
-
-    /**
-     * Returns the selectors to which a {@link BundledRenderUnit} described by this capability will be bound to.
-     *
-     * @return the selectors to which a {@link BundledRenderUnit} described by this capability will be bound to
-     */
-    @NotNull List<String> getSelectors();
-
-    /**
-     * Returns the extension to which a {@link BundledRenderUnit} described by this capability will be bound to.
-     *
-     * @return the extension to which a {@link BundledRenderUnit} described by this capability will be bound to
-     */
-    @Nullable String getExtension();
-
-    /**
-     * Returns the resource type extended by this capability.
-     *
-     * @return the extended resource type or {@code null}
-     */
-    @Nullable String getExtendedResourceType();
-
-    /**
-     * Returns the request method to which a {@link BundledRenderUnit} described by this capability will be bound to.
-     *
-     * @return the request method to which a {@link BundledRenderUnit} described by this capability will be bound to
-     */
-    @Nullable String getMethod();
-
-    /**
-     * Returns the script engine short name which can be used to evaluate the {@link BundledRenderUnit} described by this capability.
-     *
-     * @return the script engine short name which can be used to evaluate the {@link BundledRenderUnit} described by this capability.
-     */
-    @Nullable String getScriptEngineName();
-
-    /**
-     * Returns the original's script extension that was used to generate this capability.
-     *
-     * @return the original's script extension that was used to generate this capability.
-     */
-    @Nullable String getScriptExtension();
-}
diff --git a/src/main/java/org/apache/sling/scripting/bundle/tracker/ResourceType.java b/src/main/java/org/apache/sling/scripting/bundle/tracker/ResourceType.java
deleted file mode 100644
index b1399f1..0000000
--- a/src/main/java/org/apache/sling/scripting/bundle/tracker/ResourceType.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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 org.apache.sling.scripting.bundle.tracker;
-
-import java.util.Objects;
-import java.util.regex.Pattern;
-
-import org.apache.commons.lang3.StringUtils;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.osgi.framework.Version;
-
-/**
- * The {@code ResourceTypeParser} provides methods for parsing resource type strings.
- *
- * <p>The following patterns are supported:</p>
- * <ol>
- * <li><tt>a/b/c</tt> - path-based</li>
- * <li><tt>a/b/c/1.0.0</tt> - path-based, versioned</li>
- * <li><tt>a.b.c</tt> - Java package name</li>
- * <li><tt>a.b.c/1.0.0</tt> - Java package name, versioned</li>
- * <li><tt>a</tt> - flat (sub-set of path-based)</li>
- * </ol>
- */
-public final class ResourceType {
-
-    private static final Pattern versionPattern = Pattern.compile("[\\d\\.]+(-.*)*$");
-
-    private final String type;
-    private final String version;
-    private final String resourceLabel;
-    private final String toString;
-
-    private ResourceType(@NotNull String type, @Nullable String version) {
-        this.type = type;
-        this.version = version;
-        if (type.lastIndexOf('/') != -1) {
-            resourceLabel = type.substring(type.lastIndexOf('/') + 1);
-        } else if (type.lastIndexOf('.') != -1) {
-            resourceLabel = type.substring(type.lastIndexOf('.') + 1);
-        } else {
-            resourceLabel = type;
-        }
-        toString = type + (version == null ? "" : "/" + version);
-    }
-
-    /**
-     * Returns a resource type's label. The label is important for script selection, since it will provide the name of the main script
-     * for this resource type. For more details check the Apache Sling
-     * <a href="https://sling.apache.org/documentation/the-sling-engine/url-to-script-resolution.html#scripts-for-get-requests">URL to
-     * Script Resolution</a> page
-     *
-     * @return the resource type label
-     */
-    @NotNull
-    public String getResourceLabel() {
-        return resourceLabel;
-    }
-
-    /**
-     * Returns the resource type string, without any version information.
-     *
-     * @return the resource type string
-     */
-    @NotNull
-    public String getType() {
-        return type;
-    }
-
-    /**
-     * Returns the version, if available.
-     *
-     * @return the version, if available; {@code null} otherwise
-     */
-    @Nullable
-    public String getVersion() {
-        return version;
-    }
-
-    @Override
-    public String toString() {
-        return toString;
-    }
-
-    /**
-     * Given a {@code resourceTypeString}, this method will extract a {@link ResourceType} object.
-     * <p>The accepted patterns are:</p>
-     * <ol>
-     * <li><tt>a/b/c</tt> - path-based</li>
-     * <li><tt>a/b/c/1.0.0</tt> - path-based, versioned</li>
-     * <li><tt>a.b.c</tt> - Java package name</li>
-     * <li><tt>a.b.c/1.0.0</tt> - Java package name, versioned</li>
-     * <li><tt>a</tt> - flat (sub-set of path-based)</li>
-     * </ol>
-     *
-     * @param resourceTypeString the resource type string to parse
-     * @return a {@link ResourceType} object
-     * @throws IllegalArgumentException if the {@code resourceTypeString} cannot be parsed
-     */
-    @NotNull
-    public static ResourceType parseResourceType(@NotNull String resourceTypeString) {
-        String type = StringUtils.EMPTY;
-        String version = null;
-        if (StringUtils.isNotEmpty(resourceTypeString)) {
-            int lastSlash = resourceTypeString.lastIndexOf('/');
-            if (lastSlash != -1 && !resourceTypeString.endsWith("/")) {
-                String versionString = resourceTypeString.substring(lastSlash + 1);
-                if (versionPattern.matcher(versionString).matches()) {
-                    try {
-                        version = Version.parseVersion(versionString).toString();
-                        type = resourceTypeString.substring(0, lastSlash);
-                    } catch (IllegalArgumentException e) {
-                        type = resourceTypeString;
-                    }
-                } else {
-                    type = resourceTypeString;
-                }
-            } else {
-                type = resourceTypeString;
-            }
-        }
-        if (StringUtils.isEmpty(type)) {
-            throw new IllegalArgumentException(String.format("Cannot extract a type for the resourceTypeString %s.", resourceTypeString));
-        }
-        return new ResourceType(type, version);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(type, version, resourceLabel);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj instanceof ResourceType) {
-            ResourceType other = (ResourceType) obj;
-            return Objects.equals(type, other.type) && Objects.equals(version, other.version) && Objects.equals(resourceLabel,
-                    other.resourceLabel);
-        }
-        return false;
-    }
-}
diff --git a/src/main/java/org/apache/sling/scripting/bundle/tracker/TypeProvider.java b/src/main/java/org/apache/sling/scripting/bundle/tracker/TypeProvider.java
deleted file mode 100644
index f508c52..0000000
--- a/src/main/java/org/apache/sling/scripting/bundle/tracker/TypeProvider.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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 org.apache.sling.scripting.bundle.tracker;
-
-import org.jetbrains.annotations.NotNull;
-import org.osgi.annotation.versioning.ProviderType;
-import org.osgi.framework.Bundle;
-
-/**
- * A {@code TypeProvider} keeps an association between a {@link BundledRenderUnitCapability} and the bundle that provides it.
- */
-@ProviderType
-public interface TypeProvider {
-
-    /**
-     * Returns the {@link BundledRenderUnitCapability}.
-     *
-     * @return the {@link BundledRenderUnitCapability}
-     */
-    @NotNull BundledRenderUnitCapability getBundledRenderUnitCapability();
-
-    /**
-     * Returns the providing bundle.
-     *
-     * @return the providing bundle
-     */
-    @NotNull Bundle getBundle();
-
-}
diff --git a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/AbstractBundledRenderUnit.java b/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/AbstractBundledRenderUnit.java
deleted file mode 100644
index 9362b32..0000000
--- a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/AbstractBundledRenderUnit.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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 org.apache.sling.scripting.bundle.tracker.internal;
-
-import java.lang.reflect.Array;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.sling.scripting.bundle.tracker.TypeProvider;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-abstract class AbstractBundledRenderUnit implements Executable {
-
-    private static final Logger LOG = LoggerFactory.getLogger(AbstractBundledRenderUnit.class.getName());
-
-    private final Set<TypeProvider> providers;
-    private final Bundle bundle;
-    private final BundleContext bundleContext;
-    private final String path;
-    private final String scriptEngineName;
-    private List<ServiceReference<?>> references;
-    private Map<String, Object> services;
-
-
-    AbstractBundledRenderUnit(@NotNull Set<TypeProvider> providers, @NotNull Bundle bundle, @NotNull String path,
-                              @NotNull String scriptEngineName) {
-        this.providers = providers;
-        this.bundle = bundle;
-        this.path = path;
-        this.scriptEngineName = scriptEngineName;
-        bundleContext = bundle.getBundleContext();
-    }
-
-    @Override
-    @NotNull
-    public Bundle getBundle() {
-        return bundle;
-    }
-
-    @Override
-    public @NotNull Set<TypeProvider> getTypeProviders() {
-        return providers;
-    }
-
-    @Override
-    public @NotNull String getPath() {
-        return path;
-    }
-
-    @Override
-    public @NotNull String getScriptEngineName() {
-        return scriptEngineName;
-    }
-
-    @Override
-    @Nullable
-    @SuppressWarnings("unchecked")
-    public <T> T getService(@NotNull String className) {
-        LOG.debug("Attempting to load class {} as an OSGi service.", className);
-        T result = (this.services == null ? null : (T) this.services.get(className));
-        if (result == null) {
-            final ServiceReference<?> ref = this.bundleContext.getServiceReference(className);
-            if (ref != null) {
-                result = (T) this.bundleContext.getService(ref);
-                if (result != null) {
-                    if (this.services == null) {
-                        this.services = new HashMap<>();
-                    }
-                    if (this.references == null) {
-                        this.references = new ArrayList<>();
-                    }
-                    this.references.add(ref);
-                    this.services.put(className, result);
-                    return result;
-                }
-            }
-        }
-        return null;
-    }
-
-    @Override
-    @Nullable
-    @SuppressWarnings("unchecked")
-    public <T> T[] getServices(@NotNull String className, @Nullable String filter) {
-        T[] result = null;
-        try {
-            final ServiceReference<?>[] refs = this.bundleContext.getServiceReferences(className, filter);
-
-            if (refs != null) {
-                // sort by service ranking (lowest first) (see ServiceReference#compareTo(Object))
-                List<ServiceReference<?>> localReferences = Arrays.asList(refs);
-                Collections.sort(localReferences);
-                // get the highest ranking first
-                Collections.reverse(localReferences);
-
-                final List<T> objects = new ArrayList<>();
-                for (ServiceReference<?> reference : localReferences) {
-                    final T service = (T) this.bundleContext.getService(reference);
-                    if (service != null) {
-                        if (this.references == null) {
-                            this.references = new ArrayList<>();
-                        }
-                        this.references.add(reference);
-                        objects.add(service);
-                    }
-                }
-                if (!objects.isEmpty()) {
-                    T[] srv = (T[]) Array.newInstance(bundle.loadClass(className), objects.size());
-                    result = objects.toArray(srv);
-                }
-            }
-        } catch (Exception e) {
-            LOG.error(String.format("Unable to retrieve the services of type %s.", className), e);
-        }
-        return result;
-    }
-
-    @Override
-    public void releaseDependencies() {
-        if (references != null) {
-            for (ServiceReference<?> reference : this.references) {
-                bundleContext.ungetService(reference);
-            }
-            references.clear();
-        }
-        if (services != null) {
-            services.clear();
-        }
-    }
-
-}
diff --git a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/BundledHooks.java b/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/BundledHooks.java
deleted file mode 100644
index 371df4b..0000000
--- a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/BundledHooks.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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 org.apache.sling.scripting.bundle.tracker.internal;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceEvent;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.hooks.service.EventListenerHook;
-import org.osgi.framework.hooks.service.FindHook;
-import org.osgi.framework.hooks.service.ListenerHook;
-import org.osgi.service.component.annotations.Component;
-
-@Component
-public class BundledHooks implements FindHook, EventListenerHook {
-    @Override
-    public void find(BundleContext context, String name, String filter, boolean allServices, Collection<ServiceReference<?>> references) {
-        if (!context.getBundle().getSymbolicName().equals("org.apache.sling.servlets.resolver")) {
-            for (Iterator<ServiceReference<?>> iter = references.iterator(); iter.hasNext();) {
-                if (iter.next().getProperty(BundledHooks.class.getName()) != null) {
-                    iter.remove();
-                }
-            }
-        }
-    }
-
-
-    @Override
-    public void event(ServiceEvent event, Map<BundleContext, Collection<ListenerHook.ListenerInfo>> listeners) {
-        if (event.getServiceReference().getProperty(BundledHooks.class.getName()) != null) {
-            for (Iterator<Map.Entry<BundleContext, Collection<ListenerHook.ListenerInfo>>> entries = listeners.entrySet().iterator(); entries.hasNext();) {
-                if (!entries.next().getKey().getBundle().getSymbolicName().equals("org.apache.sling.servlets.resolver")) {
-                    entries.remove();
-                }
-            }
-        }
-    }
-}
diff --git a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/BundledRenderUnitCapabilityImpl.java b/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/BundledRenderUnitCapabilityImpl.java
deleted file mode 100644
index 469f1e5..0000000
--- a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/BundledRenderUnitCapabilityImpl.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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 org.apache.sling.scripting.bundle.tracker.internal;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-
-import org.apache.sling.api.servlets.ServletResolverConstants;
-import org.apache.sling.commons.osgi.PropertiesUtil;
-import org.apache.sling.scripting.bundle.tracker.BundledRenderUnitCapability;
-import org.apache.sling.scripting.bundle.tracker.ResourceType;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.osgi.framework.Version;
-import org.osgi.framework.wiring.BundleCapability;
-
-class BundledRenderUnitCapabilityImpl  implements BundledRenderUnitCapability {
-
-    private final Set<ResourceType> resourceTypes;
-    private final String path;
-    private final List<String> selectors;
-    private final String extension;
-    private final String method;
-    private final String extendedResourceType;
-    private final String scriptEngineName;
-    private final String scriptExtension;
-
-    private BundledRenderUnitCapabilityImpl(@NotNull Set<ResourceType> resourceTypes, @Nullable String path,
-                                            @NotNull List<String> selectors,
-                                        @Nullable String extension, @Nullable String method,
-                                        @Nullable String extendedResourceType, @Nullable String scriptEngineName,
-                                        @Nullable String scriptExtension) {
-        this.resourceTypes = resourceTypes;
-        this.path = path;
-        this.selectors = selectors;
-        this.extension = extension;
-        this.method = method;
-        this.extendedResourceType = extendedResourceType;
-        this.scriptEngineName = scriptEngineName;
-        this.scriptExtension = scriptExtension;
-    }
-
-    @Override
-    @NotNull
-    public Set<ResourceType> getResourceTypes() {
-        return Collections.unmodifiableSet(resourceTypes);
-    }
-
-    @Override
-    @Nullable
-    public String getPath() {
-        return path;
-    }
-
-    @Override
-    @NotNull
-    public List<String> getSelectors() {
-        return Collections.unmodifiableList(selectors);
-    }
-
-    @Override
-    @Nullable
-    public String getExtension() {
-        return extension;
-    }
-
-    @Override
-    @Nullable
-    public String getExtendedResourceType() {
-        return extendedResourceType;
-    }
-
-    @Override
-    @Nullable
-    public String getMethod() {
-        return method;
-    }
-
-    @Override
-    @Nullable
-    public String getScriptEngineName() {
-        return scriptEngineName;
-    }
-
-    @Override
-    @Nullable
-    public String getScriptExtension() {
-        return scriptExtension;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(resourceTypes, path, selectors, extension, method, extendedResourceType, scriptEngineName, scriptExtension);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj instanceof BundledRenderUnitCapability) {
-            BundledRenderUnitCapability other = (BundledRenderUnitCapability) obj;
-            return Objects.equals(resourceTypes, other.getResourceTypes()) && Objects.equals(path, other.getPath()) &&
-                    Objects.equals(selectors, other.getSelectors()) &&
-                    Objects.equals(extension, other.getExtension()) && Objects.equals(method, other.getMethod()) &&
-                    Objects.equals(extendedResourceType, other.getExtendedResourceType()) &&
-                    Objects.equals(scriptEngineName, other.getScriptEngineName()) &&
-                    Objects.equals(scriptExtension, other.getScriptExtension());
-        }
-        return false;
-    }
-
-    public static BundledRenderUnitCapability fromBundleCapability(@NotNull BundleCapability capability) {
-        Map<String, Object> attributes = capability.getAttributes();
-        Set<ResourceType> resourceTypes = new LinkedHashSet<>();
-        String[] capabilityResourceTypes =
-                PropertiesUtil.toStringArray(attributes.get(ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES), new String[0]);
-        Version version = (Version) attributes.get(BundledScriptTracker.AT_VERSION);
-        for (String rt : capabilityResourceTypes) {
-            if (version == null) {
-                resourceTypes.add(ResourceType.parseResourceType(rt));
-            } else {
-                resourceTypes.add(ResourceType.parseResourceType(rt + "/" + version.toString()));
-            }
-        }
-        return new BundledRenderUnitCapabilityImpl(
-                resourceTypes,
-                (String) attributes.get(ServletResolverConstants.SLING_SERVLET_PATHS),
-                Arrays.asList(
-                        PropertiesUtil.toStringArray(attributes.get(ServletResolverConstants.SLING_SERVLET_SELECTORS), new String[0])),
-                (String) attributes.get(ServletResolverConstants.SLING_SERVLET_EXTENSIONS),
-                (String) attributes.get(ServletResolverConstants.SLING_SERVLET_METHODS),
-                (String) attributes.get(BundledScriptTracker.AT_EXTENDS),
-                (String) attributes.get(BundledScriptTracker.AT_SCRIPT_ENGINE),
-                (String) attributes.get(BundledScriptTracker.AT_SCRIPT_EXTENSION)
-        );
-    }
-}
diff --git a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/BundledScriptContext.java b/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/BundledScriptContext.java
deleted file mode 100644
index 43c5fde..0000000
--- a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/BundledScriptContext.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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 org.apache.sling.scripting.bundle.tracker.internal;
-
-import java.io.Reader;
-import java.io.Writer;
-import java.util.Arrays;
-import java.util.List;
-
-import javax.script.Bindings;
-import javax.script.SimpleScriptContext;
-
-import org.apache.sling.api.scripting.LazyBindings;
-import org.apache.sling.api.scripting.SlingScriptConstants;
-
-class BundledScriptContext extends SimpleScriptContext {
-
-    private static final Integer[] SCOPES = {SlingScriptConstants.SLING_SCOPE, GLOBAL_SCOPE, ENGINE_SCOPE};
-
-    private Bindings globalScope = new LazyBindings();
-    private Bindings engineScope = new LazyBindings();
-    private Bindings slingScope = new LazyBindings();
-
-    @Override
-    public void setBindings(final Bindings bindings, final int scope) {
-        if (bindings == null) {
-            throw new NullPointerException("None of the ScriptContext scopes accepts null bindings.");
-        }
-        switch (scope) {
-            case SlingScriptConstants.SLING_SCOPE:
-                this.slingScope = bindings;
-                break;
-            case 100:
-                this.engineScope = bindings;
-                break;
-            case 200:
-                this.globalScope = bindings;
-                break;
-            default:
-                throw new IllegalArgumentException("Invalid scope.");
-        }
-    }
-
-    @Override
-    public Bindings getBindings(final int scope) {
-        switch (scope) {
-            case SlingScriptConstants.SLING_SCOPE:
-                return slingScope;
-            case 100:
-                return this.engineScope;
-            case 200:
-                return this.globalScope;
-        }
-        throw new IllegalArgumentException("Invalid scope.");
-    }
-
-    @Override
-    public void setAttribute(final String name, final Object value, final int scope) {
-        if (name == null) {
-            throw new IllegalArgumentException("Name is null.");
-        }
-        final Bindings bindings = getBindings(scope);
-        if (bindings != null) {
-            bindings.put(name, value);
-        }
-    }
-
-    @Override
-    public Object getAttribute(String name) {
-        if (name == null) {
-            throw new IllegalArgumentException("Name is null");
-        }
-        for (final int scope : SCOPES) {
-            final Bindings bindings = getBindings(scope);
-            if (bindings != null) {
-                final Object o = bindings.get(name);
-                if (o != null) {
-                    return o;
-                }
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public Object getAttribute(final String name, final int scope) {
-        if (name == null) {
-            throw new IllegalArgumentException("Name is null.");
-        }
-        final Bindings bindings = getBindings(scope);
-        if (bindings != null) {
-            return bindings.get(name);
-        }
-        return null;
-    }
-
-    @Override
-    public Object removeAttribute(final String name, final int scope) {
-        if (name == null) {
-            throw new IllegalArgumentException("Name is null.");
-        }
-        final Bindings bindings = getBindings(scope);
-        if (bindings != null) {
-            return bindings.remove(name);
-        }
-        return null;
-    }
-
-    @Override
-    public int getAttributesScope(String name) {
-        if (name == null) {
-            throw new IllegalArgumentException("Name is null.");
-        }
-        for (final int scope : SCOPES) {
-            if ((getBindings(scope) != null) && (getBindings(scope).containsKey(name))) {
-                return scope;
-            }
-        }
-        return -1;
-    }
-
-    @Override
-    public List<Integer> getScopes() {
-        return Arrays.asList(SCOPES);
-    }
-
-    @Override
-    public Writer getWriter() {
-        return writer;
-    }
-
-    @Override
-    public Writer getErrorWriter() {
-        return errorWriter;
-    }
-
-    @Override
-    public void setWriter(Writer writer) {
-        this.writer = writer;
-    }
-
-    @Override
-    public void setErrorWriter(Writer writer) {
-        this.errorWriter = writer;
-    }
-
-    @Override
-    public Reader getReader() {
-        return reader;
-    }
-
-    @Override
-    public void setReader(Reader reader) {
-        this.reader = reader;
-    }
-
-
-}
diff --git a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/BundledScriptFinder.java b/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/BundledScriptFinder.java
deleted file mode 100644
index f4f44e2..0000000
--- a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/BundledScriptFinder.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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 org.apache.sling.scripting.bundle.tracker.internal;
-
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.sling.commons.compiler.source.JavaEscapeHelper;
-import org.apache.sling.scripting.bundle.tracker.BundledRenderUnitCapability;
-import org.apache.sling.scripting.bundle.tracker.ResourceType;
-import org.apache.sling.scripting.bundle.tracker.TypeProvider;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.osgi.framework.Bundle;
-import org.osgi.service.component.annotations.Component;
-
-@Component(
-        service = BundledScriptFinder.class
-)
-public class BundledScriptFinder {
-
-    private static final String NS_JAVAX_SCRIPT_CAPABILITY = "javax.script";
-    private static final String SLASH = "/";
-    private static final String DOT = ".";
-
-    Executable getScript(Set<TypeProvider> providers, Set<TypeProvider> allProviders) {
-        for (TypeProvider provider : providers) {
-            BundledRenderUnitCapability capability = provider.getBundledRenderUnitCapability();
-            for (String match : buildScriptMatches(capability.getResourceTypes(),
-                    capability.getSelectors().toArray(new String[0]), capability.getMethod(), capability.getExtension())) {
-                String scriptExtension = capability.getScriptExtension();
-                String scriptEngineName = capability.getScriptEngineName();
-                if (StringUtils.isNotEmpty(scriptExtension) && StringUtils.isNotEmpty(scriptEngineName)) {
-                    Executable executable = getExecutable(provider.getBundle(), match, scriptEngineName, scriptExtension, allProviders);
-                    if (executable != null) {
-                        return executable;
-                    }
-                }
-            }
-        }
-        return null;
-    }
-
-    Executable getScript(@NotNull Bundle bundle, @NotNull String path, @NotNull String scriptEngineName,
-                         @NotNull Set<TypeProvider> providers) {
-        String className = JavaEscapeHelper.makeJavaPackage(path);
-        try {
-            Class<?> clazz = bundle.loadClass(className);
-            return new PrecompiledScript(providers, bundle, path, clazz, scriptEngineName);
-        } catch (ClassNotFoundException ignored) {
-            URL bundledScriptURL = bundle.getEntry(NS_JAVAX_SCRIPT_CAPABILITY + (path.startsWith("/") ? "" : SLASH) + path);
-            if (bundledScriptURL != null) {
-                return new Script(providers, bundle, path, bundledScriptURL, scriptEngineName);
-            }    // do nothing here
-        }
-
-        return null;
-    }
-
-    @Nullable
-    private Executable getExecutable(@NotNull Bundle bundle, @NotNull String match, @NotNull String scriptEngineName,
-                                     @NotNull String scriptExtension, @NotNull Set<TypeProvider> providers) {
-        String path = match + DOT + scriptExtension;
-        return getScript(bundle, path, scriptEngineName, providers);
-    }
-
-    private List<String> buildScriptMatches(Set<ResourceType> resourceTypes, String[] selectors, String method, String extension) {
-        List<String> matches = new ArrayList<>();
-        for (ResourceType resourceType : resourceTypes) {
-            if (selectors.length > 0) {
-                for (int i = selectors.length - 1; i >= 0; i--) {
-                    String base =
-                            resourceType.getType() +
-                                    (StringUtils.isNotEmpty(resourceType.getVersion()) ? SLASH + resourceType.getVersion() + SLASH :
-                                            SLASH) +
-                                    String.join(SLASH, Arrays.copyOf(selectors, i + 1));
-                    if (StringUtils.isNotEmpty(extension)) {
-                        if (StringUtils.isNotEmpty(method)) {
-                            matches.add(base + DOT + extension + DOT + method);
-                        }
-                        matches.add(base + DOT + extension);
-                    }
-                    if (StringUtils.isNotEmpty(method)) {
-                        matches.add(base + DOT + method);
-                    }
-                    matches.add(base);
-                }
-            }
-            String base = resourceType.getType() +
-                    (StringUtils.isNotEmpty(resourceType.getVersion()) ? SLASH + resourceType.getVersion() : StringUtils.EMPTY);
-
-            if (StringUtils.isNotEmpty(extension)) {
-                if (StringUtils.isNotEmpty(method)) {
-                    matches.add(base + SLASH + resourceType.getResourceLabel() + DOT + extension + DOT + method);
-                }
-                matches.add(base + SLASH + resourceType.getResourceLabel() + DOT + extension);
-            }
-            if (StringUtils.isNotEmpty(method)) {
-                matches.add(base + SLASH + resourceType.getResourceLabel() + DOT + method);
-            }
-            matches.add(base + SLASH + resourceType.getResourceLabel());
-            if (StringUtils.isNotEmpty(method)) {
-                matches.add(base + SLASH + method);
-            }
-            if (StringUtils.isNotEmpty(extension)) {
-                matches.add(base + SLASH + extension);
-            }
-        }
-        return Collections.unmodifiableList(matches);
-    }
-}
diff --git a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/BundledScriptServlet.java b/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/BundledScriptServlet.java
deleted file mode 100644
index bfdb35e..0000000
--- a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/BundledScriptServlet.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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 org.apache.sling.scripting.bundle.tracker.internal;
-
-import java.io.IOException;
-import java.util.Collection;
-import java.util.LinkedHashSet;
-import java.util.stream.Collectors;
-
-import javax.script.ScriptException;
-import javax.servlet.GenericServlet;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-
-import org.apache.sling.api.SlingConstants;
-import org.apache.sling.api.SlingHttpServletRequest;
-import org.apache.sling.api.SlingHttpServletResponse;
-import org.apache.sling.scripting.bundle.tracker.TypeProvider;
-import org.apache.sling.scripting.bundle.tracker.internal.request.RequestWrapper;
-import org.apache.sling.scripting.bundle.tracker.internal.request.ResponseWrapper;
-import org.jetbrains.annotations.NotNull;
-
-class BundledScriptServlet extends GenericServlet {
-
-    private final ScriptContextProvider scriptContextProvider;
-    private final LinkedHashSet<TypeProvider> wiredTypeProviders;
-    private final Executable executable;
-
-
-    BundledScriptServlet(@NotNull ScriptContextProvider scriptContextProvider,
-                         @NotNull LinkedHashSet<TypeProvider> wiredTypeProviders,
-                         @NotNull Executable executable) {
-        this.scriptContextProvider = scriptContextProvider;
-        this.wiredTypeProviders = wiredTypeProviders;
-        this.executable = executable;
-    }
-
-    @Override
-    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
-        if ((req instanceof SlingHttpServletRequest) && (res instanceof SlingHttpServletResponse)) {
-            SlingHttpServletRequest request = (SlingHttpServletRequest) req;
-            SlingHttpServletResponse response = (SlingHttpServletResponse) res;
-
-            if (request.getAttribute(SlingConstants.ATTR_INCLUDE_SERVLET_PATH) == null) {
-                final String contentType = request.getResponseContentType();
-                if (contentType != null) {
-                    response.setContentType(contentType);
-                    if (contentType.startsWith("text/")) {
-                        response.setCharacterEncoding("UTF-8");
-                    }
-                }
-            }
-
-            RequestWrapper requestWrapper = new RequestWrapper(request,
-                    wiredTypeProviders.stream().map(typeProvider -> typeProvider.getBundledRenderUnitCapability().getResourceTypes()
-            ).flatMap(Collection::stream).collect(Collectors.toSet()));
-            ScriptContextProvider.ExecutableContext executableContext = scriptContextProvider
-                    .prepareScriptContext(requestWrapper, new ResponseWrapper(response), executable);
-            try {
-                executableContext.eval();
-            } catch (ScriptException se) {
-                Throwable cause = (se.getCause() == null) ? se : se.getCause();
-                throw new ServletException(String.format("Failed executing script %s: %s", executable.getName(), se.getMessage()), cause);
-            } finally {
-                executableContext.clean();
-            }
-        } else {
-            throw new ServletException("Not a Sling HTTP request/response");
-        }
-    }
-
-    public String toString() {
-        return getClass().getSimpleName() + "(" + executable.getName() + ")";
-    }
-}
diff --git a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/BundledScriptTracker.java b/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/BundledScriptTracker.java
deleted file mode 100644
index f23c9bd..0000000
--- a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/BundledScriptTracker.java
+++ /dev/null
@@ -1,429 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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 org.apache.sling.scripting.bundle.tracker.internal;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.function.Supplier;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import javax.servlet.GenericServlet;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.Servlet;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.sling.api.SlingConstants;
-import org.apache.sling.api.SlingHttpServletRequest;
-import org.apache.sling.api.SlingHttpServletResponse;
-import org.apache.sling.api.request.RequestDispatcherOptions;
-import org.apache.sling.api.servlets.ServletResolverConstants;
-import org.apache.sling.commons.osgi.PropertiesUtil;
-import org.apache.sling.scripting.bundle.tracker.ResourceType;
-import org.apache.sling.scripting.bundle.tracker.BundledRenderUnitCapability;
-import org.apache.sling.scripting.bundle.tracker.TypeProvider;
-import org.jetbrains.annotations.NotNull;
-import org.osgi.annotation.bundle.Capability;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleEvent;
-import org.osgi.framework.Constants;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.ServiceRegistration;
-import org.osgi.framework.Version;
-import org.osgi.framework.wiring.BundleCapability;
-import org.osgi.framework.wiring.BundleRevision;
-import org.osgi.framework.wiring.BundleWire;
-import org.osgi.framework.wiring.BundleWiring;
-import org.osgi.namespace.extender.ExtenderNamespace;
-import org.osgi.service.component.annotations.Activate;
-import org.osgi.service.component.annotations.Component;
-import org.osgi.service.component.annotations.Deactivate;
-import org.osgi.service.component.annotations.Reference;
-import org.osgi.util.tracker.BundleTracker;
-import org.osgi.util.tracker.BundleTrackerCustomizer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Component(
-        service = {}
-)
-@Capability(namespace = ExtenderNamespace.EXTENDER_NAMESPACE,
-            name = BundledScriptTracker.NS_SLING_SCRIPTING_EXTENDER,
-            version = "1.0.0")
-public class BundledScriptTracker implements BundleTrackerCustomizer<List<ServiceRegistration<Servlet>>> {
-    static final String NS_SLING_SCRIPTING_EXTENDER = "sling.scripting";
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(BundledScriptTracker.class);
-    private static final String REGISTERING_BUNDLE = "org.apache.sling.scripting.bundle.tracker.internal.BundledScriptTracker.registering_bundle";
-    public static final String NS_SLING_SERVLET = "sling.servlet";
-    public static final String AT_VERSION = "version";
-    public static final String AT_SCRIPT_ENGINE = "scriptEngine";
-    public static final String AT_SCRIPT_EXTENSION = "scriptExtension";
-    public static final String AT_EXTENDS = "extends";
-
-    @Reference
-    private BundledScriptFinder bundledScriptFinder;
-
-    @Reference
-    private ScriptContextProvider scriptContextProvider;
-
-
-    private volatile BundleContext m_context;
-    private volatile BundleTracker<List<ServiceRegistration<Servlet>>> m_tracker;
-    private volatile Map<Set<String>, ServiceRegistration<Servlet>> m_dispatchers = new HashMap<>();
-
-    @Activate
-    protected void activate(BundleContext context) {
-        m_context = context;
-        m_tracker = new BundleTracker<>(context, Bundle.ACTIVE, this);
-        m_tracker.open();
-    }
-
-    @Deactivate
-    protected void deactivate() {
-        m_tracker.close();
-    }
-
-    @Override
-    public List<ServiceRegistration<Servlet>> addingBundle(Bundle bundle, BundleEvent event) {
-        BundleWiring bundleWiring = bundle.adapt(BundleWiring.class);
-        if (bundleWiring.getRequiredWires("osgi.extender").stream().map(BundleWire::getProvider).map(BundleRevision::getBundle)
-                .anyMatch(m_context.getBundle()::equals)) {
-            LOGGER.debug("Inspecting bundle {} for {} capability.", bundle.getSymbolicName(), NS_SLING_SERVLET);
-            List<BundleCapability> capabilities = bundleWiring.getCapabilities(NS_SLING_SERVLET);
-            Set<TypeProvider> requiresChain = collectRequiresChain(bundleWiring);
-            if (!capabilities.isEmpty()) {
-                List<ServiceRegistration<Servlet>> serviceRegistrations = capabilities.stream().flatMap(cap ->
-                {
-                    Hashtable<String, Object> properties = new Hashtable<>();
-                    properties.put(ServletResolverConstants.SLING_SERVLET_NAME, BundledScriptServlet.class.getName());
-                    properties.put(Constants.SERVICE_DESCRIPTION, BundledScriptServlet.class.getName() + cap.getAttributes());
-                    BundledRenderUnitCapability bundledRenderUnitCapability = BundledRenderUnitCapabilityImpl.fromBundleCapability(cap);
-                    Executable executable = null;
-                    TypeProvider baseTypeProvider = new TypeProviderImpl(bundledRenderUnitCapability, bundle);
-                    LinkedHashSet<TypeProvider> inheritanceChain = new LinkedHashSet<>();
-                    inheritanceChain.add(baseTypeProvider);
-                    if (!bundledRenderUnitCapability.getResourceTypes().isEmpty()) {
-                        String[] resourceTypesRegistrationValue = new String[bundledRenderUnitCapability.getResourceTypes().size()];
-                        int rtIndex = 0;
-                        for (ResourceType resourceType : bundledRenderUnitCapability.getResourceTypes()) {
-                            resourceTypesRegistrationValue[rtIndex++] = resourceType.toString();
-                        }
-                        properties.put(ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES, resourceTypesRegistrationValue);
-
-                        String extension = bundledRenderUnitCapability.getExtension();
-                        if (StringUtils.isEmpty(extension)) {
-                            extension = "html";
-                        }
-                        properties.put(ServletResolverConstants.SLING_SERVLET_EXTENSIONS, extension);
-
-                        if (!bundledRenderUnitCapability.getSelectors().isEmpty()) {
-                            properties.put(ServletResolverConstants.SLING_SERVLET_SELECTORS, bundledRenderUnitCapability.getSelectors().toArray());
-                        }
-
-                        if (StringUtils.isNotEmpty(bundledRenderUnitCapability.getMethod())) {
-                            properties.put(ServletResolverConstants.SLING_SERVLET_METHODS, bundledRenderUnitCapability.getMethod());
-                        }
-
-                        String extendedResourceTypeString = bundledRenderUnitCapability.getExtendedResourceType();
-                        if (StringUtils.isNotEmpty(extendedResourceTypeString)) {
-                            collectInheritanceChain(inheritanceChain, bundleWiring, extendedResourceTypeString);
-                            inheritanceChain.stream().filter(typeProvider -> typeProvider.getBundledRenderUnitCapability().getResourceTypes().stream()
-                                    .anyMatch(resourceType -> resourceType.getType().equals(extendedResourceTypeString))).findFirst()
-                                    .ifPresent(typeProvider -> {
-                                        for (ResourceType type : typeProvider.getBundledRenderUnitCapability().getResourceTypes()) {
-                                            if (type.getType().equals(extendedResourceTypeString)) {
-                                                properties.put(ServletResolverConstants.SLING_SERVLET_RESOURCE_SUPER_TYPE, type.toString());
-                                            }
-                                        }
-                                    });
-                        }
-                        Set<TypeProvider> aggregate =
-                                Stream.concat(inheritanceChain.stream(), requiresChain.stream()).collect(Collectors.toCollection(LinkedHashSet::new));
-                        executable = bundledScriptFinder.getScript(inheritanceChain, aggregate);
-                    } else if (StringUtils.isNotEmpty(bundledRenderUnitCapability.getPath()) && StringUtils.isNotEmpty(
-                            bundledRenderUnitCapability.getScriptEngineName())) {
-                        Set<TypeProvider> aggregate =
-                                Stream.concat(inheritanceChain.stream(), requiresChain.stream()).collect(Collectors.toCollection(LinkedHashSet::new));
-                        executable = bundledScriptFinder.getScript(baseTypeProvider.getBundle(),
-                                bundledRenderUnitCapability.getPath(), bundledRenderUnitCapability.getScriptEngineName(), aggregate);
-                    }
-                    List<ServiceRegistration<Servlet>> regs = new ArrayList<>();
-
-                    if (executable != null) {
-                        Executable finalExecutable = executable;
-                        bundledRenderUnitCapability.getResourceTypes().forEach(resourceType -> {
-                            if (finalExecutable.getPath().startsWith(resourceType.toString() + "/")) {
-                                properties.put(ServletResolverConstants.SLING_SERVLET_PATHS, finalExecutable.getPath());
-                            }
-                        });
-                        if (executable.getPath().equals(bundledRenderUnitCapability.getPath())) {
-                            properties.put(ServletResolverConstants.SLING_SERVLET_PATHS, executable.getPath());
-                        }
-                        properties.put(BundledHooks.class.getName(), "true");
-                        regs.add(
-                                bundle.getBundleContext().registerService(
-                                        Servlet.class,
-                                        new BundledScriptServlet(scriptContextProvider, inheritanceChain, executable),
-                                        properties
-                                )
-                        );
-                    } else {
-                        LOGGER.error(String.format("Unable to locate an executable for capability %s.", cap));
-                    }
-
-                    return regs.stream();
-                }).collect(Collectors.toList());
-                refreshDispatcher(serviceRegistrations);
-                return serviceRegistrations;
-            } else {
-                return Collections.emptyList();
-            }
-        } else {
-            return Collections.emptyList();
-        }
-    }
-
-    private void refreshDispatcher(List<ServiceRegistration<Servlet>> regs) {
-        Map<Set<String>, ServiceRegistration<Servlet>> dispatchers = new HashMap<>();
-        Stream.concat(m_tracker.getTracked().values().stream(), Stream.of(regs)).flatMap(List::stream)
-            .filter(ref -> getResourceTypeVersion(ref.getReference()) != null)
-            .map(this::toProperties)
-            .collect(Collectors.groupingBy(BundledScriptTracker::getResourceTypes)).forEach((rt, propList) -> {
-            Hashtable<String, Object> properties = new Hashtable<>();
-            properties.put(ServletResolverConstants.SLING_SERVLET_NAME, DispatcherServlet.class.getName());
-            properties.put(ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES, rt.toArray());
-            Set<String> methods = propList.stream()
-                    .map(props -> props.getOrDefault(ServletResolverConstants.SLING_SERVLET_METHODS, new String[]{"GET", "HEAD"}))
-                    .map(PropertiesUtil::toStringArray).map(Arrays::asList).flatMap(List::stream).collect(Collectors.toSet());
-            Set<String> extensions = propList.stream().map(props -> props.getOrDefault(ServletResolverConstants
-                    .SLING_SERVLET_EXTENSIONS, new String[]{"html"})).map(PropertiesUtil::toStringArray).map(Arrays::asList).flatMap
-                    (List::stream).collect(Collectors.toSet());
-            properties.put(ServletResolverConstants.SLING_SERVLET_EXTENSIONS, extensions.toArray(new String[0]));
-            if (!methods.equals(new HashSet<>(Arrays.asList("GET", "HEAD")))) {
-                properties.put(ServletResolverConstants.SLING_SERVLET_METHODS, methods.toArray(new String[0]));
-            }
-            ServiceRegistration<Servlet> reg = m_dispatchers.remove(rt);
-            if (reg == null) {
-                Optional<BundleContext> registeringBundle = propList.stream().map(props -> {
-                    Bundle bundle = (Bundle) props.get(REGISTERING_BUNDLE);
-                    if (bundle != null) {
-                        return bundle.getBundleContext();
-                    }
-                    return null;
-                }).findFirst();
-                properties.put(Constants.SERVICE_DESCRIPTION,
-                        DispatcherServlet.class.getName() + "{" + ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES +
-                        "=" + rt + "; " +
-                        ServletResolverConstants.SLING_SERVLET_EXTENSIONS + "=" + extensions + "; " +
-                        ServletResolverConstants.SLING_SERVLET_METHODS + "=" + methods  + "}");
-                properties.put(BundledHooks.class.getName(), "true");
-
-                reg = registeringBundle.orElse(m_context).registerService(Servlet.class, new DispatcherServlet(rt), properties);
-            } else {
-                if (!new HashSet<>(Arrays.asList(PropertiesUtil
-                        .toStringArray(reg.getReference().getProperty(ServletResolverConstants.SLING_SERVLET_METHODS), new String[0])))
-                        .equals(methods)) {
-                    reg.setProperties(properties);
-                }
-            }
-            dispatchers.put(rt, reg);
-        });
-        m_dispatchers.values().forEach(ServiceRegistration::unregister);
-        m_dispatchers = dispatchers;
-    }
-
-    private Hashtable<String, Object> toProperties(ServiceRegistration<?> reg) {
-        Hashtable<String, Object> result = new Hashtable<>();
-        ServiceReference<?> ref = reg.getReference();
-
-        set(ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES, ref, result);
-        set(ServletResolverConstants.SLING_SERVLET_EXTENSIONS, ref, result);
-        set(ServletResolverConstants.SLING_SERVLET_SELECTORS, ref, result);
-        set(ServletResolverConstants.SLING_SERVLET_METHODS, ref, result);
-        result.put(REGISTERING_BUNDLE, reg.getReference().getBundle());
-
-        return result;
-    }
-
-    private void set(String key, ServiceReference<?> ref, Hashtable<String, Object> props) {
-        Object value = ref.getProperty(key);
-        if (value != null) {
-            props.put(key, value);
-        }
-    }
-
-    @Override
-    public void modifiedBundle(Bundle bundle, BundleEvent event, List<ServiceRegistration<Servlet>> regs) {
-        LOGGER.warn("Unexpected modified event {} for bundle {}.", event.toString(), bundle.toString());
-    }
-
-    @Override
-    public void removedBundle(Bundle bundle, BundleEvent event, List<ServiceRegistration<Servlet>> regs) {
-        LOGGER.debug("Bundle {} removed", bundle.getSymbolicName());
-        regs.forEach(ServiceRegistration::unregister);
-        refreshDispatcher(Collections.emptyList());
-    }
-
-    private class DispatcherServlet extends GenericServlet {
-        private final Set<String> m_rt;
-
-        DispatcherServlet(Set<String> rt) {
-            m_rt = rt;
-        }
-
-        @Override
-        public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
-
-            SlingHttpServletRequest slingRequest = (SlingHttpServletRequest) req;
-
-            Optional<ServiceRegistration<Servlet>> target = m_tracker.getTracked().values().stream().flatMap(List::stream)
-                    .filter(
-                            reg -> !reg.getReference().getBundle().equals(m_context.getBundle())
-                    )
-                    .filter(reg -> getResourceTypeVersion(reg.getReference()) != null)
-                    .filter(reg ->
-                    {
-                        Hashtable<String, Object> props = toProperties(reg);
-                        return getResourceTypes(props).equals(m_rt) &&
-                                Arrays.asList(PropertiesUtil
-                                        .toStringArray(props.get(ServletResolverConstants.SLING_SERVLET_METHODS),
-                                                new String[]{"GET", "HEAD"}))
-                                        .contains(slingRequest.getMethod()) &&
-                                Arrays.asList(PropertiesUtil
-                                        .toStringArray(props.get(ServletResolverConstants.SLING_SERVLET_EXTENSIONS), new String[]{"html"}))
-                                        .contains(slingRequest.getRequestPathInfo().getExtension() == null ? "html" :
-                                                slingRequest.getRequestPathInfo().getExtension());
-                    }).min((left, right) ->
-                    {
-                        boolean la = Arrays.asList(PropertiesUtil
-                                .toStringArray(toProperties(left).get(ServletResolverConstants.SLING_SERVLET_SELECTORS), new String[0]))
-                                .containsAll(Arrays.asList(slingRequest.getRequestPathInfo().getSelectors()));
-                        boolean ra = Arrays.asList(PropertiesUtil
-                                .toStringArray(toProperties(right).get(ServletResolverConstants.SLING_SERVLET_SELECTORS), new String[0]))
-                                .containsAll(Arrays.asList(slingRequest.getRequestPathInfo().getSelectors()));
-                        if ((la && ra) || (!la && !ra)) {
-                            return new Version(getResourceTypeVersion(right.getReference()))
-                                    .compareTo(new Version(getResourceTypeVersion(left.getReference())));
-                        } else if (la) {
-                            return -1;
-                        } else {
-                            return 1;
-                        }
-
-                    });
-
-            if (target.isPresent()) {
-                String[] targetRT =
-                        PropertiesUtil.toStringArray(target.get().getReference().getProperty(ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES));
-                if (targetRT == null || targetRT.length == 0) {
-                    ((SlingHttpServletResponse) res).sendError(HttpServletResponse.SC_NOT_FOUND);
-                } else {
-                    String rt = targetRT[0];
-                    RequestDispatcherOptions options = new RequestDispatcherOptions();
-                    options.setForceResourceType(rt);
-
-                    RequestDispatcher dispatcher = slingRequest.getRequestDispatcher(slingRequest.getResource(), options);
-                    if (dispatcher != null) {
-                        if (slingRequest.getAttribute(SlingConstants.ATTR_INCLUDE_SERVLET_PATH) == null) {
-                            final String contentType = slingRequest.getResponseContentType();
-                            if (contentType != null) {
-                                res.setContentType(contentType);
-                                if (contentType.startsWith("text/")) {
-                                    res.setCharacterEncoding("UTF-8");
-                                }
-                            }
-                        }
-                        dispatcher.include(req, res);
-                    } else {
-                        ((SlingHttpServletResponse) res).sendError(HttpServletResponse.SC_NOT_FOUND);
-                    }
-                }
-            } else {
-                ((SlingHttpServletResponse) res).sendError(HttpServletResponse.SC_NOT_FOUND);
-            }
-        }
-    }
-
-    private static String getResourceTypeVersion(ServiceReference<?> ref) {
-        String[] values = PropertiesUtil.toStringArray(ref.getProperty(ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES));
-        if (values != null) {
-            String resourceTypeValue = values[0];
-            ResourceType resourceType = ResourceType.parseResourceType(resourceTypeValue);
-            return resourceType.getVersion();
-        }
-        return null;
-    }
-
-    private static Set<String> getResourceTypes(Hashtable<String, Object> props) {
-        Set<String> resourceTypes = new HashSet<>();
-        String[] values = PropertiesUtil.toStringArray(props.get(ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES));
-        for (String resourceTypeValue : values) {
-            resourceTypes.add(ResourceType.parseResourceType(resourceTypeValue).getType());
-        }
-        return resourceTypes;
-    }
-
-    private void collectInheritanceChain(@NotNull Set<TypeProvider> providers, @NotNull BundleWiring wiring,
-                                         @NotNull String extendedResourceType) {
-        for (BundleWire wire : wiring.getRequiredWires(NS_SLING_SERVLET)) {
-            BundledRenderUnitCapability wiredCapability = BundledRenderUnitCapabilityImpl.fromBundleCapability(wire.getCapability());
-            if (wiredCapability.getSelectors().isEmpty()) {
-                for (ResourceType resourceType : wiredCapability.getResourceTypes()) {
-                    if (extendedResourceType.equals(resourceType.getType())) {
-                        Bundle providingBundle = wire.getProvider().getBundle();
-                        providers.add(new TypeProviderImpl(wiredCapability, providingBundle));
-                        String wiredExtends = wiredCapability.getExtendedResourceType();
-                        if (StringUtils.isNotEmpty(wiredExtends)) {
-                            collectInheritanceChain(providers, wire.getProviderWiring(), wiredExtends);
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    private Set<TypeProvider> collectRequiresChain(@NotNull BundleWiring wiring) {
-        Set<TypeProvider> requiresChain = new LinkedHashSet<>();
-        for (BundleWire wire : wiring.getRequiredWires(NS_SLING_SERVLET)) {
-            BundledRenderUnitCapability wiredCapability = BundledRenderUnitCapabilityImpl.fromBundleCapability(wire.getCapability());
-            if (wiredCapability.getSelectors().isEmpty()) {
-                Bundle providingBundle = wire.getProvider().getBundle();
-                requiresChain.add(new TypeProviderImpl(wiredCapability, providingBundle));
-            }
-        }
-        return requiresChain;
-    }
-}
diff --git a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/Executable.java b/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/Executable.java
deleted file mode 100644
index 8797103..0000000
--- a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/Executable.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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 org.apache.sling.scripting.bundle.tracker.internal;
-
-import javax.script.ScriptContext;
-import javax.script.ScriptEngine;
-import javax.script.ScriptException;
-
-import org.apache.sling.scripting.bundle.tracker.BundledRenderUnit;
-import org.jetbrains.annotations.NotNull;
-
-interface Executable extends BundledRenderUnit {
-
-    /**
-     * Releases all acquired dependencies which were retrieved through {@link #getService(String)} or {@link #getServices(String, String)}.
-     */
-    void releaseDependencies();
-
-    /**
-     * Returns the path of this executable in the resource type hierarchy. The path can be relative to the search paths or absolute.
-     *
-     * @return the path of this executable in the resource type hierarchy
-     */
-    @NotNull
-    String getPath();
-
-    /**
-     * Returns the short name of the {@link ScriptEngine} with which {@code this Executable} can be evaluated.
-     *
-     * @return the short name of the script engine
-     * @see #eval(ScriptEngine, ScriptContext)
-     */
-    @NotNull String getScriptEngineName();
-
-    /**
-     * Provided a {@link ScriptContext}, this method will execute / evaluate the wrapped script or precompiled script.
-     *
-     * @param scriptEngine a suitable script engine; see {@link #getScriptEngineName()} in order to see what {@link ScriptEngine}
-     *                     implementation is expected
-     * @param context      the {@link ScriptContext}
-     * @throws ScriptException if the execution leads to an error
-     */
-    void eval(@NotNull ScriptEngine scriptEngine, @NotNull ScriptContext context) throws ScriptException;
-}
diff --git a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/LogWriter.java b/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/LogWriter.java
deleted file mode 100644
index 4988a2f..0000000
--- a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/LogWriter.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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 org.apache.sling.scripting.bundle.tracker.internal;
-
-import java.io.Writer;
-
-import org.slf4j.Logger;
-
-class LogWriter extends Writer {
-
-    /**
-     * The logger to which the error messages are written
-     */
-    final private Logger logger;
-
-    /**
-     * The internal buffer to gather message data until being flushed or a CR or
-     * LF is encountered in the message data.
-     */
-    final private StringBuilder lineBuffer;
-
-    /**
-     * Creates a writer based on the given logger.
-     *
-     * @param logger the logger
-     */
-    LogWriter(Logger logger) {
-        this.logger = logger;
-        this.lineBuffer = new StringBuilder();
-    }
-
-    /**
-     * Writes the character to the internal buffer unless the character is a CR
-     * or LF in which case the buffer is written to the logger as an error
-     * message.
-     */
-    @Override
-    public void write(int c) {
-        if (c == '\n' || c == '\r') {
-            flush();
-        } else {
-            synchronized (lineBuffer) {
-                lineBuffer.append((char) c);
-            }
-        }
-    }
-
-    /**
-     * Writes the indicated characters to the internal buffer, flushing the
-     * buffer on any occurrence of a CR of LF.
-     */
-    @Override
-    public void write(char[] cbuf, int off, int len) {
-        int i = off;
-        for (int n = 0; n < len; n++, i++) {
-            char c = cbuf[i];
-
-            // if CR/LF flush the line
-            if (c == '\n' || c == '\r') {
-
-                // append upto the CR/LF
-                int subLen = i - off;
-                if (subLen > 0) {
-                    synchronized (lineBuffer) {
-                        lineBuffer.append(cbuf, off, subLen);
-                    }
-                }
-
-                // and flush
-                flush();
-
-                // new offset is after the CR/LF
-                off = i + 1;
-            }
-        }
-
-        // remaining data in the buffer is just appended
-        if (off < i) {
-            synchronized (lineBuffer) {
-                lineBuffer.append(cbuf, off, i - off);
-            }
-        }
-    }
-
-    /**
-     * Writes any data contained in the buffer to the logger as an error message.
-     */
-    @Override
-    public void flush() {
-
-        String message;
-        synchronized (lineBuffer) {
-            if (lineBuffer.length() == 0) {
-                return;
-            }
-            message = lineBuffer.toString();
-            lineBuffer.setLength(0);
-        }
-
-        logger.error(message);
-    }
-
-    /**
-     * Just calls {@link #flush()}
-     */
-    @Override
-    public void close() {
-        flush();
-    }
-}
diff --git a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/PrecompiledScript.java b/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/PrecompiledScript.java
deleted file mode 100644
index 980c640..0000000
--- a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/PrecompiledScript.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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 org.apache.sling.scripting.bundle.tracker.internal;
-
-import java.io.StringReader;
-import java.util.Set;
-
-import javax.script.ScriptContext;
-import javax.script.ScriptEngine;
-import javax.script.ScriptException;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.sling.scripting.bundle.tracker.TypeProvider;
-import org.jetbrains.annotations.NotNull;
-import org.osgi.framework.Bundle;
-
-class PrecompiledScript extends AbstractBundledRenderUnit {
-
-    private static final StringReader EMPTY_READER = new StringReader(StringUtils.EMPTY);
-    private final Class<?> clazz;
-    private volatile Object instance;
-
-    PrecompiledScript(@NotNull Set<TypeProvider> providers, @NotNull Bundle bundle, @NotNull String path, @NotNull Class<?> clazz,
-                      @NotNull String scriptEngineName) {
-        super(providers, bundle, path, scriptEngineName);
-        this.clazz = clazz;
-    }
-
-    @Override
-    @NotNull
-    public String getName() {
-        return clazz.getName();
-    }
-
-    @Override
-    public void eval(@NotNull ScriptEngine scriptEngine, @NotNull ScriptContext context) throws ScriptException {
-        scriptEngine.eval(EMPTY_READER, context);
-    }
-
-    @Override
-    public @NotNull Object getUnit() {
-        Object localInstance = instance;
-        if (localInstance == null) {
-            synchronized (this) {
-                localInstance = instance;
-                if (localInstance == null) {
-                    try {
-                        localInstance = clazz.getDeclaredConstructor().newInstance();
-                        instance = localInstance;
-                    } catch (Exception e) {
-                        throw new IllegalStateException("Cannot instantiate class " + clazz.getName(), e);
-                    }
-                }
-            }
-        }
-        return localInstance;
-    }
-
-}
diff --git a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/ProtectedBindings.java b/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/ProtectedBindings.java
deleted file mode 100644
index 3376b48..0000000
--- a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/ProtectedBindings.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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 org.apache.sling.scripting.bundle.tracker.internal;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Map;
-import java.util.Set;
-
-import javax.script.Bindings;
-
-class ProtectedBindings implements Bindings {
-
-    private final Bindings wrapped;
-    private final Set<String> protectedKeys;
-
-    ProtectedBindings(Bindings wrapped, Set<String> protectedKeys) {
-        this.wrapped = wrapped;
-        this.protectedKeys = protectedKeys;
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * @throws IllegalArgumentException if the key is protected
-     */
-    public Object put(String key, Object value) {
-        if (protectedKeys.contains(key)) {
-            throw new IllegalArgumentException(String.format("Key %s is protected.", key));
-        }
-        return wrapped.put(key, value);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public void putAll(Map<? extends String, ?> toMerge) {
-        for (Map.Entry<? extends String, ?> entry : toMerge.entrySet()) {
-            if (!protectedKeys.contains(entry.getKey())) {
-                wrapped.put(entry.getKey(), entry.getValue());
-            } else {
-                throw new IllegalArgumentException(String.format("Key %s is protected.", entry.getKey()));
-            }
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * @throws IllegalArgumentException if the key is protected
-     */
-    public Object remove(Object key) {
-        if (protectedKeys.contains(key)) {
-            throw new IllegalArgumentException(String.format("Key %s is protected.", key));
-        }
-        return wrapped.remove(key);
-    }
-
-    /**
-     * The clear operation is not supported.
-     */
-    public void clear() {
-        throw new UnsupportedOperationException("ProtectedBindings does not support clear()");
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean containsValue(Object value) {
-        return wrapped.containsValue(value);
-    }
-
-    /**
-     * Returns a Set view of the mappings contains in this map. The Set is
-     * unmodifiable.
-     *
-     * @return an unmodifiable Set view of the map
-     */
-    public Set<Entry<String, Object>> entrySet() {
-        return Collections.unmodifiableSet(wrapped.entrySet());
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean isEmpty() {
-        return wrapped.isEmpty();
-    }
-
-    /**
-     * Returns a Set view of the keys contained in this map. The Set is
-     * unmodifiable.
-     *
-     * @return an unmodifiable Set view of the map's keys
-     */
-    public Set<String> keySet() {
-        return Collections.unmodifiableSet(wrapped.keySet());
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public int size() {
-        return wrapped.size();
-    }
-
-    /**
-     * Returns a Collection view of the values contained in this map. The
-     * Collection is unmodifiable.
-     *
-     * @return an unmodifiable Collection view of the map's values
-     */
-    public Collection<Object> values() {
-        return Collections.unmodifiableCollection(wrapped.values());
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean containsKey(Object key) {
-        return wrapped.containsKey(key);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public Object get(Object key) {
-        return wrapped.get(key);
-    }
-
-}
diff --git a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/Script.java b/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/Script.java
deleted file mode 100644
index bd274b3..0000000
--- a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/Script.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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 org.apache.sling.scripting.bundle.tracker.internal;
-
-import java.io.IOException;
-import java.io.StringReader;
-import java.net.URL;
-import java.nio.charset.StandardCharsets;
-import java.util.Set;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-
-import javax.script.Compilable;
-import javax.script.CompiledScript;
-import javax.script.ScriptContext;
-import javax.script.ScriptEngine;
-import javax.script.ScriptException;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.sling.scripting.bundle.tracker.TypeProvider;
-import org.apache.sling.scripting.core.ScriptNameAwareReader;
-import org.jetbrains.annotations.NotNull;
-import org.osgi.framework.Bundle;
-
-class Script extends AbstractBundledRenderUnit {
-
-    private final URL url;
-    private String sourceCode;
-    private CompiledScript compiledScript = null;
-    private Lock compilationLock = new ReentrantLock();
-    private Lock readLock = new ReentrantLock();
-
-
-    Script(@NotNull Set<TypeProvider> providers, @NotNull Bundle bundle, @NotNull String path, @NotNull URL url,
-           @NotNull String scriptEngineName) {
-        super(providers, bundle, path, scriptEngineName);
-        this.url = url;
-    }
-
-    private String getSourceCode() throws IOException {
-        if (sourceCode == null) {
-            readLock.lock();
-            try {
-                if (sourceCode == null) {
-                    sourceCode = IOUtils.toString(url.openStream(), StandardCharsets.UTF_8);
-                }
-            } finally {
-                readLock.unlock();
-            }
-        }
-        return sourceCode;
-    }
-
-    @NotNull
-    @Override
-    public String getName() {
-        return url.getPath();
-    }
-
-    @Override
-    public void eval(@NotNull ScriptEngine scriptEngine, @NotNull ScriptContext context) throws ScriptException {
-        try {
-            if (scriptEngine instanceof Compilable &&
-                    (compiledScript == null || !scriptEngine.getFactory().equals(compiledScript.getEngine().getFactory()))) {
-                compilationLock.lock();
-                try {
-                    if (compiledScript == null || !scriptEngine.getFactory().equals(compiledScript.getEngine().getFactory())) {
-                        compiledScript =
-                                ((Compilable) scriptEngine)
-                                        .compile(new ScriptNameAwareReader(new StringReader(getSourceCode()), getName()));
-                    }
-                } finally {
-                    compilationLock.unlock();
-                }
-            }
-            if (compiledScript != null) {
-                compiledScript.eval(context);
-            } else {
-                scriptEngine.eval(getSourceCode(), context);
-            }
-        } catch (IOException e) {
-            throw new ScriptException(e);
-        }
-    }
-}
diff --git a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/ScriptContextProvider.java b/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/ScriptContextProvider.java
deleted file mode 100644
index caee87e..0000000
--- a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/ScriptContextProvider.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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 org.apache.sling.scripting.bundle.tracker.internal;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import javax.script.Bindings;
-import javax.script.ScriptContext;
-import javax.script.ScriptEngine;
-import javax.script.ScriptEngineManager;
-import javax.script.ScriptException;
-
-import org.apache.sling.api.SlingHttpServletRequest;
-import org.apache.sling.api.SlingHttpServletResponse;
-import org.apache.sling.api.scripting.LazyBindings;
-import org.apache.sling.api.scripting.SlingBindings;
-import org.apache.sling.api.scripting.SlingScriptConstants;
-import org.apache.sling.scripting.api.BindingsValuesProvider;
-import org.apache.sling.scripting.api.BindingsValuesProvidersByContext;
-import org.apache.sling.scripting.api.resource.ScriptingResourceResolverProvider;
-import org.apache.sling.scripting.bundle.tracker.BundledRenderUnit;
-import org.apache.sling.scripting.core.ScriptHelper;
-import org.osgi.service.component.annotations.Component;
-import org.osgi.service.component.annotations.Reference;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Component(
-        service = ScriptContextProvider.class
-)
-public class ScriptContextProvider {
-
-    private static final Set<String> PROTECTED_BINDINGS = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(
-            SlingBindings.REQUEST,
-            SlingBindings.RESPONSE,
-            SlingBindings.READER,
-            SlingBindings.RESOURCE,
-            SlingBindings.RESOLVER,
-            SlingBindings.OUT,
-            SlingBindings.LOG,
-            SlingBindings.SLING,
-            ScriptEngine.FILENAME,
-            BundledRenderUnit.VARIABLE
-    )));
-
-    @Reference
-    private BindingsValuesProvidersByContext bvpTracker;
-
-    @Reference
-    private ScriptEngineManager scriptEngineManager;
-
-    @Reference
-    private ScriptingResourceResolverProvider scriptingResourceResolverProvider;
-
-    ExecutableContext prepareScriptContext(SlingHttpServletRequest request, SlingHttpServletResponse response, Executable executable)
-            throws IOException {
-        ScriptEngine scriptEngine = scriptEngineManager.getEngineByName(executable.getScriptEngineName());
-        if (scriptEngine == null) {
-            throw new IllegalStateException(String.format("Cannot find a script engine with name %s for executable %s.",
-                    executable.getScriptEngineName(), executable.getPath()));
-        }
-        // prepare the SlingBindings
-        Bindings bindings = new LazyBindings();
-        bindings.put("properties", request.getResource().getValueMap());
-        bindings.put(SlingBindings.REQUEST, request);
-        bindings.put(SlingBindings.RESPONSE, response);
-        bindings.put(SlingBindings.READER, request.getReader());
-        bindings.put(SlingBindings.RESOURCE, request.getResource());
-        bindings.put(SlingBindings.RESOLVER, request.getResource().getResourceResolver());
-        bindings.put(SlingBindings.OUT, response.getWriter());
-        Logger scriptLogger = LoggerFactory.getLogger(executable.getName());
-        bindings.put(SlingBindings.LOG, scriptLogger);
-        bindings.put(SlingBindings.SLING, new ScriptHelper(executable.getBundle().getBundleContext(), null, request, response));
-        bindings.put(BundledRenderUnit.VARIABLE, executable);
-        bindings.put(ScriptEngine.FILENAME, executable.getName());
-        bindings.put(ScriptEngine.FILENAME.replaceAll("\\.", "_"), executable.getName());
-
-        ProtectedBindings protectedBindings = new ProtectedBindings(bindings, PROTECTED_BINDINGS);
-        for (BindingsValuesProvider bindingsValuesProvider : bvpTracker.getBindingsValuesProviders(scriptEngine.getFactory(),
-                BindingsValuesProvider.DEFAULT_CONTEXT)) {
-            bindingsValuesProvider.addBindings(protectedBindings);
-        }
-        ScriptContext scriptContext = new BundledScriptContext();
-        Map<String, LazyBindings.Supplier> slingBindingsSuppliers = new HashMap<>();
-        slingBindingsSuppliers.put(SlingScriptConstants.ATTR_SCRIPT_RESOURCE_RESOLVER,
-                () -> scriptingResourceResolverProvider.getRequestScopedResourceResolver());
-        LazyBindings slingScopeBindings = new LazyBindings(slingBindingsSuppliers);
-        scriptContext.setBindings(slingScopeBindings, SlingScriptConstants.SLING_SCOPE);
-        scriptContext.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
-        scriptContext.setWriter(response.getWriter());
-        scriptContext.setErrorWriter(new LogWriter(scriptLogger));
-        scriptContext.setReader(request.getReader());
-        return new ExecutableContext(scriptContext, executable, scriptEngine);
-    }
-
-    static class ExecutableContext {
-        private final ScriptContext scriptContext;
-        private final Executable executable;
-        private final ScriptEngine scriptEngine;
-
-        private ExecutableContext(ScriptContext scriptContext, Executable executable, ScriptEngine scriptEngine) {
-            this.scriptContext = scriptContext;
-            this.executable = executable;
-            this.scriptEngine = scriptEngine;
-        }
-
-        void eval() throws ScriptException {
-            executable.eval(scriptEngine, scriptContext);
-        }
-
-        void clean() {
-            Bindings engineBindings = scriptContext.getBindings(ScriptContext.ENGINE_SCOPE);
-            if (engineBindings != null && engineBindings.containsKey(SlingBindings.SLING)) {
-                Object scriptHelper = engineBindings.get(SlingBindings.SLING);
-                if (scriptHelper instanceof ScriptHelper) {
-                    ((ScriptHelper) scriptHelper).cleanup();
-                }
-            }
-            executable.releaseDependencies();
-        }
-    }
-
-
-}
diff --git a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/TypeProviderImpl.java b/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/TypeProviderImpl.java
deleted file mode 100644
index fe04d66..0000000
--- a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/TypeProviderImpl.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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 org.apache.sling.scripting.bundle.tracker.internal;
-
-import java.util.Objects;
-
-import org.apache.sling.scripting.bundle.tracker.BundledRenderUnitCapability;
-import org.jetbrains.annotations.NotNull;
-import org.osgi.framework.Bundle;
-
-class TypeProviderImpl implements org.apache.sling.scripting.bundle.tracker.TypeProvider {
-
-    private final BundledRenderUnitCapability bundledRenderUnitCapability;
-    private final Bundle bundle;
-
-    TypeProviderImpl(BundledRenderUnitCapability bundledRenderUnitCapability, Bundle bundle) {
-        this.bundledRenderUnitCapability = bundledRenderUnitCapability;
-        this.bundle = bundle;
-    }
-
-    @NotNull
-    @Override
-    public BundledRenderUnitCapability getBundledRenderUnitCapability() {
-        return bundledRenderUnitCapability;
-    }
-
-    @NotNull
-    @Override
-    public Bundle getBundle() {
-        return bundle;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(bundle, bundledRenderUnitCapability);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj instanceof TypeProviderImpl) {
-            TypeProviderImpl other = (TypeProviderImpl) obj;
-            return Objects.equals(bundle, other.bundle) && Objects.equals(bundledRenderUnitCapability, other.bundledRenderUnitCapability);
-        }
-        return false;
-    }
-
-    @Override
-    public String toString() {
-        return String.format("TypeProvider{ bundledRenderUnitCapability=%s; bundle=%s }", bundledRenderUnitCapability, bundle.getSymbolicName());
-    }
-}
diff --git a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/request/OnDemandReader.java b/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/request/OnDemandReader.java
deleted file mode 100644
index 7af2e7c..0000000
--- a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/request/OnDemandReader.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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 org.apache.sling.scripting.bundle.tracker.internal.request;
-
-import java.io.IOException;
-import java.io.Reader;
-import java.nio.CharBuffer;
-
-import javax.servlet.ServletRequest;
-
-class OnDemandReader extends Reader {
-
-    private final ServletRequest request;
-
-    private Reader delegate;
-
-    OnDemandReader(ServletRequest request) {
-        this.request = request;
-    }
-
-    @Override
-    public void close() throws IOException {
-        if (delegate != null) {
-            delegate.close();
-        }
-    }
-
-    @Override
-    public void mark(int readAheadLimit) throws IOException {
-        getReader().mark(readAheadLimit);
-    }
-
-    @Override
-    public boolean markSupported() {
-        return (delegate != null) && delegate.markSupported();
-    }
-
-    @Override
-    public int read() throws IOException {
-        return getReader().read();
-    }
-
-    @Override
-    public int read(char[] cbuf, int off, int len) throws IOException {
-        return getReader().read(cbuf, off, len);
-    }
-
-    @Override
-    public int read(char[] cbuf) throws IOException {
-        return getReader().read(cbuf);
-    }
-
-    @Override
-    public int read(CharBuffer target) throws IOException {
-        return getReader().read(target);
-    }
-
-    @Override
-    public boolean ready() throws IOException {
-        return getReader().ready();
-    }
-
-    @Override
-    public void reset() throws IOException {
-        if (delegate != null) {
-            delegate.reset();
-        }
-    }
-
-    @Override
-    public long skip(long n) throws IOException {
-        return getReader().skip(n);
-    }
-
-    private Reader getReader() throws IOException {
-        if (delegate == null) {
-            delegate = request.getReader();
-        }
-        return delegate;
-    }
-}
diff --git a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/request/OnDemandWriter.java b/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/request/OnDemandWriter.java
deleted file mode 100644
index c26ebba..0000000
--- a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/request/OnDemandWriter.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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 org.apache.sling.scripting.bundle.tracker.internal.request;
-
-import java.io.IOException;
-import java.io.Writer;
-
-import javax.servlet.ServletResponse;
-
-class OnDemandWriter extends Writer {
-
-    private final ServletResponse response;
-
-    private Writer delegate;
-
-    OnDemandWriter(ServletResponse response) {
-        this.response = response;
-    }
-
-    private Writer getWriter() throws IOException {
-        if (delegate == null) {
-            delegate = response.getWriter();
-        }
-
-        return delegate;
-    }
-
-    @Override
-    public void write(int c) throws IOException {
-        synchronized (lock) {
-            getWriter().write(c);
-        }
-    }
-
-    @Override
-    public void write(char[] cbuf) throws IOException {
-        synchronized (lock) {
-            getWriter().write(cbuf);
-        }
-    }
-
-    @Override
-    public void write(char[] cbuf, int off, int len) throws IOException {
-        synchronized (lock) {
-            getWriter().write(cbuf, off, len);
-        }
-    }
-
-    @Override
-    public void write(String str) throws IOException {
-        synchronized (lock) {
-            getWriter().write(str);
-        }
-    }
-
-    @Override
-    public void write(String str, int off, int len) throws IOException {
-        synchronized (lock) {
-            getWriter().write(str, off, len);
-        }
-    }
-
-    @Override
-    public void flush() throws IOException {
-        synchronized (lock) {
-            Writer writer = delegate;
-            if (writer != null) {
-                writer.flush();
-            }
-        }
-    }
-
-    @Override
-    public void close() throws IOException {
-        synchronized (lock) {
-            // flush and close the delegate if existing, otherwise ignore
-            Writer writer = delegate;
-            if (writer != null) {
-                writer.flush();
-                writer.close();
-
-                // drop the delegate now
-                delegate = null;
-            }
-        }
-    }
-}
diff --git a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/request/RequestWrapper.java b/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/request/RequestWrapper.java
deleted file mode 100644
index e80663a..0000000
--- a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/request/RequestWrapper.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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 org.apache.sling.scripting.bundle.tracker.internal.request;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.util.Set;
-
-import javax.servlet.RequestDispatcher;
-
-import org.apache.commons.lang3.StringUtils;
-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.wrappers.SlingHttpServletRequestWrapper;
-import org.apache.sling.scripting.bundle.tracker.ResourceType;
-
-public class RequestWrapper extends SlingHttpServletRequestWrapper {
-
-    private final Set<ResourceType> wiredResourceTypes;
-    private BufferedReader reader;
-
-    public RequestWrapper(SlingHttpServletRequest wrappedRequest, Set<ResourceType> wiredResourceTypes) {
-        super(wrappedRequest);
-        this.wiredResourceTypes = wiredResourceTypes;
-    }
-
-    @Override
-    public RequestDispatcher getRequestDispatcher(Resource resource, RequestDispatcherOptions options) {
-        if (resource == null) {
-            return null;
-        }
-        if (options != null && StringUtils.isEmpty(options.getForceResourceType())) {
-            options.setForceResourceType(resource.getResourceType());
-        }
-        RequestDispatcherOptions processedOptions = processOptions(options);
-        return super.getRequestDispatcher(resource, processedOptions);
-    }
-
-    @Override
-    public RequestDispatcher getRequestDispatcher(String path, RequestDispatcherOptions options) {
-        if (path == null) {
-            return null;
-        }
-        RequestDispatcherOptions processedOptions = processOptions(options);
-        return super.getRequestDispatcher(path, processedOptions);
-    }
-
-    @Override
-    public BufferedReader getReader() {
-        if (reader == null) {
-            reader = new BufferedReader(new OnDemandReader(getRequest()));
-        }
-        return reader;
-    }
-
-    private RequestDispatcherOptions processOptions(RequestDispatcherOptions options) {
-        if (options != null) {
-            RequestDispatcherOptions requestDispatcherOptions = new RequestDispatcherOptions();
-            requestDispatcherOptions.setForceResourceType(options.getForceResourceType());
-            requestDispatcherOptions.setAddSelectors(options.getAddSelectors());
-            requestDispatcherOptions.setReplaceSelectors(options.getReplaceSelectors());
-            requestDispatcherOptions.setReplaceSuffix(options.getReplaceSuffix());
-            String forcedResourceType = options.getForceResourceType();
-            if (StringUtils.isNotEmpty(forcedResourceType)) {
-                for (ResourceType wiredResourceType : wiredResourceTypes) {
-                    String type = wiredResourceType.getType();
-                    if (type.equals(forcedResourceType)) {
-                        requestDispatcherOptions.setForceResourceType(wiredResourceType.toString());
-                        break;
-                    }
-                }
-            }
-            return requestDispatcherOptions;
-        }
-        return null;
-    }
-}
diff --git a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/request/ResponseWrapper.java b/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/request/ResponseWrapper.java
deleted file mode 100644
index 88714ef..0000000
--- a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/request/ResponseWrapper.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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 org.apache.sling.scripting.bundle.tracker.internal.request;
-
-import java.io.PrintWriter;
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.apache.sling.api.SlingHttpServletResponse;
-import org.apache.sling.api.wrappers.SlingHttpServletResponseWrapper;
-
-public class ResponseWrapper extends SlingHttpServletResponseWrapper {
-    private final AtomicReference<PrintWriter> writer = new AtomicReference<>();
-
-    /**
-     * Create a wrapper for the supplied wrappedRequest
-     *
-     * @param wrappedResponse The response
-     */
-    public ResponseWrapper(SlingHttpServletResponse wrappedResponse) {
-        super(wrappedResponse);
-    }
-
-    @Override
-    public PrintWriter getWriter() {
-        PrintWriter result = writer.get();
-        if (result == null) {
-            result = new PrintWriter(new OnDemandWriter(getResponse()));
-            if (!writer.compareAndSet(null, result)) {
-                result = writer.get();
-            }
-        }
-        return result;
-    }
-}
diff --git a/src/main/java/org/apache/sling/scripting/bundle/tracker/package-info.java b/src/main/java/org/apache/sling/scripting/bundle/tracker/package-info.java
deleted file mode 100644
index 66d51bb..0000000
--- a/src/main/java/org/apache/sling/scripting/bundle/tracker/package-info.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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.
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
-@Version("0.2.0")
-package org.apache.sling.scripting.bundle.tracker;
-
-import org.osgi.annotation.versioning.Version;
diff --git a/src/test/java/org/apache/sling/scripting/bundle/tracker/ResourceTypeTest.java b/src/test/java/org/apache/sling/scripting/bundle/tracker/ResourceTypeTest.java
deleted file mode 100644
index 8f102e9..0000000
--- a/src/test/java/org/apache/sling/scripting/bundle/tracker/ResourceTypeTest.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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 org.apache.sling.scripting.bundle.tracker;
-
-import org.apache.commons.lang3.StringUtils;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-public class ResourceTypeTest {
-
-    @Test
-    public void testSlashNoVersion() {
-        ResourceType t1 = ResourceType.parseResourceType("a/b/c");
-        assertEquals("a/b/c", t1.getType());
-        assertEquals("c", t1.getResourceLabel());
-        assertNull(t1.getVersion());
-    }
-
-    @Test
-    public void testSlashVersion() {
-        ResourceType t1 = ResourceType.parseResourceType("a/b/c/1.0.0");
-        assertEquals("a/b/c", t1.getType());
-        assertEquals("c", t1.getResourceLabel());
-        assertEquals("1.0.0", t1.getVersion());
-    }
-
-    @Test
-    public void testOneSegmentNoVersion() {
-        ResourceType t1 = ResourceType.parseResourceType("a");
-        assertEquals("a", t1.getType());
-        assertEquals("a", t1.getResourceLabel());
-        assertNull(t1.getVersion());
-    }
-
-    @Test
-    public void testOneSegmentVersion() {
-        ResourceType t1 = ResourceType.parseResourceType("a/1.2.3");
-        assertEquals("a", t1.getType());
-        assertEquals("a", t1.getResourceLabel());
-        assertEquals("1.2.3", t1.getVersion());
-    }
-
-    @Test
-    public void testDotNoVersion() {
-        ResourceType t1 = ResourceType.parseResourceType("a.b.c");
-        assertEquals("a.b.c", t1.getType());
-        assertEquals("c", t1.getResourceLabel());
-        assertNull(t1.getVersion());
-    }
-
-    @Test
-    public void testDotVersion() {
-        ResourceType t1 = ResourceType.parseResourceType("a.b.c/42.0.0");
-        assertEquals("a.b.c", t1.getType());
-        assertEquals("c", t1.getResourceLabel());
-        assertEquals("42.0.0", t1.getVersion());
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testEmptyString() {
-        ResourceType t1 = ResourceType.parseResourceType(StringUtils.EMPTY);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testNull() {
-        ResourceType t1 = ResourceType.parseResourceType(null);
-    }
-
-}
diff --git a/src/test/java/org/apache/sling/scripting/bundle/tracker/internal/BundledHooksTest.java b/src/test/java/org/apache/sling/scripting/bundle/tracker/internal/BundledHooksTest.java
deleted file mode 100644
index 1b974fb..0000000
--- a/src/test/java/org/apache/sling/scripting/bundle/tracker/internal/BundledHooksTest.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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 org.apache.sling.scripting.bundle.tracker.internal;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.junit.Assert;
-import org.junit.Test;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceEvent;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.hooks.service.ListenerHook;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public class BundledHooksTest {
-    @Test
-    public void testFindHookFiltersOther() {
-        BundledHooks hooks = new BundledHooks();
-
-        BundleContext context = mock(BundleContext.class);
-        Bundle bundle = mock(Bundle.class);
-        ServiceReference<?> ref = mock(ServiceReference.class);
-
-        when(context.getBundle()).thenReturn(bundle);
-        when(bundle.getSymbolicName()).thenReturn("org.apache.sling.foo.bar");
-        when(ref.getProperty(BundledHooks.class.getName())).thenReturn("true");
-        List<ServiceReference<?>> services = new ArrayList<>();
-
-        services.add(ref);
-        hooks.find(context, null, null, true, services);
-
-        Assert.assertTrue(services.isEmpty());
-    }
-
-    @Test
-    public void testFindHookDoesNotFilterResolver() {
-        BundledHooks hooks = new BundledHooks();
-
-        BundleContext context = mock(BundleContext.class);
-        Bundle bundle = mock(Bundle.class);
-        ServiceReference<?> ref = mock(ServiceReference.class);
-
-        when(context.getBundle()).thenReturn(bundle);
-        when(bundle.getSymbolicName()).thenReturn("org.apache.sling.servlets.resolver");
-        when(ref.getProperty(BundledHooks.class.getName())).thenReturn("true");
-        List<ServiceReference<?>> services = new ArrayList<>();
-
-        services.add(ref);
-        hooks.find(context, null, null, true, services);
-
-        Assert.assertEquals(1, services.size());
-    }
-
-    @Test
-    public void testEventHookFiltersOther() {
-        BundledHooks hooks = new BundledHooks();
-
-        ServiceEvent event = mock(ServiceEvent.class);
-
-        BundleContext context = mock(BundleContext.class);
-        Bundle bundle = mock(Bundle.class);
-        ServiceReference ref = mock(ServiceReference.class);
-
-        when(event.getServiceReference()).thenReturn(ref);
-
-        when(context.getBundle()).thenReturn(bundle);
-        when(bundle.getSymbolicName()).thenReturn("org.apache.sling.foo.bar");
-        when(ref.getProperty(BundledHooks.class.getName())).thenReturn("true");
-
-        ListenerHook.ListenerInfo info = mock(ListenerHook.ListenerInfo.class);
-        when(info.getBundleContext()).thenReturn(context);
-        Map<BundleContext, Collection<ListenerHook.ListenerInfo>> listeners = new HashMap<>();
-        listeners.put(context, new ArrayList<>(Arrays.asList(info)));
-
-        hooks.event(event, listeners);
-
-        Assert.assertTrue(listeners.isEmpty());
-    }
-
-    @Test
-    public void testEventHookDoesNotFilterResolver() {
-        BundledHooks hooks = new BundledHooks();
-
-        ServiceEvent event = mock(ServiceEvent.class);
-
-        BundleContext context = mock(BundleContext.class);
-        Bundle bundle = mock(Bundle.class);
-        ServiceReference ref = mock(ServiceReference.class);
-
-        when(event.getServiceReference()).thenReturn(ref);
-
-        when(context.getBundle()).thenReturn(bundle);
-        when(bundle.getSymbolicName()).thenReturn("org.apache.sling.servlets.resolver");
-        when(ref.getProperty(BundledHooks.class.getName())).thenReturn("true");
-
-        ListenerHook.ListenerInfo info = mock(ListenerHook.ListenerInfo.class);
-        when(info.getBundleContext()).thenReturn(context);
-        Map<BundleContext, Collection<ListenerHook.ListenerInfo>> listeners = new HashMap<>();
-        listeners.put(context, new ArrayList<>(Arrays.asList(info)));
-
-        hooks.event(event, listeners);
-
-        Assert.assertEquals(1, listeners.size());
-
-        Assert.assertEquals(1, listeners.get(context).size());
-    }
-}
diff --git a/src/test/java/org/apache/sling/scripting/bundle/tracker/internal/BundledScriptContextTest.java b/src/test/java/org/apache/sling/scripting/bundle/tracker/internal/BundledScriptContextTest.java
deleted file mode 100644
index 0a26503..0000000
--- a/src/test/java/org/apache/sling/scripting/bundle/tracker/internal/BundledScriptContextTest.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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 org.apache.sling.scripting.bundle.tracker.internal;
-
-import javax.script.Bindings;
-import javax.script.ScriptContext;
-import javax.script.SimpleBindings;
-
-import org.apache.sling.api.scripting.SlingScriptConstants;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-public class BundledScriptContextTest {
-
-    @Test
-    public void testSetAndGetBindings() {
-        BundledScriptContext bundledScriptContext = new BundledScriptContext();
-        Bindings engineScope = new SimpleBindings();
-        Bindings globalScope = new SimpleBindings();
-        Bindings slingScope = new SimpleBindings();
-
-        bundledScriptContext.setBindings(slingScope, SlingScriptConstants.SLING_SCOPE);
-        bundledScriptContext.setBindings(globalScope, ScriptContext.GLOBAL_SCOPE);
-        bundledScriptContext.setBindings(engineScope, ScriptContext.ENGINE_SCOPE);
-
-        assertEquals(engineScope, bundledScriptContext.getBindings(ScriptContext.ENGINE_SCOPE));
-        assertEquals(globalScope, bundledScriptContext.getBindings(ScriptContext.GLOBAL_SCOPE));
-        assertEquals(slingScope, bundledScriptContext.getBindings(SlingScriptConstants.SLING_SCOPE));
-
-        boolean invalidScopeThrowsException;
-        try {
-            bundledScriptContext.getBindings(Integer.MIN_VALUE);
-            invalidScopeThrowsException = false;
-        } catch (Exception e) {
-            invalidScopeThrowsException = true;
-        }
-        assertTrue(BundledScriptContext.class.getName() + " should throw exceptions for invalid scopes.", invalidScopeThrowsException);
-
-        boolean acceptsAnyScope;
-        try {
-            bundledScriptContext.setBindings(new SimpleBindings(), Integer.MIN_VALUE);
-            acceptsAnyScope = true;
-        } catch (Exception e) {
-            acceptsAnyScope = false;
-        }
-        assertFalse(BundledScriptContext.class.getName() + " should not accept bindings for arbitrary scopes.", acceptsAnyScope);
-
-        boolean acceptsNullBindings;
-        try {
-            bundledScriptContext.setBindings(null, ScriptContext.ENGINE_SCOPE);
-            acceptsNullBindings = true;
-        } catch (Exception e) {
-            acceptsNullBindings = false;
-        }
-        assertFalse(BundledScriptContext.class.getName() + " should not accept null bindings.", acceptsNullBindings);
-    }
-
-    @Test
-    public void testSetAndGetAttribute() {
-        BundledScriptContext bundledScriptContext = new BundledScriptContext();
-        boolean acceptsSettingNullAttributeNames;
-        try {
-            bundledScriptContext.setAttribute(null, 0, ScriptContext.ENGINE_SCOPE);
-            acceptsSettingNullAttributeNames = true;
-        } catch (Exception e) {
-            acceptsSettingNullAttributeNames = false;
-        }
-        assertFalse(BundledScriptContext.class.getName() + " should not accept null attribute names.", acceptsSettingNullAttributeNames);
-
-        boolean acceptsRetrievingNullAttributeNamesFromScope;
-        try {
-            bundledScriptContext.getAttribute(null, ScriptContext.ENGINE_SCOPE);
-            acceptsRetrievingNullAttributeNamesFromScope = true;
-        } catch (Exception e) {
-            acceptsRetrievingNullAttributeNamesFromScope = false;
-        }
-        assertFalse(BundledScriptContext.class.getName() + " should not accept null attribute names.", acceptsRetrievingNullAttributeNamesFromScope);
-
-        boolean acceptsRetrievingNullAttributeNames;
-        try {
-            bundledScriptContext.getAttribute(null);
-            acceptsRetrievingNullAttributeNames = true;
-        } catch (Exception e) {
-            acceptsRetrievingNullAttributeNames = false;
-        }
-        assertFalse(BundledScriptContext.class.getName() + " should not accept null attribute names.", acceptsRetrievingNullAttributeNames);
-
-        bundledScriptContext.setAttribute("nothing", 0, ScriptContext.ENGINE_SCOPE);
-        assertEquals(0, bundledScriptContext.getAttribute("nothing"));
-        assertEquals(0, bundledScriptContext.getAttribute("nothing", ScriptContext.ENGINE_SCOPE));
-        assertNull(bundledScriptContext.getAttribute("nothing", ScriptContext.GLOBAL_SCOPE));
-    }
-
-    @Test
-    public void testRemoveAttribute() {
-        BundledScriptContext bundledScriptContext = new BundledScriptContext();
-        boolean acceptsNullAttributeNames;
-        try {
-            bundledScriptContext.removeAttribute(null, ScriptContext.ENGINE_SCOPE);
-            acceptsNullAttributeNames = true;
-        } catch (Exception e) {
-            acceptsNullAttributeNames = false;
-        }
-        assertFalse(BundledScriptContext.class.getName() + " should not accept null attribute names.", acceptsNullAttributeNames);
-
-        bundledScriptContext.setAttribute("nothing", 0, ScriptContext.ENGINE_SCOPE);
-        assertEquals(0, bundledScriptContext.removeAttribute("nothing", ScriptContext.ENGINE_SCOPE));
-        Bindings engineScope = bundledScriptContext.getBindings(ScriptContext.ENGINE_SCOPE);
-        assertTrue( engineScope != null && engineScope.size() == 0);
-        assertNull(bundledScriptContext.removeAttribute("nothing", ScriptContext.ENGINE_SCOPE));
-        assertNull(bundledScriptContext.removeAttribute("nothing", ScriptContext.GLOBAL_SCOPE));
-    }
-
-    @Test
-    public void testGetAttributesScope() {
-        BundledScriptContext bundledScriptContext = new BundledScriptContext();
-        boolean acceptsNullAttributeNames;
-        try {
-            bundledScriptContext.getAttributesScope(null);
-            acceptsNullAttributeNames = true;
-        } catch (Exception e) {
-            acceptsNullAttributeNames = false;
-        }
-        assertFalse(BundledScriptContext.class.getName() + " should not accept null attribute names.", acceptsNullAttributeNames);
-
-        bundledScriptContext.setAttribute("nothing", 0, SlingScriptConstants.SLING_SCOPE);
-        assertEquals(SlingScriptConstants.SLING_SCOPE, bundledScriptContext.getAttributesScope("nothing"));
-        assertEquals(-1, bundledScriptContext.getAttributesScope("nothing here"));
-    }
-
-}
diff --git a/src/test/java/org/apache/sling/scripting/bundle/tracker/internal/BundledScriptTrackerTest.java b/src/test/java/org/apache/sling/scripting/bundle/tracker/internal/BundledScriptTrackerTest.java
deleted file mode 100644
index 022ff35..0000000
--- a/src/test/java/org/apache/sling/scripting/bundle/tracker/internal/BundledScriptTrackerTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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 org.apache.sling.scripting.bundle.tracker.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.servlet.Servlet;
-
-import org.junit.Test;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleEvent;
-import org.osgi.framework.ServiceRegistration;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
-public class BundledScriptTrackerTest {
-
-    @Test
-    public void removedBundle() {
-        BundledScriptTracker tracker = new BundledScriptTracker();
-        tracker.activate(mock(BundleContext.class));
-        List<ServiceRegistration<Servlet>> registrations = new ArrayList<>();
-        ServiceRegistration<Servlet> registration = mock(ServiceRegistration.class);
-        registrations.add(registration);
-        tracker.removedBundle(mock(Bundle.class), mock(BundleEvent.class), registrations);
-        verify(registration).unregister();
-    }
-}
diff --git a/src/test/java/org/apache/sling/scripting/bundle/tracker/internal/LogWriterTest.java b/src/test/java/org/apache/sling/scripting/bundle/tracker/internal/LogWriterTest.java
deleted file mode 100644
index bb5fe26..0000000
--- a/src/test/java/org/apache/sling/scripting/bundle/tracker/internal/LogWriterTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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 org.apache.sling.scripting.bundle.tracker.internal;
-
-import org.junit.Test;
-import org.slf4j.Logger;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-
-public class LogWriterTest {
-
-    @Test
-    public void testLogWriterCRLFFlush() {
-        Logger mockedLogger = mock(Logger.class);
-        LogWriter writer = new LogWriter(mockedLogger);
-        char[] buffer = "Test CRLF 1\nTest CRLF 2".toCharArray();
-        writer.write(buffer, 0, buffer.length);
-        verify(mockedLogger).error("Test CRLF 1");
-        writer.flush();
-        verify(mockedLogger).error("Test CRLF 2");
-        verifyNoMoreInteractions(mockedLogger);
-        writer.flush();
-        writer.close();
-    }
-
-    @Test
-    public void testLogWriterCharWriteAndFlush() {
-        Logger mockedLogger = mock(Logger.class);
-        LogWriter writer = new LogWriter(mockedLogger);
-        writer.write('a');
-        writer.write('\n');
-        verify(mockedLogger).error("a");
-        writer.write('a');
-        writer.write('b');
-        writer.write('c');
-        writer.close();
-        verify(mockedLogger).error("abc");
-    }
-
-
-
-}
diff --git a/src/test/java/org/apache/sling/scripting/bundle/tracker/internal/ProtectedBindingsTest.java b/src/test/java/org/apache/sling/scripting/bundle/tracker/internal/ProtectedBindingsTest.java
deleted file mode 100644
index 82d2a9a..0000000
--- a/src/test/java/org/apache/sling/scripting/bundle/tracker/internal/ProtectedBindingsTest.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements.  See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership.  The ASF licenses this file
- ~ to you 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 org.apache.sling.scripting.bundle.tracker.internal;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import javax.script.Bindings;
-import javax.script.SimpleBindings;
-
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
-public class ProtectedBindingsTest {
-
-    @Test
-    public void put() {
-        ProtectedBindings bindings = getBindingsUnderTest();
-        bindings.put("d", 4);
-        boolean allowsOverride;
-        try {
-            bindings.put("c", 0);
-            allowsOverride = true;
-        } catch (IllegalArgumentException e) {
-            allowsOverride = false;
-        }
-        assertFalse("Protected keys were overwritten.", allowsOverride);
-        assertEquals("Expected that unprotected keys can be used.", 4, bindings.get("d"));
-    }
-
-    @Test
-    public void putAll() {
-        ProtectedBindings bindings = getBindingsUnderTest();
-        boolean allowsOverride;
-        try {
-            bindings.putAll(new HashMap<String, Object>(){{
-                put("a", 0);
-                put("b", 0);
-                put("c", 0);
-            }});
-            allowsOverride = true;
-        } catch (IllegalArgumentException e) {
-            allowsOverride = false;
-        }
-        assertFalse("Protected keys were overwritten", allowsOverride);
-        bindings.putAll(new HashMap<String, Object>(){{
-            put("d", 4);
-            put("e", 5);
-            put("f", 6);
-        }});
-        assertTrue("Expected that the bindings contain non-conflicting additions.", bindings.size() == 6 && bindings.get("d").equals(4)
-                && bindings.get("e").equals(5) && bindings.get("f").equals(6));
-    }
-
-    @Test
-    public void remove() {
-        ProtectedBindings bindings = getBindingsUnderTest();
-        boolean allowsOverride;
-        try {
-            bindings.remove("a");
-            allowsOverride = true;
-        } catch (IllegalArgumentException e) {
-            allowsOverride = false;
-        }
-        assertFalse("Protected keys were overwritten.", allowsOverride);
-        assertEquals("Expected that protected key was not removed.", 1, bindings.get("a"));
-        bindings.put("d", 4);
-        assertEquals(4, bindings.size());
-        assertEquals(4, bindings.remove("d"));
-    }
-
-    @Test
-    public void clear() {
-        ProtectedBindings bindings = getBindingsUnderTest();
-        boolean hasThrownUOE = false;
-        try {
-            bindings.clear();
-        } catch (UnsupportedOperationException e) {
-            hasThrownUOE = true;
-        }
-        assertTrue("Expected an UnsupportedOperationException.", hasThrownUOE);
-        assertTrue("Expected map to not be modified.", bindings.size() == 3 && bindings.get("a").equals(1) && bindings.get("b").equals(2)
-                && bindings.get("c").equals(3));
-    }
-
-    @Test
-    public void containsValue() {
-        Bindings bindings = mock(Bindings.class);
-        ProtectedBindings protectedBindings = new ProtectedBindings(bindings, Collections.emptySet());
-        protectedBindings.containsValue(4);
-        verify(bindings).containsValue(4);
-    }
-
-    @Test
-    public void entrySet() {
-        ProtectedBindings bindings = getBindingsUnderTest();
-        Set<Map.Entry<String, Object>> entrySet = bindings.entrySet();
-        assertEquals(3, entrySet.size());
-        boolean unmodifiable;
-        try {
-            entrySet.clear();
-            unmodifiable = false;
-        } catch (UnsupportedOperationException e) {
-            unmodifiable = true;
-        }
-        assertTrue("Expected an unmodifiable entry set.", unmodifiable);
-    }
-
-    @Test
-    public void isEmpty() {
-        Bindings bindings = mock(Bindings.class);
-        ProtectedBindings protectedBindings = new ProtectedBindings(bindings, Collections.emptySet());
-        protectedBindings.isEmpty();
-        verify(bindings).isEmpty();
-    }
-
-    @Test
-    public void keySet() {
-        ProtectedBindings bindings = getBindingsUnderTest();
-        Set<String> keySet = bindings.keySet();
-        assertEquals(3, keySet.size());
-        boolean unmodifiable;
-        try {
-            keySet.clear();
-            unmodifiable = false;
-        } catch (UnsupportedOperationException e) {
-            unmodifiable = true;
-        }
-        assertTrue("Expected an unmodifiable key set.", unmodifiable);
-    }
-
-    @Test
-    public void size() {
-        Bindings bindings = mock(Bindings.class);
-        ProtectedBindings protectedBindings = new ProtectedBindings(bindings, Collections.emptySet());
-        protectedBindings.size();
-        verify(bindings).size();
-    }
-
-    @Test
-    public void values() {
-        ProtectedBindings bindings = getBindingsUnderTest();
-        Collection<Object> values = bindings.values();
-        assertEquals(3, values.size());
-        boolean unmodifiable;
-        try {
-            values.clear();
-            unmodifiable = false;
-        } catch (UnsupportedOperationException e) {
-            unmodifiable = true;
-        }
-        assertTrue("Expected an unmodifiable values collection.", unmodifiable);
-    }
-
-    @Test
-    public void containsKey() {
-        Bindings bindings = mock(Bindings.class);
-        ProtectedBindings protectedBindings = new ProtectedBindings(bindings, Collections.emptySet());
-        protectedBindings.containsKey("a");
-        verify(bindings).containsKey("a");
-    }
-
-    @Test
-    public void get() {
-        Bindings bindings = mock(Bindings.class);
-        ProtectedBindings protectedBindings = new ProtectedBindings(bindings, Collections.emptySet());
-        protectedBindings.get("a");
-        verify(bindings).get("a");
-    }
-
-    private ProtectedBindings getBindingsUnderTest() {
-        Bindings bindings = new SimpleBindings();
-        bindings.put("a", 1);
-        bindings.put("b", 2);
-        bindings.put("c", 3);
-        Set<String> protectedKeys = new HashSet<>(Arrays.asList("a", "b", "c"));
-        return new ProtectedBindings(bindings, protectedKeys);
-    }
-}
diff --git a/src/test/resources/findbugs-exclude.xml b/src/test/resources/findbugs-exclude.xml
deleted file mode 100644
index 24ab733..0000000
--- a/src/test/resources/findbugs-exclude.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-  ~ Licensed to the Apache Software Foundation (ASF) under one
-  ~ or more contributor license agreements.  See the NOTICE file
-  ~ distributed with this work for additional information
-  ~ regarding copyright ownership.  The ASF licenses this file
-  ~ to you 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.
-  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
-<FindBugsFilter>
-    <Match>
-        <Bug pattern="SE_BAD_FIELD" />
-    </Match>
-</FindBugsFilter>