You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by tj...@apache.org on 2021/01/12 18:29:11 UTC

[felix-dev] branch scrR8 updated (f343822 -> 2de0937)

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

tjwatson pushed a change to branch scrR8
in repository https://gitbox.apache.org/repos/asf/felix-dev.git.


    from f343822  Merge branch 'master' into scrR8
     add 5758834  FELIX-6308 : Revert changes
     add 4c826f0  Format according to the rest of SCR codebase
     add 462bfe2  FELIX-6361 - Avoid IllegalArgumentException for calls to getLogger
     add d2f25bf  FELIX-6362 Utils ResourceBuilder does not allow java.* imports
     add cf18cb6  Merge pull request #62 from bosschaert/FELIX-6362
     add 964413a  [maven-release-plugin] prepare release org.apache.felix.utils-1.11.6
     add 7be69de  [maven-release-plugin] prepare for next development iteration
     add e5e5bf1  FELIX-6364 Security vulnerability CVE-2020-27216 ,update jetty (#63)
     add 4169566  [maven-release-plugin] prepare release org.apache.felix.http.jetty-4.1.4
     add a1dfca9  [maven-release-plugin] prepare for next development iteration
     add 7d91f8c  FELIX-6363 : Simplify updating of OSGi configurations through REST API
     add 7fb5984  FELIX-6366 1.0.3 < jQuery <3.4.0 is vulnerable to CVE-2020-11023 (#64)
     add c09718b  Update webconsole changelog
     add d3fd46a  Update changelog
     add 6499084  FELIX-6222: Support for os.name Capability is missing for Windows Server 2019
     add bf1af68  Update changelog
     add 67cd796  Update changelog and dependencies
     add b006c4f  Update changelogs, dependencies, and prepare for release
     add 25f6f7d  [maven-release-plugin] prepare release org.apache.felix.resolver-2.0.2
     add 4099d2c  [maven-release-plugin] prepare for next development iteration
     add 758ee60  Update to developer release version
     add 7d666fb  Update dependencies for release
     add d3e64c2  [maven-release-plugin] prepare release org.apache.felix.framework-6.0.4
     add 7f88824  [maven-release-plugin] prepare for next development iteration
     add 797c0fc  Update dependencies after release
     add 3033457  Update dependencies for release
     add c4eb148  [maven-release-plugin] prepare release org.apache.felix.main-6.0.4
     add 93d68d1  [maven-release-plugin] prepare for next development iteration
     add 1e86095  Update dependencies after release
     add f12f258  Update dependencies for release
     add 8362398  [maven-release-plugin] prepare release org.apache.felix.main.distribution-6.0.4
     add 4fff6e4  [maven-release-plugin] prepare for next development iteration
     add 00be08c  FELIX-6370 : Provide a User interface for checks within plugins
     add 814d8ca  Update .gitignore
     add 5b50cf0  FELIX-6370 : Provide a User interface for checks within plugins
     add 51a8628  [maven-release-plugin] prepare release org.apache.felix.webconsole-4.6.0
     add f9e5a42  [maven-release-plugin] prepare for next development iteration
     add 69cfc5c  Fix javadoc errors and warnings with Java 8
     add 54a9590  [maven-release-plugin] prepare release org.apache.felix.eventadmin-1.6.0
     add 31fa52b  [maven-release-plugin] prepare for next development iteration
     new 9ab0150  Merge branch 'master' into scrR8
     new c107424  Force Java 8 compiler
     new 5d167e2  Add support for Optional<ServiceType> to be injected
     add 8bccf4d  FELIX-6369: Implement R8 core spec
     add a1ec804  Merge pull request #65 from apache/frameworkR8
     add af8cf08  FELIX-6294: add a slash to urls for directories
     add 425655e  Merge pull request #66 from apache/issues/FELIX-6294
     add 2e18682  FELIX-6163: do not use System.currentTimeMillis() to check timeouts
     add 945008d  Merge pull request #67 from apache/issues/FELIX-6163
     add 0cd499d  Update dependencies to released versions
     add 55b5fe2  Update changelogs
     add 8f5117c  [maven-release-plugin] prepare release org.apache.felix.framework-7.0.0
     add 89bcce8  [maven-release-plugin] prepare for next development iteration
     add 5edad1f  [maven-release-plugin] prepare release org.apache.felix.framework.security-2.8.0
     add 2564eab  [maven-release-plugin] prepare for next development iteration
     add 3eab73e  [maven-release-plugin] prepare release org.apache.felix.main-7.0.0
     add e602f1a  [maven-release-plugin] prepare for next development iteration
     add 4337c59  Update dependency for release
     add 4a4c7a1  [maven-release-plugin] prepare release org.apache.felix.main.distribution-7.0.0
     add 3bd444d  [maven-release-plugin] prepare for next development iteration
     add bf58c61  [maven-release-plugin] prepare release org.apache.felix.configadmin-1.9.20
     add 7eac0ab  [maven-release-plugin] prepare for next development iteration
     add 1fd72ff  FELIX-6373 : Wrong provide capability header
     add 6334163  [maven-release-plugin] prepare release org.apache.felix.eventadmin-1.6.2
     add 72ab8ae  [maven-release-plugin] prepare for next development iteration
     new 2de0937  Merge branch 'master' into scrR8

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


Summary of changes:
 .gitignore                                         |    1 +
 configadmin/changelog.txt                          |    1 -
 configadmin/pom.xml                                |    2 +-
 .../felix/cm/file/FilePersistenceManager.java      |   12 +-
 eventadmin/impl/changelog.txt                      |    6 +
 eventadmin/impl/pom.xml                            |    7 +-
 .../apache/felix/eventadmin/impl/Activator.java    |    2 +-
 .../felix/eventadmin/impl/Configuration.java       |   20 +-
 .../eventadmin/impl/adapter/AbstractAdapter.java   |    2 +-
 .../impl/adapter/BundleEventAdapter.java           |    6 +-
 .../impl/adapter/FrameworkEventAdapter.java        |    6 +-
 .../eventadmin/impl/adapter/LogEventAdapter.java   |   20 +-
 .../impl/adapter/ServiceEventAdapter.java          |    6 +-
 .../eventadmin/impl/handler/EventAdminImpl.java    |   27 +-
 .../eventadmin/impl/handler/EventHandlerProxy.java |   11 +-
 .../impl/handler/EventHandlerTracker.java          |    4 +-
 .../impl/security/EventAdminSecurityDecorator.java |   20 +-
 .../eventadmin/impl/security/PermissionsUtil.java  |    8 +-
 .../impl/security/SecureEventAdminFactory.java     |   22 +-
 .../eventadmin/impl/tasks/AsyncDeliverTasks.java   |    1 +
 .../eventadmin/impl/tasks/DefaultThreadPool.java   |    4 +
 .../felix/eventadmin/impl/tasks/DenylistLatch.java |    2 +-
 .../felix/eventadmin/impl/tasks/HandlerTask.java   |    1 +
 .../eventadmin/impl/tasks/SyncDeliverTasks.java    |    7 +-
 .../felix/eventadmin/impl/tasks/SyncThread.java    |    1 +
 .../felix/eventadmin/impl/util/LogWrapper.java     |   18 +-
 framework.security/doc/changelog.txt               |    6 +
 framework.security/pom.xml                         |    7 +-
 .../org/apache/felix/framework/FakeBundle.java     |   10 -
 .../felix/framework/security/util/Permissions.java |   19 +-
 framework/doc/changelog.txt                        |   24 +
 framework/pom.xml                                  |   47 +-
 .../src/main/appended-resources/META-INF/NOTICE    |    2 +-
 .../org/apache/felix/framework/BundleImpl.java     |   44 +-
 .../felix/framework/BundleProtectionDomain.java    |   13 +-
 .../apache/felix/framework/BundleRevisionImpl.java |   40 +
 .../apache/felix/framework/BundleWiringImpl.java   |   88 +-
 .../org/apache/felix/framework/DTOFactory.java     |    5 +
 .../apache/felix/framework/ExtensionManager.java   |  117 +-
 .../java/org/apache/felix/framework/Felix.java     |   81 +-
 .../apache/felix/framework/FrameworkFactory.java   |   10 +-
 .../felix/framework/FrameworkWiringImpl.java       |    3 -
 .../felix/framework/ServiceRegistrationImpl.java   |   23 +-
 .../apache/felix/framework/StatefulResolver.java   |   18 +-
 .../org/apache/felix/framework/URLHandlers.java    |   60 +-
 .../framework/URLHandlersBundleURLConnection.java  |   14 +-
 .../framework/URLHandlersStreamHandlerProxy.java   |    3 +-
 .../org/apache/felix/framework/WovenClassImpl.java |   54 +-
 .../felix/framework/cache/BundleArchive.java       |   43 +-
 .../apache/felix/framework/cache/BundleCache.java  |   30 +-
 .../framework/cache/ConnectContentContent.java     |  224 +++
 ...DirectoryRevision.java => ConnectRevision.java} |   63 +-
 .../org/apache/felix/framework/cache/Content.java  |   14 +
 .../framework/cache/ContentDirectoryContent.java   |   64 +-
 .../felix/framework/cache/DirectoryContent.java    |   54 +-
 .../felix/framework/cache/DirectoryRevision.java   |    2 +-
 .../apache/felix/framework/cache/JarContent.java   |   31 +-
 .../apache/felix/framework/cache/JarRevision.java  |    2 +-
 .../framework/capabilityset/CapabilitySet.java     |    2 +-
 .../framework/capabilityset/SimpleFilter.java      |    1 -
 .../framework/ext/ClassPathExtenderFactory.java    |   10 +-
 .../felix/framework/util/MultiReleaseContent.java  |   49 +-
 .../apache/felix/framework/util/SecureAction.java  |  234 ++-
 .../apache/felix/framework/util/ThreadGate.java    |    6 +-
 .../java/org/apache/felix/framework/util/Util.java |  148 +-
 .../util/manifestparser/ManifestParser.java        |   70 +-
 .../util/manifestparser/NativeLibraryClause.java   |    5 +
 .../framework/wiring/BundleCapabilityImpl.java     |   75 +-
 .../framework/wiring/BundleRequirementImpl.java    |    4 +-
 framework/src/main/java/org/osgi/dto/DTO.java      |    2 +-
 .../src/main/java/org/osgi/dto/package-info.java   |    2 +-
 .../java/org/osgi/framework/BundlePermission.java  |    6 +-
 .../org/osgi/framework/CapabilityPermission.java   |    6 +-
 .../main/java/org/osgi/framework/Constants.java    |   12 +-
 .../main/java/org/osgi/framework/FilterImpl.java   | 1385 ++++++++++++++
 .../java/org/osgi/framework/FrameworkEvent.java    |   13 +-
 .../java/org/osgi/framework/FrameworkUtil.java     | 2017 +++++---------------
 .../java/org/osgi/framework/PackagePermission.java |    6 +-
 .../osgi/framework/PrototypeServiceFactory.java    |    2 +-
 .../java/org/osgi/framework/ServiceObjects.java    |    2 +-
 .../java/org/osgi/framework/ServicePermission.java |    6 +-
 .../java/org/osgi/framework/ServiceReference.java  |   59 +-
 .../org/osgi/framework/connect/ConnectContent.java |  218 +++
 .../framework/connect/ConnectFrameworkFactory.java |   79 +
 .../org/osgi/framework/connect/ConnectModule.java  |   47 +
 .../framework/connect/FrameworkUtilHelper.java     |   48 +
 .../osgi/framework/connect/ModuleConnector.java    |  105 +
 .../{hooks/resolver => connect}/package-info.java  |   13 +-
 .../java/org/osgi/framework/dto/BundleDTO.java     |    2 +-
 .../java/org/osgi/framework/dto/FrameworkDTO.java  |    2 +-
 .../osgi/framework/dto/ServiceReferenceDTO.java    |    9 +-
 .../java/org/osgi/framework/dto/package-info.java  |    2 +-
 .../osgi/framework/hooks/bundle/package-info.java  |    2 +-
 .../framework/hooks/resolver/package-info.java     |    2 +-
 .../osgi/framework/hooks/service/package-info.java |    2 +-
 .../framework/hooks/weaving/WeavingException.java  |    7 +-
 .../osgi/framework/hooks/weaving/WeavingHook.java  |   21 +-
 .../hooks/weaving/WovenClassListener.java          |    2 +-
 .../osgi/framework/hooks/weaving/package-info.java |    2 +-
 .../java/org/osgi/framework/launch/Framework.java  |   35 +-
 .../osgi/framework/launch/FrameworkFactory.java    |    5 +-
 .../org/osgi/framework/launch/package-info.java    |    4 +-
 .../osgi/framework/namespace/HostNamespace.java    |   20 +-
 .../framework/namespace/IdentityNamespace.java     |   14 +-
 .../osgi/framework/namespace/NativeNamespace.java  |    8 +-
 .../org/osgi/framework/namespace/package-info.java |    8 +-
 .../main/java/org/osgi/framework/package-info.java |   10 +-
 .../startlevel/dto/BundleStartLevelDTO.java        |    2 +-
 .../startlevel/dto/FrameworkStartLevelDTO.java     |    2 +-
 .../framework/startlevel/dto/package-info.java     |    2 +-
 .../osgi/framework/startlevel/package-info.java    |    2 +-
 .../framework/wiring/dto/BundleRevisionDTO.java    |    2 +-
 .../osgi/framework/wiring/dto/BundleWireDTO.java   |    2 +-
 .../osgi/framework/wiring/dto/BundleWiringDTO.java |    2 +-
 .../osgi/framework/wiring/dto/package-info.java    |    2 +-
 .../org/osgi/framework/wiring/package-info.java    |    2 +-
 .../java/org/osgi/resource/dto/CapabilityDTO.java  |    2 +-
 .../org/osgi/resource/dto/CapabilityRefDTO.java    |    2 +-
 .../java/org/osgi/resource/dto/RequirementDTO.java |    2 +-
 .../org/osgi/resource/dto/RequirementRefDTO.java   |    2 +-
 .../java/org/osgi/resource/dto/ResourceDTO.java    |    2 +-
 .../main/java/org/osgi/resource/dto/WireDTO.java   |    2 +-
 .../main/java/org/osgi/resource/dto/WiringDTO.java |    2 +-
 .../java/org/osgi/resource/dto/package-info.java   |    2 +-
 .../main/java/org/osgi/resource/package-info.java  |    2 +-
 .../java/org/osgi/service/condition/Condition.java |    0
 .../dto => service/condition}/package-info.java    |   15 +-
 .../osgi/service/packageadmin/package-info.java    |    2 +-
 .../org/osgi/service/startlevel/package-info.java  |    2 +-
 .../java/org/osgi/service/url/package-info.java    |    2 +-
 .../java/org/osgi/util/tracker/ServiceTracker.java |    5 +-
 .../java/org/osgi/util/tracker/package-info.java   |    2 +-
 .../native-image.properties                        |    5 +
 .../org.apache.felix.framework/reflect-config.json |   27 +
 .../resource-config.json                           |    9 +
 ....osgi.framework.connect.ConnectFrameworkFactory |    1 +
 framework/src/main/resources/default.properties    |   22 +-
 .../org/apache/felix/framework/util/accessor.bytes |  Bin 0 -> 816 bytes
 .../org/apache/felix/framework/util/accessor.src}  |   19 +-
 .../apache/felix/framework/CollisionHookTest.java  |    4 +-
 .../org/apache/felix/framework/ConnectTest.java    |  369 ++++
 .../org/apache/felix/framework/LaunchTest.java     |  156 ++
 .../felix/framework/MultiReleaseVersionTest.java   |    2 +-
 .../felix/framework/ResourceLoadingTest.java       |   76 +-
 .../felix/framework/cache/BundleCacheTest.java     |   10 +-
 .../util/manifestparser/ManifestParserTest.java    |   30 +-
 http/jetty/pom.xml                                 |    4 +-
 http/sslfilter/pom.xml                             |    2 +-
 main.distribution/NOTICE                           |    2 +-
 main.distribution/doc/changelog.txt                |   16 +
 main.distribution/doc/changelog_framework.txt      |   24 +
 main.distribution/doc/changelog_gogo.command.txt   |   46 +-
 main.distribution/doc/changelog_gogo.runtime.txt   |   89 +-
 main.distribution/doc/changelog_main.txt           |   16 +
 main.distribution/doc/changelog_resolver.txt       |    7 +
 main.distribution/pom.xml                          |   17 +-
 main/doc/changelog.txt                             |   16 +
 main/pom.xml                                       |   17 +-
 main/src/main/appended-resources/META-INF/NOTICE   |    2 +-
 resolver/doc/changelog.txt                         |    7 +
 resolver/pom.xml                                   |    1 +
 .../src/main/appended-resources/META-INF/NOTICE    |    2 +-
 scr/pom.xml                                        |    3 +
 .../apache/felix/scr/impl/inject/ValueUtils.java   |   14 +-
 .../felix/scr/impl/inject/field/FieldHandler.java  |   45 +-
 .../felix/scr/impl/inject/internal/ClassUtils.java |    3 +
 .../inject/internal/ComponentConstructorImpl.java  |   10 +-
 .../apache/felix/scr/impl/logger/BundleLogger.java |    6 +-
 .../felix/scr/impl/logger/ComponentLogger.java     |    5 +-
 .../felix/scr/impl/logger/ExtLogManager.java       |   77 +-
 .../felix/scr/impl/logger/InternalLogger.java      |  152 +-
 .../apache/felix/scr/impl/logger/LogManager.java   |  422 ++--
 .../felix/scr/impl/logger/ScrLogManager.java       |  570 +++---
 .../apache/felix/scr/impl/logger/ScrLogger.java    |   19 +-
 .../scr/integration/ComponentOptionalTest.java     |  170 ++
 .../components/ConstructorSingleReference.java     |   12 +
 .../components/InjectOptionalComponent.java        |  162 ++
 .../resources/integration_test_inject_optional.xml |  121 ++
 utils/pom.xml                                      |    5 +-
 .../felix/utils/resource/ResourceBuilder.java      |    7 +-
 .../felix/utils/resource/ResourceBuilderTest.java  |   33 +
 webconsole/changelog.txt                           |    4 +
 webconsole/pom.xml                                 |   27 +-
 .../res/lib/{jquery-3.4.1.js => jquery-3.5.1.js}   | 1238 +++++++-----
 ...ry-migrate-3.1.0.js => jquery-migrate-3.3.0.js} |  292 ++-
 .../java/org/apache/felix/webconsole/User.java     |   53 +
 .../webconsole/WebConsoleSecurityProvider.java     |    2 +-
 .../felix/webconsole/bundleinfo/package-info.java  |   21 +-
 .../apache/felix/webconsole/i18n/package-info.java |   21 +-
 .../internal/configuration/ConfigAdminSupport.java |   24 +-
 .../internal/configuration/ConfigManager.java      |    3 +-
 .../webconsole/internal/servlet/OsgiManager.java   |  121 +-
 .../internal/servlet/OsgiManagerHttpContext.java   |   80 +-
 .../org/apache/felix/webconsole/package-info.java  |   21 +-
 .../src/main/resources/res/lib/jquery-3.4.1.js     |    2 -
 .../src/main/resources/res/lib/jquery-3.5.1.js     |    2 +
 .../main/resources/res/lib/jquery-migrate-3.1.0.js |    2 -
 .../main/resources/res/lib/jquery-migrate-3.3.0.js |    2 +
 .../src/main/resources/templates/main_header.html  |    4 +-
 .../servlet/OsgiManagerHttpContextTest.java        |    4 +-
 .../internal/servlet/OsgiManagerTest.java          |    5 +-
 201 files changed, 7343 insertions(+), 3704 deletions(-)
 create mode 100644 framework/src/main/java/org/apache/felix/framework/cache/ConnectContentContent.java
 copy framework/src/main/java/org/apache/felix/framework/cache/{DirectoryRevision.java => ConnectRevision.java} (61%)
 create mode 100755 framework/src/main/java/org/osgi/framework/FilterImpl.java
 create mode 100644 framework/src/main/java/org/osgi/framework/connect/ConnectContent.java
 create mode 100644 framework/src/main/java/org/osgi/framework/connect/ConnectFrameworkFactory.java
 create mode 100644 framework/src/main/java/org/osgi/framework/connect/ConnectModule.java
 create mode 100644 framework/src/main/java/org/osgi/framework/connect/FrameworkUtilHelper.java
 create mode 100644 framework/src/main/java/org/osgi/framework/connect/ModuleConnector.java
 copy framework/src/main/java/org/osgi/framework/{hooks/resolver => connect}/package-info.java (75%)
 copy {scr/src/test => framework/src/main}/java/org/osgi/service/condition/Condition.java (100%)
 mode change 100644 => 100755
 copy framework/src/main/java/org/osgi/{resource/dto => service/condition}/package-info.java (75%)
 mode change 100644 => 100755
 create mode 100644 framework/src/main/resources/META-INF/native-image/org.apache.felix/org.apache.felix.framework/native-image.properties
 create mode 100644 framework/src/main/resources/META-INF/native-image/org.apache.felix/org.apache.felix.framework/reflect-config.json
 create mode 100644 framework/src/main/resources/META-INF/native-image/org.apache.felix/org.apache.felix.framework/resource-config.json
 create mode 100644 framework/src/main/resources/META-INF/services/org.osgi.framework.connect.ConnectFrameworkFactory
 create mode 100644 framework/src/main/resources/org/apache/felix/framework/util/accessor.bytes
 copy framework/src/main/{java/org/apache/felix/framework/FrameworkFactory.java => resources/org/apache/felix/framework/util/accessor.src} (72%)
 create mode 100644 framework/src/test/java/org/apache/felix/framework/ConnectTest.java
 create mode 100644 framework/src/test/java/org/apache/felix/framework/LaunchTest.java
 create mode 100644 scr/src/test/java/org/apache/felix/scr/integration/ComponentOptionalTest.java
 create mode 100644 scr/src/test/java/org/apache/felix/scr/integration/components/InjectOptionalComponent.java
 create mode 100644 scr/src/test/resources/integration_test_inject_optional.xml
 create mode 100644 utils/src/test/java/org/apache/felix/utils/resource/ResourceBuilderTest.java
 rename webconsole/src/main/debug-resources/res/lib/{jquery-3.4.1.js => jquery-3.5.1.js} (91%)
 mode change 100755 => 100644
 rename webconsole/src/main/debug-resources/res/lib/{jquery-migrate-3.1.0.js => jquery-migrate-3.3.0.js} (70%)
 mode change 100755 => 100644
 create mode 100644 webconsole/src/main/java/org/apache/felix/webconsole/User.java
 copy scr/src/main/java/org/apache/felix/scr/impl/logger/ScrLogger.java => webconsole/src/main/java/org/apache/felix/webconsole/bundleinfo/package-info.java (73%)
 copy scr/src/main/java/org/apache/felix/scr/impl/logger/ScrLogger.java => webconsole/src/main/java/org/apache/felix/webconsole/i18n/package-info.java (73%)
 copy scr/src/main/java/org/apache/felix/scr/impl/logger/ScrLogger.java => webconsole/src/main/java/org/apache/felix/webconsole/package-info.java (73%)
 delete mode 100755 webconsole/src/main/resources/res/lib/jquery-3.4.1.js
 create mode 100644 webconsole/src/main/resources/res/lib/jquery-3.5.1.js
 delete mode 100755 webconsole/src/main/resources/res/lib/jquery-migrate-3.1.0.js
 create mode 100644 webconsole/src/main/resources/res/lib/jquery-migrate-3.3.0.js


[felix-dev] 04/04: Merge branch 'master' into scrR8

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

tjwatson pushed a commit to branch scrR8
in repository https://gitbox.apache.org/repos/asf/felix-dev.git

commit 2de0937ac71de5595ea39cb6db552bbf27284364
Merge: 5d167e2 72ab8ae
Author: Thomas Watson <tj...@us.ibm.com>
AuthorDate: Tue Jan 12 12:25:11 2021 -0600

    Merge branch 'master' into scrR8

 configadmin/pom.xml                                |    2 +-
 eventadmin/impl/changelog.txt                      |    6 +
 eventadmin/impl/pom.xml                            |    4 +-
 framework.security/doc/changelog.txt               |    6 +
 framework.security/pom.xml                         |    7 +-
 .../org/apache/felix/framework/FakeBundle.java     |   10 -
 .../felix/framework/security/util/Permissions.java |   19 +-
 framework/doc/changelog.txt                        |   13 +
 framework/pom.xml                                  |   46 +-
 .../org/apache/felix/framework/BundleImpl.java     |   44 +-
 .../felix/framework/BundleProtectionDomain.java    |   13 +-
 .../apache/felix/framework/BundleRevisionImpl.java |   40 +
 .../apache/felix/framework/BundleWiringImpl.java   |   88 +-
 .../org/apache/felix/framework/DTOFactory.java     |    5 +
 .../apache/felix/framework/ExtensionManager.java   |  117 +-
 .../java/org/apache/felix/framework/Felix.java     |   81 +-
 .../apache/felix/framework/FrameworkFactory.java   |   10 +-
 .../felix/framework/FrameworkWiringImpl.java       |    3 -
 .../felix/framework/ServiceRegistrationImpl.java   |   23 +-
 .../apache/felix/framework/StatefulResolver.java   |   18 +-
 .../org/apache/felix/framework/URLHandlers.java    |   60 +-
 .../framework/URLHandlersBundleURLConnection.java  |   14 +-
 .../framework/URLHandlersStreamHandlerProxy.java   |    3 +-
 .../org/apache/felix/framework/WovenClassImpl.java |   54 +-
 .../felix/framework/cache/BundleArchive.java       |   43 +-
 .../apache/felix/framework/cache/BundleCache.java  |   30 +-
 .../framework/cache/ConnectContentContent.java     |  224 +++
 ...DirectoryRevision.java => ConnectRevision.java} |   63 +-
 .../org/apache/felix/framework/cache/Content.java  |   14 +
 .../framework/cache/ContentDirectoryContent.java   |   64 +-
 .../felix/framework/cache/DirectoryContent.java    |   54 +-
 .../felix/framework/cache/DirectoryRevision.java   |    2 +-
 .../apache/felix/framework/cache/JarContent.java   |   31 +-
 .../apache/felix/framework/cache/JarRevision.java  |    2 +-
 .../framework/capabilityset/CapabilitySet.java     |    2 +-
 .../framework/capabilityset/SimpleFilter.java      |    1 -
 .../framework/ext/ClassPathExtenderFactory.java    |   10 +-
 .../felix/framework/util/MultiReleaseContent.java  |   49 +-
 .../apache/felix/framework/util/SecureAction.java  |  234 ++-
 .../apache/felix/framework/util/ThreadGate.java    |    6 +-
 .../java/org/apache/felix/framework/util/Util.java |  148 +-
 .../util/manifestparser/ManifestParser.java        |   70 +-
 .../framework/wiring/BundleCapabilityImpl.java     |   75 +-
 .../framework/wiring/BundleRequirementImpl.java    |    4 +-
 framework/src/main/java/org/osgi/dto/DTO.java      |    2 +-
 .../src/main/java/org/osgi/dto/package-info.java   |    2 +-
 .../java/org/osgi/framework/BundlePermission.java  |    6 +-
 .../org/osgi/framework/CapabilityPermission.java   |    6 +-
 .../main/java/org/osgi/framework/Constants.java    |   12 +-
 .../main/java/org/osgi/framework/FilterImpl.java   | 1385 ++++++++++++++
 .../java/org/osgi/framework/FrameworkEvent.java    |   13 +-
 .../java/org/osgi/framework/FrameworkUtil.java     | 2017 +++++---------------
 .../java/org/osgi/framework/PackagePermission.java |    6 +-
 .../osgi/framework/PrototypeServiceFactory.java    |    2 +-
 .../java/org/osgi/framework/ServiceObjects.java    |    2 +-
 .../java/org/osgi/framework/ServicePermission.java |    6 +-
 .../java/org/osgi/framework/ServiceReference.java  |   59 +-
 .../org/osgi/framework/connect/ConnectContent.java |  218 +++
 .../framework/connect/ConnectFrameworkFactory.java |   79 +
 .../org/osgi/framework/connect/ConnectModule.java  |   47 +
 .../framework/connect/FrameworkUtilHelper.java     |   48 +
 .../osgi/framework/connect/ModuleConnector.java    |  105 +
 .../url => framework/connect}/package-info.java    |   13 +-
 .../java/org/osgi/framework/dto/BundleDTO.java     |    2 +-
 .../java/org/osgi/framework/dto/FrameworkDTO.java  |    2 +-
 .../osgi/framework/dto/ServiceReferenceDTO.java    |    9 +-
 .../java/org/osgi/framework/dto/package-info.java  |    2 +-
 .../osgi/framework/hooks/bundle/package-info.java  |    2 +-
 .../framework/hooks/resolver/package-info.java     |    2 +-
 .../osgi/framework/hooks/service/package-info.java |    2 +-
 .../framework/hooks/weaving/WeavingException.java  |    7 +-
 .../osgi/framework/hooks/weaving/WeavingHook.java  |   21 +-
 .../hooks/weaving/WovenClassListener.java          |    2 +-
 .../osgi/framework/hooks/weaving/package-info.java |    2 +-
 .../java/org/osgi/framework/launch/Framework.java  |   35 +-
 .../osgi/framework/launch/FrameworkFactory.java    |    5 +-
 .../org/osgi/framework/launch/package-info.java    |    4 +-
 .../osgi/framework/namespace/HostNamespace.java    |   20 +-
 .../framework/namespace/IdentityNamespace.java     |   14 +-
 .../osgi/framework/namespace/NativeNamespace.java  |    8 +-
 .../org/osgi/framework/namespace/package-info.java |    8 +-
 .../main/java/org/osgi/framework/package-info.java |   10 +-
 .../startlevel/dto/BundleStartLevelDTO.java        |    2 +-
 .../startlevel/dto/FrameworkStartLevelDTO.java     |    2 +-
 .../framework/startlevel/dto/package-info.java     |    2 +-
 .../osgi/framework/startlevel/package-info.java    |    2 +-
 .../framework/wiring/dto/BundleRevisionDTO.java    |    2 +-
 .../osgi/framework/wiring/dto/BundleWireDTO.java   |    2 +-
 .../osgi/framework/wiring/dto/BundleWiringDTO.java |    2 +-
 .../osgi/framework/wiring/dto/package-info.java    |    2 +-
 .../org/osgi/framework/wiring/package-info.java    |    2 +-
 .../java/org/osgi/resource/dto/CapabilityDTO.java  |    2 +-
 .../org/osgi/resource/dto/CapabilityRefDTO.java    |    2 +-
 .../java/org/osgi/resource/dto/RequirementDTO.java |    2 +-
 .../org/osgi/resource/dto/RequirementRefDTO.java   |    2 +-
 .../java/org/osgi/resource/dto/ResourceDTO.java    |    2 +-
 .../main/java/org/osgi/resource/dto/WireDTO.java   |    2 +-
 .../main/java/org/osgi/resource/dto/WiringDTO.java |    2 +-
 .../java/org/osgi/resource/dto/package-info.java   |    2 +-
 .../main/java/org/osgi/resource/package-info.java  |    2 +-
 .../java/org/osgi/service/condition/Condition.java |   77 +
 .../dto => service/condition}/package-info.java    |   15 +-
 .../osgi/service/packageadmin/package-info.java    |    2 +-
 .../org/osgi/service/startlevel/package-info.java  |    2 +-
 .../java/org/osgi/service/url/package-info.java    |    2 +-
 .../java/org/osgi/util/tracker/ServiceTracker.java |    5 +-
 .../java/org/osgi/util/tracker/package-info.java   |    2 +-
 .../native-image.properties                        |    5 +
 .../org.apache.felix.framework/reflect-config.json |   27 +
 .../resource-config.json                           |    9 +
 ....osgi.framework.connect.ConnectFrameworkFactory |    1 +
 framework/src/main/resources/default.properties    |   21 +-
 .../org/apache/felix/framework/util/accessor.bytes |  Bin 0 -> 816 bytes
 .../org/apache/felix/framework/util/accessor.src}  |   19 +-
 .../apache/felix/framework/CollisionHookTest.java  |    4 +-
 .../org/apache/felix/framework/ConnectTest.java    |  369 ++++
 .../org/apache/felix/framework/LaunchTest.java     |  156 ++
 .../felix/framework/MultiReleaseVersionTest.java   |    2 +-
 .../felix/framework/ResourceLoadingTest.java       |   76 +-
 .../felix/framework/cache/BundleCacheTest.java     |   10 +-
 .../util/manifestparser/ManifestParserTest.java    |   30 +-
 main.distribution/doc/changelog.txt                |    6 +
 main.distribution/doc/changelog_framework.txt      |   13 +
 main.distribution/doc/changelog_main.txt           |    6 +
 main.distribution/pom.xml                          |    4 +-
 main/doc/changelog.txt                             |    6 +
 main/pom.xml                                       |    4 +-
 127 files changed, 4628 insertions(+), 2278 deletions(-)


[felix-dev] 02/04: Force Java 8 compiler

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

tjwatson pushed a commit to branch scrR8
in repository https://gitbox.apache.org/repos/asf/felix-dev.git

commit c10742419e8b4b71713794aa522bb79aa91f0a13
Author: Thomas Watson <tj...@us.ibm.com>
AuthorDate: Tue Jan 12 12:22:15 2021 -0600

    Force Java 8 compiler
---
 scr/pom.xml | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/scr/pom.xml b/scr/pom.xml
index 729cd7e..2890720 100644
--- a/scr/pom.xml
+++ b/scr/pom.xml
@@ -78,6 +78,9 @@
             ${bundle.build.name}/${project.build.finalName}.jar
         </bundle.file.name>
         <felix.ca.version>1.9.0</felix.ca.version>
+        <felix.java.version>8</felix.java.version>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
     </properties>
     
     


[felix-dev] 01/04: Merge branch 'master' into scrR8

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

tjwatson pushed a commit to branch scrR8
in repository https://gitbox.apache.org/repos/asf/felix-dev.git

commit 9ab0150bda3a033d12e14a3bd8778fa5e570edfb
Merge: f343822 31fa52b
Author: Thomas Watson <tj...@us.ibm.com>
AuthorDate: Tue Dec 15 09:38:19 2020 -0600

    Merge branch 'master' into scrR8

 .gitignore                                         |    1 +
 configadmin/changelog.txt                          |    1 -
 .../felix/cm/file/FilePersistenceManager.java      |   12 +-
 eventadmin/impl/pom.xml                            |    5 +-
 .../apache/felix/eventadmin/impl/Activator.java    |    2 +-
 .../felix/eventadmin/impl/Configuration.java       |   20 +-
 .../eventadmin/impl/adapter/AbstractAdapter.java   |    2 +-
 .../impl/adapter/BundleEventAdapter.java           |    6 +-
 .../impl/adapter/FrameworkEventAdapter.java        |    6 +-
 .../eventadmin/impl/adapter/LogEventAdapter.java   |   20 +-
 .../impl/adapter/ServiceEventAdapter.java          |    6 +-
 .../eventadmin/impl/handler/EventAdminImpl.java    |   27 +-
 .../eventadmin/impl/handler/EventHandlerProxy.java |   11 +-
 .../impl/handler/EventHandlerTracker.java          |    4 +-
 .../impl/security/EventAdminSecurityDecorator.java |   20 +-
 .../eventadmin/impl/security/PermissionsUtil.java  |    8 +-
 .../impl/security/SecureEventAdminFactory.java     |   22 +-
 .../eventadmin/impl/tasks/AsyncDeliverTasks.java   |    1 +
 .../eventadmin/impl/tasks/DefaultThreadPool.java   |    4 +
 .../felix/eventadmin/impl/tasks/DenylistLatch.java |    2 +-
 .../felix/eventadmin/impl/tasks/HandlerTask.java   |    1 +
 .../eventadmin/impl/tasks/SyncDeliverTasks.java    |    7 +-
 .../felix/eventadmin/impl/tasks/SyncThread.java    |    1 +
 .../felix/eventadmin/impl/util/LogWrapper.java     |   18 +-
 framework/doc/changelog.txt                        |   11 +
 framework/pom.xml                                  |    1 +
 .../src/main/appended-resources/META-INF/NOTICE    |    2 +-
 .../util/manifestparser/NativeLibraryClause.java   |    5 +
 framework/src/main/resources/default.properties    |    1 +
 http/jetty/pom.xml                                 |    4 +-
 http/sslfilter/pom.xml                             |    2 +-
 main.distribution/NOTICE                           |    2 +-
 main.distribution/doc/changelog.txt                |   10 +
 main.distribution/doc/changelog_framework.txt      |   11 +
 main.distribution/doc/changelog_gogo.command.txt   |   46 +-
 main.distribution/doc/changelog_gogo.runtime.txt   |   89 +-
 main.distribution/doc/changelog_main.txt           |   10 +
 main.distribution/doc/changelog_resolver.txt       |    7 +
 main.distribution/pom.xml                          |   15 +-
 main/doc/changelog.txt                             |   10 +
 main/pom.xml                                       |   13 +-
 main/src/main/appended-resources/META-INF/NOTICE   |    2 +-
 resolver/doc/changelog.txt                         |    7 +
 resolver/pom.xml                                   |    1 +
 .../src/main/appended-resources/META-INF/NOTICE    |    2 +-
 .../apache/felix/scr/impl/logger/BundleLogger.java |    6 +-
 .../felix/scr/impl/logger/ComponentLogger.java     |    5 +-
 .../felix/scr/impl/logger/ExtLogManager.java       |   77 +-
 .../felix/scr/impl/logger/InternalLogger.java      |  152 +--
 .../apache/felix/scr/impl/logger/LogManager.java   |  422 ++++---
 .../felix/scr/impl/logger/ScrLogManager.java       |  570 +++++----
 .../apache/felix/scr/impl/logger/ScrLogger.java    |   19 +-
 utils/pom.xml                                      |    5 +-
 .../felix/utils/resource/ResourceBuilder.java      |    7 +-
 .../felix/utils/resource/ResourceBuilderTest.java  |   33 +
 webconsole/changelog.txt                           |    4 +
 webconsole/pom.xml                                 |   27 +-
 .../res/lib/{jquery-3.4.1.js => jquery-3.5.1.js}   | 1238 ++++++++++++--------
 ...ry-migrate-3.1.0.js => jquery-migrate-3.3.0.js} |  292 +++--
 .../java/org/apache/felix/webconsole/User.java     |   53 +
 .../webconsole/WebConsoleSecurityProvider.java     |    2 +-
 .../felix/webconsole/bundleinfo/package-info.java  |   21 +-
 .../apache/felix/webconsole/i18n/package-info.java |   21 +-
 .../internal/configuration/ConfigAdminSupport.java |   24 +-
 .../internal/configuration/ConfigManager.java      |    3 +-
 .../webconsole/internal/servlet/OsgiManager.java   |  121 +-
 .../internal/servlet/OsgiManagerHttpContext.java   |   80 +-
 .../org/apache/felix/webconsole/package-info.java  |   21 +-
 .../src/main/resources/res/lib/jquery-3.4.1.js     |    2 -
 .../src/main/resources/res/lib/jquery-3.5.1.js     |    2 +
 .../main/resources/res/lib/jquery-migrate-3.1.0.js |    2 -
 .../main/resources/res/lib/jquery-migrate-3.3.0.js |    2 +
 .../src/main/resources/templates/main_header.html  |    4 +-
 .../servlet/OsgiManagerHttpContextTest.java        |    4 +-
 .../internal/servlet/OsgiManagerTest.java          |    5 +-
 75 files changed, 2268 insertions(+), 1414 deletions(-)


[felix-dev] 03/04: Add support for Optional to be injected

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

tjwatson pushed a commit to branch scrR8
in repository https://gitbox.apache.org/repos/asf/felix-dev.git

commit 5d167e215e240ae5a779023c0f7e6b24f9c6b425
Author: Thomas Watson <tj...@us.ibm.com>
AuthorDate: Tue Jan 12 12:24:45 2021 -0600

    Add support for Optional<ServiceType> to be injected
    
    This is only supported for unary (0..1, 1..1) cardinality injection to
    fields and constructor.  Method injection is not supported for Optional
    type injection.
---
 .../apache/felix/scr/impl/inject/ValueUtils.java   |  14 +-
 .../felix/scr/impl/inject/field/FieldHandler.java  |  45 ++++--
 .../felix/scr/impl/inject/internal/ClassUtils.java |   3 +
 .../inject/internal/ComponentConstructorImpl.java  |  10 +-
 .../scr/integration/ComponentOptionalTest.java     | 170 +++++++++++++++++++++
 .../components/ConstructorSingleReference.java     |  12 ++
 .../components/InjectOptionalComponent.java        | 162 ++++++++++++++++++++
 .../resources/integration_test_inject_optional.xml | 121 +++++++++++++++
 8 files changed, 523 insertions(+), 14 deletions(-)

diff --git a/scr/src/main/java/org/apache/felix/scr/impl/inject/ValueUtils.java b/scr/src/main/java/org/apache/felix/scr/impl/inject/ValueUtils.java
index 2e29a3c..4f2af5c 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/inject/ValueUtils.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/inject/ValueUtils.java
@@ -23,6 +23,7 @@ import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.util.Map;
+import java.util.Optional;
 
 import org.apache.felix.scr.impl.helper.ReadOnlyDictionary;
 import org.apache.felix.scr.impl.inject.internal.Annotations;
@@ -54,7 +55,8 @@ public class ValueUtils {
         ref_serviceObjects,     // reference (field, constructor, method)
         ref_serviceType,        // reference (field, constructor, method)
         ref_map,                // reference (field, constructor, method)
-        ref_tuple               // reference (field, constructor ??) // TDODO
+        ref_tuple, // reference (field, constructor ??) // TDODO
+        ref_optional // reference (field, constructor, XX)
     }
 
     /** Empty array. */
@@ -148,6 +150,14 @@ public class ValueUtils {
             {
                 return ValueType.ref_formatterLogger;
             }
+            // 1.5 Optional
+            else if (typeClass == ClassUtils.OPTIONAL_CLASS)
+            {
+                // Note that the first check for "typeClass.isAssignableFrom(referenceType)"
+                // will handle case where they want an actual Optional service type.
+
+                valueType = ValueType.ref_optional;
+            }
             else
             {
                 if ( field != null )
@@ -320,6 +330,8 @@ public class ValueUtils {
             case ref_logger             :
             case ref_formatterLogger    : value = getLogger(componentType, targetType, componentContext, refPair);
                                           break;
+            case ref_optional           : value = Optional.ofNullable(refPair.getServiceObject(componentContext));
+                                          break;
             default: value = null;
         }
         return value;
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/inject/field/FieldHandler.java b/scr/src/main/java/org/apache/felix/scr/impl/inject/field/FieldHandler.java
index ce6f926..a5d25bd 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/inject/field/FieldHandler.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/inject/field/FieldHandler.java
@@ -25,6 +25,7 @@ import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.CopyOnWriteArraySet;
 
@@ -129,23 +130,32 @@ public class FieldHandler
                         }
                         if ( fieldType == ClassUtils.LIST_CLASS )
                         {
-                        	    this.setFieldValue(componentInstance, new CopyOnWriteArrayList<>());
+                            this.setFieldValue(componentInstance,
+                                new CopyOnWriteArrayList<>());
                         }
                         else
                         {
-                        	    this.setFieldValue(componentInstance, new CopyOnWriteArraySet<>());
+                            this.setFieldValue(componentInstance,
+                                new CopyOnWriteArraySet<>());
                         }
                     }
                 }
             }
             else
             {
-            	// only optional field need initialization
-            	if ( metadata.isOptional() )
-            	{
-	            	// null the field if optional and unary
-	            	this.setFieldValue(componentInstance, null);
-	            }
+                // only optional field need initialization
+                if (metadata.isOptional())
+                {
+                    if (valueType == ValueType.ref_optional)
+                    {
+                        this.setFieldValue(componentInstance, Optional.empty());
+                    }
+                    else
+                    {
+                        // null the field if optional and unary
+                        this.setFieldValue(componentInstance, null);
+                    }
+                }
             }
         }
         catch ( final InvocationTargetException ite)
@@ -182,7 +192,7 @@ public class FieldHandler
         {
             // unary references
 
-        	// unbind needs only be done, if reference is dynamic and optional
+            // unbind needs only be done, if reference is dynamic and optional
             if ( mType == METHOD_TYPE.UNBIND )
             {
                 if ( this.metadata.isOptional() && !this.metadata.isStatic() )
@@ -190,7 +200,15 @@ public class FieldHandler
                     // we only reset if it was previously set with this value
                     if ( bp.getComponentContext().getBoundValues(metadata.getName()).size() == 1 )
                     {
-                        this.setFieldValue(componentInstance, null);
+                        if (valueType == ValueType.ref_optional)
+                        {
+                            this.setFieldValue(componentInstance, Optional.empty());
+                        }
+                        else
+                        {
+                            // null the field if optional and unary
+                            this.setFieldValue(componentInstance, null);
+                        }
                     }
                 }
                 bp.getComponentContext().getBoundValues(metadata.getName()).remove(refPair);
@@ -518,8 +536,11 @@ public class FieldHandler
                 //??? this resolves which we need.... better way?
                 if (rawParameter.getRefPair().getServiceObject(rawParameter.getComponentContext()) == null
                   && handler.fieldExists( rawParameter.getComponentContext().getLogger() )
-                  && (handler.valueType == ValueType.ref_serviceType || handler.valueType == ValueType.ref_tuple
-                      || handler.valueType == ValueType.ref_logger || handler.valueType == ValueType.ref_formatterLogger) )
+                    && (handler.valueType == ValueType.ref_serviceType //
+                        || handler.valueType == ValueType.ref_tuple
+                        || handler.valueType == ValueType.ref_logger
+                        || handler.valueType == ValueType.ref_formatterLogger
+                        || handler.valueType == ValueType.ref_optional))
                 {
                     return rawParameter.getRefPair().getServiceObject(rawParameter.getComponentContext(), context);
                 }
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/inject/internal/ClassUtils.java b/scr/src/main/java/org/apache/felix/scr/impl/inject/internal/ClassUtils.java
index dcdd6b7..04b7a36 100755
--- a/scr/src/main/java/org/apache/felix/scr/impl/inject/internal/ClassUtils.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/inject/internal/ClassUtils.java
@@ -21,6 +21,7 @@ package org.apache.felix.scr.impl.inject.internal;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 
 import org.apache.felix.scr.impl.logger.ComponentLogger;
 import org.apache.felix.scr.impl.logger.InternalLogger.Level;
@@ -55,6 +56,8 @@ public class ClassUtils
     public static final Class<?> COLLECTION_CLASS = Collection.class;
     public static final Class<?> LIST_CLASS = List.class;
 
+    public static final Class<?> OPTIONAL_CLASS = Optional.class;
+
     public static final Class<?> COMPONENT_CONTEXT_CLASS = ComponentContext.class;
     public static final Class<?> BUNDLE_CONTEXT_CLASS = BundleContext.class;
     public static final Class<?> INTEGER_CLASS = Integer.class;
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/inject/internal/ComponentConstructorImpl.java b/scr/src/main/java/org/apache/felix/scr/impl/inject/internal/ComponentConstructorImpl.java
index 0e44eb0..5d9fc5a 100755
--- a/scr/src/main/java/org/apache/felix/scr/impl/inject/internal/ComponentConstructorImpl.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/inject/internal/ComponentConstructorImpl.java
@@ -24,6 +24,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.felix.scr.impl.inject.ComponentConstructor;
@@ -279,7 +280,8 @@ public class ComponentConstructorImpl<S> implements ComponentConstructor<S>
                                     && (constructorArgTypes[i] == ValueType.ref_serviceType
                                     || constructorArgTypes[i] == ValueType.ref_tuple
                                     || constructorArgTypes[i] == ValueType.ref_logger
-                                    || constructorArgTypes[i] == ValueType.ref_formatterLogger) )
+                                    || constructorArgTypes[i] == ValueType.ref_formatterLogger
+                                    || constructorArgTypes[i] == ValueType.ref_optional))
                             {
                                 refPair.getServiceObject(componentContext, componentContext.getBundleContext());
                             }
@@ -294,6 +296,12 @@ public class ComponentConstructorImpl<S> implements ComponentConstructor<S>
                             }
                         }
                     }
+                    // check for optional ref type; if null then use empty Optional
+                    if (ref == null && constructorArgTypes[i] == ValueType.ref_optional)
+                    {
+                        ref = Optional.empty();
+                    }
+
                     if ( !refMetadata.isMultiple())
                     {
                         if (ref == null && !refMetadata.isOptional())
diff --git a/scr/src/test/java/org/apache/felix/scr/integration/ComponentOptionalTest.java b/scr/src/test/java/org/apache/felix/scr/integration/ComponentOptionalTest.java
new file mode 100644
index 0000000..efd13e7
--- /dev/null
+++ b/scr/src/test/java/org/apache/felix/scr/integration/ComponentOptionalTest.java
@@ -0,0 +1,170 @@
+/*
+ * 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.felix.scr.integration;
+
+
+import static org.junit.Assert.assertEquals;
+
+import org.apache.felix.scr.integration.components.ConstructorSingleReference;
+import org.apache.felix.scr.integration.components.InjectOptionalComponent;
+import org.apache.felix.scr.integration.components.InjectOptionalComponent.Mode;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.osgi.service.component.runtime.dto.ComponentConfigurationDTO;
+
+
+@RunWith(PaxExam.class)
+public class ComponentOptionalTest extends ComponentTestBase
+{
+
+    static
+    {
+        // use different components
+        descriptorFile = "/integration_test_inject_optional.xml";
+
+        // uncomment to enable debugging of this test class
+        // paxRunnerVmOption = DEBUG_VM_OPTION;
+    }
+
+    static final String SINGLE_REFERENCE1 = "SingleReference1";
+    static final String SINGLE_REFERENCE2 = "SingleReference2";
+
+    private void doTest(Mode mode) throws Exception
+    {
+        final String componentname = mode.name();
+        ComponentConfigurationDTO cc = getDisabledConfigurationAndEnable(componentname,
+            mode.getInitialState());
+        assertEquals(mode.getInitCount(), cc.description.init);
+
+        InjectOptionalComponent cmp1 = null;
+        if (!mode.isMandatory())
+        {
+            cmp1 = this.getServiceFromConfiguration(cc, InjectOptionalComponent.class);
+            cmp1.checkMode(mode, null);
+        }
+
+        ComponentConfigurationDTO ref1DTO = getDisabledConfigurationAndEnable(
+            SINGLE_REFERENCE1,
+            mode.isDynamic() && !mode.isMandatory()//
+                ? ComponentConfigurationDTO.ACTIVE
+                : ComponentConfigurationDTO.SATISFIED);
+        ConstructorSingleReference ref1Service = getServiceFromConfiguration(ref1DTO,
+            ConstructorSingleReference.class);
+
+        cc = findComponentConfigurationByName(componentname, mode.getSecondState());
+        InjectOptionalComponent cmp2 = this.getServiceFromConfiguration(cc,
+            InjectOptionalComponent.class);
+
+        if (!mode.isMandatory())
+        {
+            assertEquals(cmp1, cmp2);
+        }
+
+        if (mode.isMandatory() || mode.isDynamic())
+        {
+            cmp2.checkMode(mode, ref1Service);
+        }
+        else
+        {
+            cmp2.checkMode(mode, null);
+        }
+
+        ComponentConfigurationDTO ref2DTO = getDisabledConfigurationAndEnable(
+            SINGLE_REFERENCE2, ComponentConfigurationDTO.SATISFIED);
+
+        ConstructorSingleReference ref2Service = getServiceFromConfiguration(ref2DTO,
+            ConstructorSingleReference.class);
+
+        if (mode.isMandatory() || mode.isDynamic())
+        {
+            cmp2.checkMode(mode, ref1Service);
+        }
+        else
+        {
+            cmp2.checkMode(mode, null);
+        }
+
+        disableAndCheck(ref1DTO);
+
+        if (mode.isDynamic())
+        {
+            cmp2.checkMode(mode, ref2Service);
+        }
+        else if (mode.isMandatory())
+        {
+            cc = findComponentConfigurationByName(componentname,
+                ComponentConfigurationDTO.SATISFIED);
+            InjectOptionalComponent cmp3 = this.getServiceFromConfiguration(cc,
+                InjectOptionalComponent.class);
+            cmp3.checkMode(mode, ref2Service);
+        }
+        else // is optional
+        {
+            cmp2.checkMode(mode, null);
+        }
+
+        disableAndCheck(cc);
+
+        cc = getDisabledConfigurationAndEnable(componentname,
+            ComponentConfigurationDTO.SATISFIED);
+        assertEquals(mode.getInitCount(), cc.description.init);
+        cmp1 = this.getServiceFromConfiguration(cc, InjectOptionalComponent.class);
+
+        cmp1.checkMode(mode, ref2Service);
+
+        disableAndCheck(cc);
+    }
+
+    @Test
+    public void test_field_static_optional() throws Exception
+    {
+        doTest(Mode.FIELD_STATIC_OPTIONAL);
+    }
+
+    @Test
+    public void test_field_dynamic_optional() throws Exception
+    {
+        doTest(Mode.FIELD_DYNAMIC_OPTIONAL);
+    }
+
+    @Test
+    public void test_field_static_mandatory() throws Exception
+    {
+        doTest(Mode.FIELD_STATIC_MANDATORY);
+    }
+
+    @Test
+    public void test_field_dynamic_mandatory() throws Exception
+    {
+        doTest(Mode.FIELD_DYNAMIC_MANDATORY);
+    }
+
+    @Test
+    public void test_constructor_mandatory() throws Exception
+    {
+        doTest(Mode.CONSTRUCTOR_MANDATORY);
+    }
+
+    @Test
+    public void test_constructor_optional() throws Exception
+    {
+        doTest(Mode.CONSTRUCTOR_OPTIONAL);
+    }
+}
diff --git a/scr/src/test/java/org/apache/felix/scr/integration/components/ConstructorSingleReference.java b/scr/src/test/java/org/apache/felix/scr/integration/components/ConstructorSingleReference.java
index 0905f8e..96e0e37 100644
--- a/scr/src/test/java/org/apache/felix/scr/integration/components/ConstructorSingleReference.java
+++ b/scr/src/test/java/org/apache/felix/scr/integration/components/ConstructorSingleReference.java
@@ -18,8 +18,14 @@
  */
 package org.apache.felix.scr.integration.components;
 
+import java.util.concurrent.atomic.AtomicLong;
+
 public class ConstructorSingleReference
 {
+    private static final AtomicLong instances = new AtomicLong();
+
+    private final long instanceID = instances.incrementAndGet();
+
     public @interface Config
     {
         String name();
@@ -37,4 +43,10 @@ public class ConstructorSingleReference
     {
         return this.name;
     }
+
+    @Override
+    public String toString()
+    {
+        return getClass().getSimpleName() + '-' + instanceID;
+    }
 }
diff --git a/scr/src/test/java/org/apache/felix/scr/integration/components/InjectOptionalComponent.java b/scr/src/test/java/org/apache/felix/scr/integration/components/InjectOptionalComponent.java
new file mode 100644
index 0000000..90cbd1d
--- /dev/null
+++ b/scr/src/test/java/org/apache/felix/scr/integration/components/InjectOptionalComponent.java
@@ -0,0 +1,162 @@
+/*
+ * 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.felix.scr.integration.components;
+
+
+import java.util.Map;
+import java.util.Optional;
+
+import org.osgi.service.component.ComponentConstants;
+import org.osgi.service.component.runtime.dto.ComponentConfigurationDTO;
+
+public class InjectOptionalComponent
+{
+    public enum Mode
+    {
+        FIELD_STATIC_MANDATORY(1, false, true), //
+        FIELD_DYNAMIC_MANDATORY(1, true, true), //
+        FIELD_STATIC_OPTIONAL(1, false, false), //
+        FIELD_DYNAMIC_OPTIONAL(1, true, false), //
+        CONSTRUCTOR_MANDATORY(2, false, true), //
+        CONSTRUCTOR_OPTIONAL(2, false, false);
+
+        final int initCount;
+        final int initialState;
+        final int secondState;
+        final boolean isMandatory;
+        final boolean isDynamic;
+
+        Mode(int initCount, boolean isDynamic, boolean isMandatory)
+        {
+            this.initCount = initCount;
+            this.initialState = isMandatory
+                ? ComponentConfigurationDTO.UNSATISFIED_REFERENCE
+                : ComponentConfigurationDTO.SATISFIED;
+            this.secondState = isMandatory ? ComponentConfigurationDTO.SATISFIED
+                : ComponentConfigurationDTO.ACTIVE;
+            this.isMandatory = isMandatory;
+            this.isDynamic = isDynamic;
+        }
+
+        public int getInitCount()
+        {
+            return initCount;
+        }
+
+        public int getInitialState()
+        {
+            return initialState;
+        }
+
+        public int getSecondState()
+        {
+            return secondState;
+        }
+
+        public final boolean isMandatory()
+        {
+            return isMandatory;
+        }
+
+        public final boolean isDynamic()
+        {
+            return isDynamic;
+        }
+
+    }
+
+    private final Mode mode;
+
+    private final Optional<ConstructorSingleReference> refConstructor;
+    private Optional<ConstructorSingleReference> refFieldStatic = null;
+    private volatile Optional<ConstructorSingleReference> refFieldDynamic = null;
+
+    public InjectOptionalComponent(Map<String, Object> props, Optional<ConstructorSingleReference> single)
+    {
+        this.mode = getMode(props);
+        this.refConstructor = single;
+    }
+
+    public InjectOptionalComponent(Map<String, Object> props)
+    {
+        this(props, null);
+    }
+
+    private Mode getMode(Map<String, Object> props)
+    {
+        return Mode.valueOf((String) props.get(ComponentConstants.COMPONENT_NAME));
+    }
+
+    public boolean checkMode(Mode mode, ConstructorSingleReference expected)
+    {
+        if (this.mode != mode)
+        {
+            throw new AssertionError(
+                "Wrong mode, expected \"" + mode + "\" but was\"" + this.mode);
+        }
+        Optional<ConstructorSingleReference> optional = getOptional();
+        if (expected != null)
+        {
+            return optional.map((c) -> checkExpected(expected, c)).orElseGet(
+                () -> throwAssertionError(
+                    "FAILED - expected: " + expected + " but got empty optional."));
+        }
+        else
+        {
+            return optional.map(
+                (c) -> throwAssertionError(
+                    "FAILED - expected empty optional but got: " + c)).orElse(true);
+        }
+    }
+
+    private boolean throwAssertionError(String message)
+    {
+        throw new AssertionError(message);
+    }
+
+    private boolean checkExpected(ConstructorSingleReference expected,
+        ConstructorSingleReference actual)
+    {
+        if (expected == actual)
+        {
+            return true;
+        }
+        throw new AssertionError(
+            "FAILED - expected: " + expected + " bug got: " + actual);
+    }
+
+    private Optional<ConstructorSingleReference> getOptional()
+    {
+        switch (mode)
+        {
+            case CONSTRUCTOR_MANDATORY:
+            case CONSTRUCTOR_OPTIONAL:
+                return refConstructor;
+            case FIELD_DYNAMIC_MANDATORY:
+            case FIELD_DYNAMIC_OPTIONAL:
+                return refFieldDynamic;
+            case FIELD_STATIC_MANDATORY:
+            case FIELD_STATIC_OPTIONAL:
+                return refFieldStatic;
+            default:
+                throw new UnsupportedOperationException(String.valueOf(mode));
+        }
+    }
+
+}
diff --git a/scr/src/test/resources/integration_test_inject_optional.xml b/scr/src/test/resources/integration_test_inject_optional.xml
new file mode 100644
index 0000000..a40be9d
--- /dev/null
+++ b/scr/src/test/resources/integration_test_inject_optional.xml
@@ -0,0 +1,121 @@
+<?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.
+-->
+<components xmlns:scr="http://www.osgi.org/xmlns/scr/v1.4.0">
+
+    <!-- Static Field -->
+    <scr:component name="FIELD_STATIC_MANDATORY" enabled="false"
+                   init="1">
+        <implementation class="org.apache.felix.scr.integration.components.InjectOptionalComponent" />
+        <service factory="false">
+            <provide interface="org.apache.felix.scr.integration.components.InjectOptionalComponent"/>
+        </service>
+        <reference
+            name="refFieldStatic"
+            interface="org.apache.felix.scr.integration.components.ConstructorSingleReference"
+            field="refFieldStatic"
+            cardinality="1..1"
+        />
+    </scr:component>
+
+    <scr:component name="FIELD_STATIC_OPTIONAL" enabled="false"
+                   init="1">
+        <implementation class="org.apache.felix.scr.integration.components.InjectOptionalComponent" />
+        <service factory="false">
+            <provide interface="org.apache.felix.scr.integration.components.InjectOptionalComponent"/>
+        </service>
+        <reference
+            name="refFieldStatic"
+            interface="org.apache.felix.scr.integration.components.ConstructorSingleReference"
+            field="refFieldStatic"
+            cardinality="0..1"
+        />
+    </scr:component>
+
+    <!-- Dynamic Field -->
+    <scr:component name="FIELD_DYNAMIC_MANDATORY" enabled="false"
+                   init="1">
+        <implementation class="org.apache.felix.scr.integration.components.InjectOptionalComponent" />
+        <service factory="false">
+            <provide interface="org.apache.felix.scr.integration.components.InjectOptionalComponent"/>
+        </service>
+        <reference
+            name="refFieldDynamic"
+            interface="org.apache.felix.scr.integration.components.ConstructorSingleReference"
+            field="refFieldDynamic"
+            cardinality="1..1"
+            policy="dynamic"
+        />
+    </scr:component>
+
+    <scr:component name="FIELD_DYNAMIC_OPTIONAL" enabled="false"
+                   init="1">
+        <implementation class="org.apache.felix.scr.integration.components.InjectOptionalComponent" />
+        <service factory="false">
+            <provide interface="org.apache.felix.scr.integration.components.InjectOptionalComponent"/>
+        </service>
+        <reference
+            name="refFieldDynamic"
+            interface="org.apache.felix.scr.integration.components.ConstructorSingleReference"
+            field="refFieldDynamic"
+            cardinality="0..1"
+            policy="dynamic"
+        />
+    </scr:component>
+
+    <!-- mandatory constructor -->
+    <scr:component name="CONSTRUCTOR_MANDATORY" enabled="false"
+                   init="2">
+        <implementation class="org.apache.felix.scr.integration.components.InjectOptionalComponent" />
+        <service factory="false">
+            <provide interface="org.apache.felix.scr.integration.components.InjectOptionalComponent"/>
+        </service>
+        <reference interface="org.apache.felix.scr.integration.components.ConstructorSingleReference"
+                   cardinality="1..1"
+                   parameter="1"/>
+    </scr:component>
+
+    <!-- optional constructor -->
+    <scr:component name="CONSTRUCTOR_OPTIONAL" enabled="false"
+                   init="2">
+        <implementation class="org.apache.felix.scr.integration.components.InjectOptionalComponent" />
+        <service factory="false">
+            <provide interface="org.apache.felix.scr.integration.components.InjectOptionalComponent"/>
+        </service>
+        <reference interface="org.apache.felix.scr.integration.components.ConstructorSingleReference"
+                   cardinality="0..1"
+                   parameter="1"/>
+    </scr:component>
+
+    <scr:component name="SingleReference1" enabled="false" activate="activator">
+        <implementation class="org.apache.felix.scr.integration.components.ConstructorSingleReference" />
+        <service factory="false">
+            <provide interface="org.apache.felix.scr.integration.components.ConstructorSingleReference"/>
+        </service>
+        <property name="name" value="single"/>
+    </scr:component>
+
+    <scr:component name="SingleReference2" enabled="false" activate="activator">
+        <implementation class="org.apache.felix.scr.integration.components.ConstructorSingleReference" />
+        <service factory="false">
+            <provide interface="org.apache.felix.scr.integration.components.ConstructorSingleReference"/>
+        </service>
+        <property name="name" value="single"/>
+    </scr:component>
+</components>