You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by kl...@apache.org on 2022/03/30 16:23:17 UTC
[geode] branch support/1.12 updated (36d9260 -> 5169450)
This is an automated email from the ASF dual-hosted git repository.
klund pushed a change to branch support/1.12
in repository https://gitbox.apache.org/repos/asf/geode.git.
from 36d9260 GEODE-10179: Bump jackson-databind from 2.10.5.1 to 2.12.6.1 (#7506)
new 3a21177 GEODE-9817: Enable customized source set paths for ClassAnalysisRule (#7121)
new 73054f4 GEODE-9758: Move SanctionedSerializables to filter package (#7165)
new 4f7f575 GEODE-9758: Move ClassUtils to geode-common (#7166)
new c374cb9 GEODE-9879: Extract SystemProperty to geode-common (#7177)
new ff15cca GEODE-9758: Add internal serial filter API (#7217)
new 5169450 GEODE-9980: Improve error handling of serial filters (#7299)
The 6 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:
...artLocatorGlobalSerialFilterAcceptanceTest.java | 138 ++++++++
...StartLocatorJmxSerialFilterAcceptanceTest.java} | 58 ++--
...tartServerGlobalSerialFilterAcceptanceTest.java | 150 +++++++++
.../StartServerJmxSerialFilterAcceptanceTest.java} | 55 ++--
geode-common/build.gradle | 6 +
.../org/apache/geode/internal/lang/ClassUtils.java | 2 +-
.../apache/geode/internal/lang/SystemProperty.java | 118 +++++++
.../geode/internal/lang/SystemPropertyTest.java | 82 ++---
.../geode/internal/lang/utils/ClassUtilsTest.java | 8 +-
...lyzeConnectorsSerializablesIntegrationTest.java | 2 +-
...ctionedSerializablesServiceIntegrationTest.java | 2 +-
.../ConnectorsSanctionedSerializablesService.java | 2 +-
...lization.filter.SanctionedSerializablesService} | 0
geode-core/build.gradle | 16 +-
...ValidateSerializableObjectsDistributedTest.java | 320 +++++++++++++++++++
...okenSerializationConsistencyRegressionTest.java | 6 +-
...entDeserializationCopyOnReadRegressionTest.java | 7 +-
.../cache/PartitionedRegionSingleHopDUnitTest.java | 2 +-
.../RebalanceOperationComplexDistributedTest.java | 4 +-
.../cache/ha/HARQueueNewImplDUnitTest.java | 5 +-
.../ha/HARegionQueueExpiryRegressionTest.java | 5 +-
.../HARegionQueueThreadIdExpiryRegressionTest.java | 8 +-
.../sockets/RedundancyLevelPart1DUnitTest.java | 2 +-
.../AnalyzeCoreSerializablesIntegrationTest.java | 3 +-
...catorLauncherJmxManagerLocalRegressionTest.java | 22 +-
...ctionedSerializablesServiceIntegrationTest.java | 2 +-
.../internal/cache/ha/HARegionQueueJUnitTest.java | 4 +-
.../DefaultDiskDirsIntegrationTest.java | 4 +-
...cherGlobalSerialFilterBlankIntegrationTest.java | 55 ++++
...herGlobalSerialFilterExistsIntegrationTest.java | 55 ++++
...rLauncherGlobalSerialFilterIntegrationTest.java | 52 +++
...alSerialFilterPropertyBlankIntegrationTest.java | 54 ++++
...alSerialFilterPropertyEmptyIntegrationTest.java | 54 ++++
...atorLauncherJmxSerialFilterIntegrationTest.java | 84 +++++
...mxSerialFilterPropertyBlankIntegrationTest.java | 88 ++++++
...mxSerialFilterPropertyEmptyIntegrationTest.java | 88 ++++++
...xSerialFilterPropertyExistsIntegrationTest.java | 90 ++++++
.../filter/LocatorLauncherWithJmxManager.java | 82 +++++
.../filter/SerialFilterAssertions.java | 58 ++++
...cherGlobalSerialFilterBlankIntegrationTest.java | 55 ++++
...herGlobalSerialFilterExistsIntegrationTest.java | 55 ++++
...rLauncherGlobalSerialFilterIntegrationTest.java | 51 +++
...alSerialFilterPropertyBlankIntegrationTest.java | 53 ++++
...alSerialFilterPropertyEmptyIntegrationTest.java | 53 ++++
...rverLauncherJmxSerialFilterIntegrationTest.java | 87 +++++
...mxSerialFilterPropertyBlankIntegrationTest.java | 88 ++++++
...mxSerialFilterPropertyEmptyIntegrationTest.java | 88 ++++++
...xSerialFilterPropertyExistsIntegrationTest.java | 90 ++++++
.../filter/ServerLauncherWithJmxManager.java | 77 +++++
...erConfiguresJmxSerialFilterIntegrationTest.java | 204 ------------
.../internal/ManagementAgentIntegrationTest.java | 6 +-
...erConfiguresJmxSerialFilterIntegrationTest.java | 201 ------------
.../apache/geode/distributed/AbstractLauncher.java | 2 +-
.../apache/geode/distributed/LocatorLauncher.java | 20 ++
.../apache/geode/distributed/ServerLauncher.java | 19 ++
.../distributed/internal/DistributionConfig.java | 4 +-
.../CoreSanctionedSerializablesService.java | 2 +-
.../DistributedSerializableObjectConfig.java | 51 +++
.../geode/internal/InternalDataSerializer.java | 56 ++--
.../internal/ObjectInputStreamFilterWrapper.java | 233 --------------
.../internal/cache/EntryEventSerialization.java | 2 +-
.../cache/eviction/EvictionListBuilder.java | 3 +-
.../cache/eviction/LRUListWithAsyncSorting.java | 5 +-
.../cache/eviction/LRUListWithSyncSorting.java | 3 +-
.../geode/internal/cache/ha/HARegionQueue.java | 2 +-
.../cache/persistence/DefaultDiskDirs.java | 2 +-
.../apache/geode/internal/config/JAXBService.java | 6 +-
.../geode/internal/lang/SystemPropertyHelper.java | 89 ++----
.../internal/logging/CoreLoggingExecutors.java | 2 +-
.../geode/logging/internal/Configuration.java | 6 +-
.../logging/internal/LoggingProviderLoader.java | 5 +-
.../internal/JmxRmiOpenTypesSerialFilter.java | 148 ---------
.../geode/management/internal/ManagementAgent.java | 15 +-
.../internal/ManagementAgentFactory.java | 3 +-
.../internal/SystemManagementService.java | 9 +-
...lization.filter.SanctionedSerializablesService} | 0
.../geode/distributed/LocatorLauncherTest.java | 2 +-
.../internal/DistributionConfigJUnitTest.java | 8 +
.../DistributedSerializableObjectConfigTest.java | 62 ++++
...lDataSerializerSerializationAcceptlistTest.java | 153 ++++++---
.../InternalDataSerializerShiroAcceptListTest.java | 34 +-
.../cache/EntryEventSerializationTest.java | 4 +-
.../cache/persistence/DefaultDiskDirsTest.java | 6 +-
.../PersistenceInitialImageAdvisorTest.java | 5 +-
.../internal/lang/SystemPropertyHelperTest.java | 101 +++---
.../internal/JmxRmiOpenTypesSerialFilterTest.java | 351 ---------------------
geode-core/src/test/resources/expected-pom.xml | 10 +-
...ctionedSerializablesServiceIntegrationTest.java | 2 +-
.../AnalyzeCQSerializablesIntegrationTest.java | 3 +-
.../internal/CQSanctionedSerializablesService.java | 2 +-
...lization.filter.SanctionedSerializablesService} | 0
.../DistributedDiskDirRuleDistributedTest.java | 17 +-
.../AnalyzeDUnitSerializablesIntegrationTest.java | 4 +-
...ctionedSerializablesServiceIntegrationTest.java | 2 +-
.../junit/rules/DiskDirRuleIntegrationTest.java | 5 +-
.../DUnitSanctionedSerializablesService.java | 2 +-
.../test/dunit/rules/DistributedDiskDirRule.java | 16 +-
.../apache/geode/test/junit/rules/DiskDirRule.java | 14 +-
...lization.filter.SanctionedSerializablesService} | 0
.../AnalyzeGfshSerializablesIntegrationTest.java | 5 +-
...ctionedSerializablesServiceIntegrationTest.java | 4 +-
.../GfshSanctionedSerializablesService.java | 4 +-
.../cli/commands/DescribeDiskStoreCommand.java | 2 +-
.../geode/management/internal/cli/shell/Gfsh.java | 2 +-
...lization.filter.SanctionedSerializablesService} | 2 +-
.../sanctioned-geode-gfsh-serializables.txt | 0
geode-http-service/build.gradle | 1 +
.../AnalyzeJUnitSerializablesIntegrationTest.java | 3 +-
...ctionedSerializablesServiceIntegrationTest.java | 5 +-
....java => AnalyzeDataSerializablesTestBase.java} | 74 ++---
...SerializablesWithClassAnalysisRuleTestBase.java | 26 +-
...Base.java => AnalyzeSerializablesTestBase.java} | 47 ++-
...SerializablesWithClassAnalysisRuleTestBase.java | 24 +-
.../geode/codeAnalysis/CompiledClassUtils.java | 8 +-
...nedSerializablesServiceIntegrationTestBase.java | 22 +-
.../categories/SanctionedSerializablesTest.java | 5 +-
.../JUnitSanctionedSerializablesService.java | 2 +-
.../geode/test/junit/rules/ClassAnalysisRule.java | 23 +-
...lization.filter.SanctionedSerializablesService} | 0
...ctionedSerializablesServiceIntegrationTest.java | 2 +-
.../AnalyzeLuceneSerializablesIntegrationTest.java | 3 +-
.../LuceneSanctionedSerializablesService.java | 2 +-
...lization.filter.SanctionedSerializablesService} | 0
...lyzeManagementSerializablesIntegrationTest.java | 2 +-
...ctionedSerializablesServiceIntegrationTest.java | 2 +-
.../ManagementSanctionedSerializablesService.java | 2 +-
...lization.filter.SanctionedSerializablesService} | 0
...lyzeMembershipSerializablesIntegrationTest.java | 2 +-
.../MembershipDependenciesJUnitTest.java | 1 -
...ctionedSerializablesServiceIntegrationTest.java | 2 +-
.../MembershipSanctionedSerializablesService.java | 2 +-
...lization.filter.SanctionedSerializablesService} | 0
...alyzeMemcachedSerializablesIntegrationTest.java | 2 +-
...ctionedSerializablesServiceIntegrationTest.java | 2 +-
.../MemcachedSanctionedSerializablesService.java | 2 +-
...lization.filter.SanctionedSerializablesService} | 0
.../AnalyzePulseSerializablesIntegrationTest.java | 3 +-
.../AnalyzeRedisSerializablesIntegrationTest.java | 3 +-
.../RedisSanctionedSerializablesService.java | 2 +-
...lization.filter.SanctionedSerializablesService} | 0
...ctionedSerializablesServiceIntegrationTest.java | 2 +-
...lization.filter.SanctionedSerializablesService} | 0
geode-serialization/build.gradle | 4 +
...eSerializationSerializablesIntegrationTest.java | 2 +-
...ctionedSerializablesServiceIntegrationTest.java | 1 +
...ationWhenFilterIsAlreadySetIntegrationTest.java | 52 +++
...enObjectInputFilterNotFoundIntegrationTest.java | 108 +++++++
...nputFilterApiSetFilterBlankIntegrationTest.java | 62 ++++
...jectInputFilterApiSetFilterIntegrationTest.java | 60 ++++
...InputFilterApiSetFilterNullIntegrationTest.java | 61 ++++
.../apache/geode/codeAnalysis/excludedClasses.txt | 0
...erializationSanctionedSerializablesService.java | 2 +
.../internal/serialization/filter/ApiPackage.java | 30 +-
.../filter/FilterAlreadyConfiguredException.java | 30 +-
.../serialization/filter/FilterConfiguration.java | 12 +-
.../serialization/filter/FilterPattern.java | 17 +-
.../serialization/filter/GlobalSerialFilter.java | 15 +-
.../filter/GlobalSerialFilterConfiguration.java | 123 ++++++++
.../GlobalSerialFilterConfigurationFactory.java | 14 +-
.../GlobalSerialFilterFactory.java} | 23 +-
.../Java9ReflectiveObjectInputFilterApi.java | 64 ++++
.../filter/JmxSerialFilterConfiguration.java | 73 +++++
.../JmxSerialFilterConfigurationFactory.java | 13 +-
.../filter/NullStreamSerialFilter.java | 10 +-
.../serialization/filter/ObjectInputFilterApi.java | 85 +++++
.../filter/ObjectInputFilterApiFactory.java | 9 +-
.../filter/ObjectInputFilterInvocationHandler.java | 109 +++++++
.../filter/ObjectInputFilterUtils.java | 61 ++++
.../filter/OpenMBeanFilterPattern.java | 68 ++++
.../filter/ReflectiveFacadeGlobalSerialFilter.java | 102 ++++++
.../ReflectiveFacadeGlobalSerialFilterFactory.java | 46 +++
.../filter/ReflectiveFacadeStreamSerialFilter.java | 109 +++++++
.../ReflectiveFacadeStreamSerialFilterFactory.java | 39 +++
.../filter/ReflectiveObjectInputFilterApi.java | 238 ++++++++++++++
.../ReflectiveObjectInputFilterApiFactory.java | 45 +++
.../{ => filter}/SanctionedSerializables.java | 42 ++-
.../SanctionedSerializablesFilterPattern.java | 111 +++++++
.../SanctionedSerializablesService.java | 8 +-
.../SerializableObjectConfig.java} | 24 +-
.../serialization/filter/StreamSerialFilter.java | 18 +-
.../filter/StreamSerialFilterFactory.java | 12 +-
...ertyGlobalSerialFilterConfigurationFactory.java | 68 ++++
...ropertyJmxSerialFilterConfigurationFactory.java | 55 ++++
.../filter/UnableToSetSerialFilterException.java | 30 +-
...lization.filter.SanctionedSerializablesService} | 0
...anctioned-geode-serialization-serializables.txt | 3 +
...est.java => SerializationDependenciesTest.java} | 18 +-
.../serialization/filter/ApiPackageTest.java | 61 ++++
.../GlobalSerialFilterConfigurationTest.java | 118 +++++++
.../JmxSerialFilterConfigurationFactoryTest.java | 74 +++++
.../filter/JmxSerialFilterConfigurationTest.java | 165 ++++++++++
.../filter/NullObjectInputFilterTest.java | 21 +-
.../ObjectInputFilterInvocationHandlerTest.java | 97 ++++++
.../filter/ObjectInputFilterUtilsTest.java | 94 ++++++
.../filter/OpenMBeanFilterPatternTest.java | 142 +++++++++
...lectiveFacadeGlobalSerialFilterFactoryTest.java | 75 +++++
.../ReflectiveFacadeGlobalSerialFilterTest.java | 165 ++++++++++
...flectiveFacadeObjectInputFilterFactoryTest.java | 84 +++++
.../ReflectiveFacadeObjectInputFilterTest.java | 174 ++++++++++
.../ReflectiveObjectInputFilterApiFactoryTest.java | 69 ++++
.../filter/ReflectiveObjectInputFilterApiTest.java | 228 +++++++++++++
.../SanctionedSerializablesFilterPatternTest.java | 206 ++++++++++++
.../filter/SanctionedSerializablesTest.java | 95 ++++++
.../filter/SerialFilterAssertions.java | 69 ++++
.../filter/SerializableObjectConfigTest.java | 46 +++
...GlobalSerialFilterConfigurationFactoryTest.java | 144 +++++++++
...rtyJmxSerialFilterConfigurationFactoryTest.java | 94 ++++++
.../src/test/resources/expected-pom.xml | 10 +
...ctionedSerializablesServiceIntegrationTest.java | 4 +-
.../AnalyzeWANSerializablesIntegrationTest.java | 5 +-
.../WANSanctionedSerializablesService.java | 4 +-
...lization.filter.SanctionedSerializablesService} | 2 +-
.../sanctioned-geode-wan-serializables.txt | 0
.../AnalyzeWebApiSerializablesIntegrationTest.java | 3 +-
...ctionedSerializablesServiceIntegrationTest.java | 2 +-
.../WebApiSanctionedSerializablesService.java | 2 +-
.../geode/rest/internal/web/util/NumberUtils.java | 2 +-
...lization.filter.SanctionedSerializablesService} | 0
218 files changed, 7222 insertions(+), 1795 deletions(-)
create mode 100644 geode-assembly/src/acceptanceTest/java/org/apache/geode/serialization/filter/StartLocatorGlobalSerialFilterAcceptanceTest.java
rename geode-assembly/src/acceptanceTest/java/org/apache/geode/{management/LocatorManagerConfiguresJmxSerialFilterAcceptanceTest.java => serialization/filter/StartLocatorJmxSerialFilterAcceptanceTest.java} (66%)
create mode 100644 geode-assembly/src/acceptanceTest/java/org/apache/geode/serialization/filter/StartServerGlobalSerialFilterAcceptanceTest.java
rename geode-assembly/src/acceptanceTest/java/org/apache/geode/{management/ServerManagerConfiguresJmxSerialFilterAcceptanceTest.java => serialization/filter/StartServerJmxSerialFilterAcceptanceTest.java} (66%)
rename {geode-core => geode-common}/src/main/java/org/apache/geode/internal/lang/ClassUtils.java (99%)
create mode 100644 geode-common/src/main/java/org/apache/geode/internal/lang/SystemProperty.java
copy geode-core/src/test/java/org/apache/geode/internal/lang/SystemPropertyHelperTest.java => geode-common/src/test/java/org/apache/geode/internal/lang/SystemPropertyTest.java (50%)
rename geode-core/src/test/java/org/apache/geode/internal/lang/ClassUtilsJUnitTest.java => geode-common/src/test/java/org/apache/geode/internal/lang/utils/ClassUtilsTest.java (97%)
rename geode-connectors/src/main/resources/META-INF/services/{org.apache.geode.internal.serialization.SanctionedSerializablesService => org.apache.geode.internal.serialization.filter.SanctionedSerializablesService} (100%)
create mode 100644 geode-core/src/distributedTest/java/org/apache/geode/cache/ValidateSerializableObjectsDistributedTest.java
create mode 100644 geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherGlobalSerialFilterBlankIntegrationTest.java
create mode 100644 geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherGlobalSerialFilterExistsIntegrationTest.java
create mode 100644 geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherGlobalSerialFilterIntegrationTest.java
create mode 100644 geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherGlobalSerialFilterPropertyBlankIntegrationTest.java
create mode 100644 geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherGlobalSerialFilterPropertyEmptyIntegrationTest.java
create mode 100644 geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherJmxSerialFilterIntegrationTest.java
create mode 100644 geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherJmxSerialFilterPropertyBlankIntegrationTest.java
create mode 100644 geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherJmxSerialFilterPropertyEmptyIntegrationTest.java
create mode 100644 geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherJmxSerialFilterPropertyExistsIntegrationTest.java
create mode 100644 geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherWithJmxManager.java
create mode 100644 geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/SerialFilterAssertions.java
create mode 100644 geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherGlobalSerialFilterBlankIntegrationTest.java
create mode 100644 geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherGlobalSerialFilterExistsIntegrationTest.java
create mode 100644 geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherGlobalSerialFilterIntegrationTest.java
create mode 100644 geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherGlobalSerialFilterPropertyBlankIntegrationTest.java
create mode 100644 geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherGlobalSerialFilterPropertyEmptyIntegrationTest.java
create mode 100644 geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherJmxSerialFilterIntegrationTest.java
create mode 100644 geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherJmxSerialFilterPropertyBlankIntegrationTest.java
create mode 100644 geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherJmxSerialFilterPropertyEmptyIntegrationTest.java
create mode 100644 geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherJmxSerialFilterPropertyExistsIntegrationTest.java
create mode 100644 geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherWithJmxManager.java
delete mode 100644 geode-core/src/integrationTest/java/org/apache/geode/management/internal/LocatorManagerConfiguresJmxSerialFilterIntegrationTest.java
delete mode 100644 geode-core/src/integrationTest/java/org/apache/geode/management/internal/ServerManagerConfiguresJmxSerialFilterIntegrationTest.java
create mode 100644 geode-core/src/main/java/org/apache/geode/internal/DistributedSerializableObjectConfig.java
delete mode 100644 geode-core/src/main/java/org/apache/geode/internal/ObjectInputStreamFilterWrapper.java
delete mode 100644 geode-core/src/main/java/org/apache/geode/management/internal/JmxRmiOpenTypesSerialFilter.java
rename geode-core/src/main/resources/META-INF/services/{org.apache.geode.internal.serialization.SanctionedSerializablesService => org.apache.geode.internal.serialization.filter.SanctionedSerializablesService} (100%)
rename geode-core/src/{distributedTest => test}/java/org/apache/geode/distributed/LocatorLauncherTest.java (97%)
create mode 100644 geode-core/src/test/java/org/apache/geode/internal/DistributedSerializableObjectConfigTest.java
delete mode 100644 geode-core/src/test/java/org/apache/geode/management/internal/JmxRmiOpenTypesSerialFilterTest.java
rename geode-cq/src/main/resources/META-INF/services/{org.apache.geode.internal.serialization.SanctionedSerializablesService => org.apache.geode.internal.serialization.filter.SanctionedSerializablesService} (100%)
rename geode-dunit/src/main/resources/META-INF/services/{org.apache.geode.internal.serialization.SanctionedSerializablesService => org.apache.geode.internal.serialization.filter.SanctionedSerializablesService} (100%)
rename geode-gfsh/src/integrationTest/java/org/apache/geode/{management/internal => gfsh/internal/management}/GfshSanctionedSerializablesServiceIntegrationTest.java (93%)
rename geode-gfsh/src/main/java/org/apache/geode/{management/internal => gfsh/internal/management}/GfshSanctionedSerializablesService.java (88%)
rename geode-gfsh/src/main/resources/META-INF/services/{org.apache.geode.internal.serialization.SanctionedSerializablesService => org.apache.geode.internal.serialization.filter.SanctionedSerializablesService} (90%)
rename geode-gfsh/src/main/resources/org/apache/geode/{management/internal => gfsh/internal/management}/sanctioned-geode-gfsh-serializables.txt (100%)
rename geode-junit/src/main/java/org/apache/geode/codeAnalysis/{AnalyzeDataSerializablesJUnitTestBase.java => AnalyzeDataSerializablesTestBase.java} (88%)
copy geode-core/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeCoreSerializablesIntegrationTest.java => geode-junit/src/main/java/org/apache/geode/codeAnalysis/AnalyzeDataSerializablesWithClassAnalysisRuleTestBase.java (59%)
mode change 100755 => 100644
rename geode-junit/src/main/java/org/apache/geode/codeAnalysis/{AnalyzeSerializablesJUnitTestBase.java => AnalyzeSerializablesTestBase.java} (92%)
copy geode-management/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeManagementSerializablesIntegrationTest.java => geode-junit/src/main/java/org/apache/geode/codeAnalysis/AnalyzeSerializablesWithClassAnalysisRuleTestBase.java (63%)
rename geode-junit/src/main/resources/META-INF/services/{org.apache.geode.internal.serialization.SanctionedSerializablesService => org.apache.geode.internal.serialization.filter.SanctionedSerializablesService} (100%)
rename geode-lucene/src/main/resources/META-INF/services/{org.apache.geode.internal.serialization.SanctionedSerializablesService => org.apache.geode.internal.serialization.filter.SanctionedSerializablesService} (100%)
rename geode-management/src/main/resources/META-INF/services/{org.apache.geode.internal.serialization.SanctionedSerializablesService => org.apache.geode.internal.serialization.filter.SanctionedSerializablesService} (100%)
rename geode-membership/src/main/resources/META-INF/services/{org.apache.geode.internal.serialization.SanctionedSerializablesService => org.apache.geode.internal.serialization.filter.SanctionedSerializablesService} (100%)
rename geode-memcached/src/main/resources/META-INF/services/{org.apache.geode.internal.serialization.SanctionedSerializablesService => org.apache.geode.internal.serialization.filter.SanctionedSerializablesService} (100%)
rename geode-redis/src/main/resources/META-INF/services/{org.apache.geode.internal.serialization.SanctionedSerializablesService => org.apache.geode.internal.serialization.filter.SanctionedSerializablesService} (100%)
copy geode-redis/src/test/resources/META-INF/services/{org.apache.geode.internal.serialization.SanctionedSerializablesService => org.apache.geode.internal.serialization.filter.SanctionedSerializablesService} (100%)
create mode 100644 geode-serialization/src/integrationTest/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterConfigurationWhenFilterIsAlreadySetIntegrationTest.java
create mode 100644 geode-serialization/src/integrationTest/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterConfigurationWhenObjectInputFilterNotFoundIntegrationTest.java
create mode 100644 geode-serialization/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiSetFilterBlankIntegrationTest.java
create mode 100644 geode-serialization/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiSetFilterIntegrationTest.java
create mode 100644 geode-serialization/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiSetFilterNullIntegrationTest.java
copy geode-wan/src/main/resources/org/apache/geode/internal/cache/wan/sanctioned-geode-wan-serializables.txt => geode-serialization/src/integrationTest/resources/org/apache/geode/codeAnalysis/excludedClasses.txt (100%)
mode change 100755 => 100644
copy geode-pulse/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzePulseSerializablesIntegrationTest.java => geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ApiPackage.java (59%)
copy geode-core/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeCoreSerializablesIntegrationTest.java => geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/FilterAlreadyConfiguredException.java (54%)
mode change 100755 => 100644
copy geode-core/src/main/java/org/apache/geode/management/internal/JmxRmiSerialFilter.java => geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/FilterConfiguration.java (72%)
copy geode-core/src/main/java/org/apache/geode/management/internal/ManagementAgentFactory.java => geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/FilterPattern.java (69%)
copy geode-core/src/main/java/org/apache/geode/management/internal/JmxRmiSerialFilter.java => geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilter.java (61%)
create mode 100644 geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterConfiguration.java
copy geode-core/src/main/java/org/apache/geode/management/internal/JmxRmiSerialFilter.java => geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterConfigurationFactory.java (63%)
copy geode-serialization/src/main/java/org/apache/geode/internal/serialization/{SanctionedSerializablesService.java => filter/GlobalSerialFilterFactory.java} (66%)
create mode 100644 geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/Java9ReflectiveObjectInputFilterApi.java
create mode 100644 geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/JmxSerialFilterConfiguration.java
copy geode-core/src/main/java/org/apache/geode/management/internal/JmxRmiSerialFilter.java => geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/JmxSerialFilterConfigurationFactory.java (70%)
copy geode-core/src/main/java/org/apache/geode/internal/EmptyInputStreamFilter.java => geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/NullStreamSerialFilter.java (77%)
create mode 100644 geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterApi.java
rename geode-core/src/main/java/org/apache/geode/management/internal/JmxRmiSerialFilter.java => geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterApiFactory.java (78%)
create mode 100644 geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterInvocationHandler.java
create mode 100644 geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterUtils.java
create mode 100644 geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/OpenMBeanFilterPattern.java
create mode 100644 geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilter.java
create mode 100644 geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilterFactory.java
create mode 100644 geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeStreamSerialFilter.java
create mode 100644 geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeStreamSerialFilterFactory.java
create mode 100644 geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApi.java
create mode 100644 geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiFactory.java
rename geode-serialization/src/main/java/org/apache/geode/internal/serialization/{ => filter}/SanctionedSerializables.java (60%)
create mode 100644 geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesFilterPattern.java
copy geode-serialization/src/main/java/org/apache/geode/internal/serialization/{ => filter}/SanctionedSerializablesService.java (84%)
rename geode-serialization/src/main/java/org/apache/geode/internal/serialization/{SanctionedSerializablesService.java => filter/SerializableObjectConfig.java} (63%)
copy geode-core/src/main/java/org/apache/geode/internal/InputStreamFilter.java => geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/StreamSerialFilter.java (58%)
rename geode-core/src/main/java/org/apache/geode/internal/InputStreamFilter.java => geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/StreamSerialFilterFactory.java (75%)
create mode 100644 geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SystemPropertyGlobalSerialFilterConfigurationFactory.java
create mode 100644 geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SystemPropertyJmxSerialFilterConfigurationFactory.java
copy geode-core/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeCoreSerializablesIntegrationTest.java => geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/UnableToSetSerialFilterException.java (56%)
mode change 100755 => 100644
rename geode-serialization/src/main/resources/META-INF/services/{org.apache.geode.internal.serialization.SanctionedSerializablesService => org.apache.geode.internal.serialization.filter.SanctionedSerializablesService} (100%)
rename geode-serialization/src/test/java/org/apache/geode/internal/serialization/{SerializationDependenciesJUnitTest.java => SerializationDependenciesTest.java} (72%)
create mode 100644 geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ApiPackageTest.java
create mode 100644 geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterConfigurationTest.java
create mode 100644 geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/JmxSerialFilterConfigurationFactoryTest.java
create mode 100644 geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/JmxSerialFilterConfigurationTest.java
rename geode-core/src/main/java/org/apache/geode/internal/EmptyInputStreamFilter.java => geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/NullObjectInputFilterTest.java (61%)
create mode 100644 geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterInvocationHandlerTest.java
create mode 100644 geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterUtilsTest.java
create mode 100644 geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/OpenMBeanFilterPatternTest.java
create mode 100644 geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilterFactoryTest.java
create mode 100644 geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilterTest.java
create mode 100644 geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeObjectInputFilterFactoryTest.java
create mode 100644 geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeObjectInputFilterTest.java
create mode 100644 geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiFactoryTest.java
create mode 100644 geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiTest.java
create mode 100644 geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesFilterPatternTest.java
create mode 100644 geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesTest.java
create mode 100644 geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SerialFilterAssertions.java
create mode 100644 geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SerializableObjectConfigTest.java
create mode 100644 geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SystemPropertyGlobalSerialFilterConfigurationFactoryTest.java
create mode 100644 geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SystemPropertyJmxSerialFilterConfigurationFactoryTest.java
rename geode-wan/src/integrationTest/java/org/apache/geode/{internal/cache/wan => cache/wan/internal}/WANSanctionedSerializablesServiceIntegrationTest.java (92%)
rename geode-wan/src/main/java/org/apache/geode/{internal/cache/wan => cache/wan/internal}/WANSanctionedSerializablesService.java (88%)
rename geode-wan/src/main/resources/META-INF/services/{org.apache.geode.internal.serialization.SanctionedSerializablesService => org.apache.geode.internal.serialization.filter.SanctionedSerializablesService} (92%)
rename geode-wan/src/main/resources/org/apache/geode/{internal/cache/wan => cache/wan/internal}/sanctioned-geode-wan-serializables.txt (100%)
rename geode-web-api/src/main/resources/META-INF/services/{org.apache.geode.internal.serialization.SanctionedSerializablesService => org.apache.geode.internal.serialization.filter.SanctionedSerializablesService} (100%)
[geode] 04/06: GEODE-9879: Extract SystemProperty to geode-common (#7177)
Posted by kl...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
klund pushed a commit to branch support/1.12
in repository https://gitbox.apache.org/repos/asf/geode.git
commit c374cb98e1255507a69b5e6f465789105560c2a7
Author: Kirk Lund <kl...@apache.org>
AuthorDate: Mon Dec 20 10:53:32 2021 -0800
GEODE-9879: Extract SystemProperty to geode-common (#7177)
Extract part of SystemPropertyHelper to geode-common for use in
modules that are upstream from geode-core.
Define new DEFAULT_PREFIX that maps to GEODE_PREFIX and use that
everywhere that GEODE_PREFIX was previously used.
* Inline prefix constants in SystemPropertyHelper
* Use static imports for system property prefixes.
* Split up large tests in SystemPropertyHelperTest.
* Fix JAXBService
(cherry picked from commit ebf8479fffb5775b1f45801aa9382c2dad7106e0)
---
geode-common/build.gradle | 5 +
.../apache/geode/internal/lang/SystemProperty.java | 118 +++++++++++++++++++++
.../geode/internal/lang/SystemPropertyTest.java | 82 +++++++-------
...okenSerializationConsistencyRegressionTest.java | 6 +-
...entDeserializationCopyOnReadRegressionTest.java | 7 +-
.../cache/PartitionedRegionSingleHopDUnitTest.java | 2 +-
.../RebalanceOperationComplexDistributedTest.java | 4 +-
.../cache/ha/HARQueueNewImplDUnitTest.java | 5 +-
.../ha/HARegionQueueExpiryRegressionTest.java | 5 +-
.../HARegionQueueThreadIdExpiryRegressionTest.java | 8 +-
.../sockets/RedundancyLevelPart1DUnitTest.java | 2 +-
.../internal/cache/ha/HARegionQueueJUnitTest.java | 4 +-
.../DefaultDiskDirsIntegrationTest.java | 4 +-
.../internal/cache/EntryEventSerialization.java | 2 +-
.../cache/eviction/EvictionListBuilder.java | 3 +-
.../cache/eviction/LRUListWithAsyncSorting.java | 5 +-
.../cache/eviction/LRUListWithSyncSorting.java | 3 +-
.../geode/internal/cache/ha/HARegionQueue.java | 2 +-
.../cache/persistence/DefaultDiskDirs.java | 2 +-
.../apache/geode/internal/config/JAXBService.java | 6 +-
.../geode/internal/lang/SystemPropertyHelper.java | 89 ++++++----------
.../internal/logging/CoreLoggingExecutors.java | 2 +-
.../geode/logging/internal/Configuration.java | 6 +-
.../logging/internal/LoggingProviderLoader.java | 5 +-
.../cache/EntryEventSerializationTest.java | 4 +-
.../cache/persistence/DefaultDiskDirsTest.java | 6 +-
.../PersistenceInitialImageAdvisorTest.java | 5 +-
.../internal/lang/SystemPropertyHelperTest.java | 101 ++++++++++--------
.../DistributedDiskDirRuleDistributedTest.java | 17 +--
.../junit/rules/DiskDirRuleIntegrationTest.java | 5 +-
.../test/dunit/rules/DistributedDiskDirRule.java | 16 +--
.../apache/geode/test/junit/rules/DiskDirRule.java | 14 +--
32 files changed, 340 insertions(+), 205 deletions(-)
diff --git a/geode-common/build.gradle b/geode-common/build.gradle
index 3ba882f..48b81e1 100755
--- a/geode-common/build.gradle
+++ b/geode-common/build.gradle
@@ -22,6 +22,11 @@ apply from: "${project.projectDir}/../gradle/publish-java.gradle"
dependencies {
compile(platform(project(':boms:geode-all-bom')))
compile('com.fasterxml.jackson.core:jackson-databind')
+
+ // test
+ testImplementation('com.github.stefanbirkner:system-rules') {
+ exclude module: 'junit-dep'
+ }
testCompile('junit:junit')
testImplementation('org.apache.commons:commons-lang3')
testCompile('org.assertj:assertj-core')
diff --git a/geode-common/src/main/java/org/apache/geode/internal/lang/SystemProperty.java b/geode-common/src/main/java/org/apache/geode/internal/lang/SystemProperty.java
new file mode 100644
index 0000000..2c433ef
--- /dev/null
+++ b/geode-common/src/main/java/org/apache/geode/internal/lang/SystemProperty.java
@@ -0,0 +1,118 @@
+/*
+ * 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.geode.internal.lang;
+
+import java.util.Optional;
+
+public class SystemProperty {
+
+ private static final String GEODE_PREFIX = "geode.";
+ public static final String GEMFIRE_PREFIX = "gemfire.";
+ public static final String DEFAULT_PREFIX = GEODE_PREFIX;
+
+ /**
+ * This method will try to look up "geode." and "gemfire." versions of the system property. It
+ * will check and prefer "geode." setting first, then try to check "gemfire." setting.
+ *
+ * @param name system property name set in Geode
+ * @return an Optional containing the Boolean value of the system property
+ */
+ public static Optional<Boolean> getProductBooleanProperty(String name) {
+ String property = getProperty(name);
+ return property != null ? Optional.of(Boolean.parseBoolean(property)) : Optional.empty();
+ }
+
+ /**
+ * This method will try to look up "geode." and "gemfire." versions of the system property. It
+ * will check and prefer "geode." setting first, then try to check "gemfire." setting.
+ *
+ * @param name system property name set in Geode
+ * @return an Optional containing the Integer value of the system property
+ */
+ public static Optional<Integer> getProductIntegerProperty(String name) {
+ Integer propertyValue = Integer.getInteger(DEFAULT_PREFIX + name);
+ if (propertyValue == null) {
+ propertyValue = Integer.getInteger(GEMFIRE_PREFIX + name);
+ }
+
+ if (propertyValue != null) {
+ return Optional.of(propertyValue);
+ }
+ return Optional.empty();
+ }
+
+ /**
+ * This method will try to look up "geode." and "gemfire." versions of the system property. It
+ * will check and prefer "geode." setting first, then try to check "gemfire." setting.
+ *
+ * @param name system property name set in Geode
+ * @return the integer value of the system property if exits or the default value
+ */
+ public static Integer getProductIntegerProperty(String name, int defaultValue) {
+ return getProductIntegerProperty(name).orElse(defaultValue);
+ }
+
+ /**
+ * This method will try to look up "geode." and "gemfire." versions of the system property. It
+ * will check and prefer "geode." setting first, then try to check "gemfire." setting.
+ *
+ * @param name system property name set in Geode
+ * @return an Optional containing the Long value of the system property
+ */
+ public static Optional<Long> getProductLongProperty(String name) {
+ Long propertyValue = Long.getLong(DEFAULT_PREFIX + name);
+ if (propertyValue == null) {
+ propertyValue = Long.getLong(GEMFIRE_PREFIX + name);
+ }
+
+ if (propertyValue != null) {
+ return Optional.of(propertyValue);
+ }
+ return Optional.empty();
+ }
+
+ public static Long getProductLongProperty(String name, long defaultValue) {
+ return getProductLongProperty(name).orElse(defaultValue);
+ }
+
+ /**
+ * This method will try to look up "geode." and "gemfire." versions of the system property. It
+ * will check and prefer "geode." setting first, then try to check "gemfire." setting.
+ *
+ * @param name system property name set in Geode
+ * @return an Optional containing the String value of the system property
+ */
+ public static Optional<String> getProductStringProperty(String name) {
+ String property = getProperty(name);
+ return property != null ? Optional.of(property) : Optional.empty();
+ }
+
+ public static String getProperty(String name) {
+ String property = getGeodeProperty(name);
+ return property != null ? property : getGemfireProperty(name);
+ }
+
+ private static String getGeodeProperty(String name) {
+ return System.getProperty(DEFAULT_PREFIX + name);
+ }
+
+ private static String getGemfireProperty(String name) {
+ return System.getProperty(GEMFIRE_PREFIX + name);
+ }
+
+ private SystemProperty() {
+ // do not instantiate
+ }
+}
diff --git a/geode-core/src/test/java/org/apache/geode/internal/lang/SystemPropertyHelperTest.java b/geode-common/src/test/java/org/apache/geode/internal/lang/SystemPropertyTest.java
similarity index 50%
copy from geode-core/src/test/java/org/apache/geode/internal/lang/SystemPropertyHelperTest.java
copy to geode-common/src/test/java/org/apache/geode/internal/lang/SystemPropertyTest.java
index 5193003..eb319ab 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/lang/SystemPropertyHelperTest.java
+++ b/geode-common/src/test/java/org/apache/geode/internal/lang/SystemPropertyTest.java
@@ -14,74 +14,75 @@
*/
package org.apache.geode.internal.lang;
+import static org.apache.geode.internal.lang.SystemProperty.getProductBooleanProperty;
+import static org.apache.geode.internal.lang.SystemProperty.getProductIntegerProperty;
+import static org.apache.geode.internal.lang.SystemProperty.getProductLongProperty;
import static org.assertj.core.api.Assertions.assertThat;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.contrib.java.lang.system.RestoreSystemProperties;
+public class SystemPropertyTest {
-public class SystemPropertyHelperTest {
- private String restoreSetOperationTransactionBehavior = "restoreSetOperationTransactionBehavior";
+ @Rule
+ public RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties();
@Test
- public void testRestoreSetOperationTransactionBehaviorDefaultToFalse() {
- assertThat(SystemPropertyHelper.restoreSetOperationTransactionBehavior()).isFalse();
+ public void getIntegerPropertyPrefersGeodePrefix() {
+ String testProperty = "testIntegerProperty";
+ String gemfirePrefixProperty = "gemfire." + testProperty;
+ String geodePrefixProperty = "geode." + testProperty;
+ System.setProperty(geodePrefixProperty, "1");
+ System.setProperty(gemfirePrefixProperty, "0");
+
+ assertThat(getProductIntegerProperty(testProperty).get()).isEqualTo(1);
}
@Test
- public void testRestoreSetOperationTransactionBehaviorSystemProperty() {
- String gemfirePrefixProperty = "gemfire." + restoreSetOperationTransactionBehavior;
- System.setProperty(gemfirePrefixProperty, "true");
- assertThat(SystemPropertyHelper.restoreSetOperationTransactionBehavior()).isTrue();
- System.clearProperty(gemfirePrefixProperty);
+ public void getIntegerPropertyReturnsGemfirePrefixIfGeodeMissing() {
+ String testProperty = "testIntegerProperty";
+ String gemfirePrefixProperty = "gemfire." + testProperty;
+ System.setProperty(gemfirePrefixProperty, "1");
- String geodePrefixProperty = "geode." + restoreSetOperationTransactionBehavior;
- System.setProperty(geodePrefixProperty, "true");
- assertThat(SystemPropertyHelper.restoreSetOperationTransactionBehavior()).isTrue();
- System.clearProperty(geodePrefixProperty);
+ assertThat(getProductIntegerProperty(testProperty).get()).isEqualTo(1);
}
@Test
- public void testRestoreSetOperationTransactionBehaviorGeodePreference() {
- String gemfirePrefixProperty = "gemfire." + restoreSetOperationTransactionBehavior;
- String geodePrefixProperty = "geode." + restoreSetOperationTransactionBehavior;
- System.setProperty(geodePrefixProperty, "false");
- System.setProperty(gemfirePrefixProperty, "true");
- assertThat(SystemPropertyHelper.restoreSetOperationTransactionBehavior()).isFalse();
- System.clearProperty(geodePrefixProperty);
- System.clearProperty(gemfirePrefixProperty);
+ public void getIntegerPropertyWithDefaultValue() {
+ String testProperty = "testIntegerProperty";
+
+ assertThat(getProductIntegerProperty(testProperty, 1000)).isEqualTo(1000);
}
@Test
- public void getIntegerPropertyPrefersGeodePrefix() {
- String testProperty = "testIntegerProperty";
+ public void getLongPropertyWithoutDefaultReturnsGemfirePrefixIfGeodeMissing() {
+ String testProperty = "testLongProperty";
String gemfirePrefixProperty = "gemfire." + testProperty;
- String geodePrefixProperty = "geode." + testProperty;
- System.setProperty(geodePrefixProperty, "1");
- System.setProperty(gemfirePrefixProperty, "0");
- assertThat(SystemPropertyHelper.getProductIntegerProperty(testProperty).get()).isEqualTo(1);
- System.clearProperty(geodePrefixProperty);
- System.clearProperty(gemfirePrefixProperty);
+ System.setProperty(gemfirePrefixProperty, "1");
+
+ assertThat(getProductLongProperty(testProperty).get()).isEqualTo(1);
}
@Test
- public void getIntegerPropertyReturnsGemfirePrefixIfGeodeMissing() {
+ public void getLongPropertyWithDefaultValue() {
String testProperty = "testIntegerProperty";
- String gemfirePrefixProperty = "gemfire." + testProperty;
- System.setProperty(gemfirePrefixProperty, "1");
- assertThat(SystemPropertyHelper.getProductIntegerProperty(testProperty).get()).isEqualTo(1);
- System.clearProperty(gemfirePrefixProperty);
+
+ assertThat(getProductLongProperty(testProperty, 1000)).isEqualTo(1000);
}
@Test
public void getIntegerPropertyReturnsEmptyOptionalIfPropertiesMissing() {
String testProperty = "notSetProperty";
- assertThat(SystemPropertyHelper.getProductIntegerProperty(testProperty).isPresent()).isFalse();
+
+ assertThat(getProductIntegerProperty(testProperty).isPresent()).isFalse();
}
@Test
public void getBooleanPropertyReturnsEmptyOptionalIfProperiesMissing() {
String testProperty = "notSetProperty";
- assertThat(SystemPropertyHelper.getProductBooleanProperty(testProperty).isPresent()).isFalse();
+
+ assertThat(getProductBooleanProperty(testProperty).isPresent()).isFalse();
}
@Test
@@ -91,9 +92,8 @@ public class SystemPropertyHelperTest {
String geodePrefixProperty = "geode." + testProperty;
System.setProperty(geodePrefixProperty, "true");
System.setProperty(gemfirePrefixProperty, "false");
- assertThat(SystemPropertyHelper.getProductBooleanProperty(testProperty).get()).isTrue();
- System.clearProperty(geodePrefixProperty);
- System.clearProperty(gemfirePrefixProperty);
+
+ assertThat(getProductBooleanProperty(testProperty).get()).isTrue();
}
@Test
@@ -101,7 +101,7 @@ public class SystemPropertyHelperTest {
String testProperty = "testBooleanProperty";
String gemfirePrefixProperty = "gemfire." + testProperty;
System.setProperty(gemfirePrefixProperty, "true");
- assertThat(SystemPropertyHelper.getProductBooleanProperty(testProperty).get()).isTrue();
- System.clearProperty(gemfirePrefixProperty);
+
+ assertThat(getProductBooleanProperty(testProperty).get()).isTrue();
}
}
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/BrokenSerializationConsistencyRegressionTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/BrokenSerializationConsistencyRegressionTest.java
index be39bbd..48c3ee8 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/BrokenSerializationConsistencyRegressionTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/BrokenSerializationConsistencyRegressionTest.java
@@ -16,7 +16,6 @@ package org.apache.geode.internal.cache;
import static org.apache.geode.cache.RegionShortcut.REPLICATE;
import static org.apache.geode.internal.lang.SystemPropertyHelper.EARLY_ENTRY_EVENT_SERIALIZATION;
-import static org.apache.geode.internal.lang.SystemPropertyHelper.GEODE_PREFIX;
import static org.apache.geode.test.dunit.VM.getVM;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.catchThrowable;
@@ -35,6 +34,7 @@ import org.apache.geode.DataSerializable;
import org.apache.geode.ToDataException;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.RegionFactory;
+import org.apache.geode.internal.lang.SystemProperty;
import org.apache.geode.pdx.PdxReader;
import org.apache.geode.pdx.PdxSerializable;
import org.apache.geode.pdx.PdxWriter;
@@ -67,11 +67,11 @@ public class BrokenSerializationConsistencyRegressionTest implements Serializabl
public void setUpAll() {
vm0 = getVM(0);
- System.setProperty(GEODE_PREFIX + EARLY_ENTRY_EVENT_SERIALIZATION, "true");
+ System.setProperty(SystemProperty.DEFAULT_PREFIX + EARLY_ENTRY_EVENT_SERIALIZATION, "true");
createReplicateRegions();
vm0.invoke(() -> {
- System.setProperty(GEODE_PREFIX + EARLY_ENTRY_EVENT_SERIALIZATION, "true");
+ System.setProperty(SystemProperty.DEFAULT_PREFIX + EARLY_ENTRY_EVENT_SERIALIZATION, "true");
createReplicateRegions();
});
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ClientDeserializationCopyOnReadRegressionTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ClientDeserializationCopyOnReadRegressionTest.java
index 5b1d5ef..a43c696 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ClientDeserializationCopyOnReadRegressionTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ClientDeserializationCopyOnReadRegressionTest.java
@@ -16,7 +16,6 @@ package org.apache.geode.internal.cache;
import static org.apache.geode.distributed.ConfigurationProperties.DELTA_PROPAGATION;
import static org.apache.geode.internal.lang.SystemPropertyHelper.EARLY_ENTRY_EVENT_SERIALIZATION;
-import static org.apache.geode.internal.lang.SystemPropertyHelper.GEODE_PREFIX;
import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
@@ -52,6 +51,7 @@ import org.apache.geode.internal.cache.ha.HARegionQueue;
import org.apache.geode.internal.cache.tier.sockets.CacheClientProxy;
import org.apache.geode.internal.cache.tier.sockets.ClientProxyMembershipID;
import org.apache.geode.internal.cache.tier.sockets.ClientUpdateMessageImpl;
+import org.apache.geode.internal.lang.SystemProperty;
import org.apache.geode.test.dunit.Invoke;
import org.apache.geode.test.dunit.NetworkUtils;
import org.apache.geode.test.dunit.VM;
@@ -113,9 +113,10 @@ public class ClientDeserializationCopyOnReadRegressionTest extends ClientServerT
@Test
public void testCopyOnReadWithBridgeServer() {
- System.setProperty(GEODE_PREFIX + EARLY_ENTRY_EVENT_SERIALIZATION, "true");
+ System.setProperty(SystemProperty.DEFAULT_PREFIX + EARLY_ENTRY_EVENT_SERIALIZATION, "true");
Invoke.invokeInEveryVM(
- () -> System.setProperty(GEODE_PREFIX + EARLY_ENTRY_EVENT_SERIALIZATION, "true"));
+ () -> System.setProperty(SystemProperty.DEFAULT_PREFIX + EARLY_ENTRY_EVENT_SERIALIZATION,
+ "true"));
createBridgeServer(server, rName, ports[0]);
// Put an instance of SerializationCounter to assert copy-on-read behavior
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionSingleHopDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionSingleHopDUnitTest.java
index 0641897..eb55f54 100755
--- a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionSingleHopDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/PartitionedRegionSingleHopDUnitTest.java
@@ -18,7 +18,7 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static org.apache.geode.distributed.ConfigurationProperties.ENABLE_CLUSTER_CONFIGURATION;
import static org.apache.geode.distributed.ConfigurationProperties.LOCATORS;
import static org.apache.geode.distributed.ConfigurationProperties.MCAST_PORT;
-import static org.apache.geode.internal.lang.SystemPropertyHelper.GEMFIRE_PREFIX;
+import static org.apache.geode.internal.lang.SystemProperty.GEMFIRE_PREFIX;
import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
import static org.apache.geode.test.dunit.Disconnect.disconnectAllFromDS;
import static org.apache.geode.test.dunit.VM.getVM;
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/control/RebalanceOperationComplexDistributedTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/control/RebalanceOperationComplexDistributedTest.java
index c9da86a..c550312 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/control/RebalanceOperationComplexDistributedTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/control/RebalanceOperationComplexDistributedTest.java
@@ -17,7 +17,6 @@ package org.apache.geode.internal.cache.control;
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.apache.geode.distributed.ConfigurationProperties.REDUNDANCY_ZONE;
import static org.apache.geode.internal.lang.SystemPropertyHelper.DEFAULT_DISK_DIRS_PROPERTY;
-import static org.apache.geode.internal.lang.SystemPropertyHelper.GEODE_PREFIX;
import static org.assertj.core.api.Assertions.assertThat;
import java.io.File;
@@ -45,6 +44,7 @@ import org.apache.geode.cache.Region;
import org.apache.geode.cache.client.ClientCache;
import org.apache.geode.cache.control.ResourceManager;
import org.apache.geode.internal.cache.PartitionedRegion;
+import org.apache.geode.internal.lang.SystemProperty;
import org.apache.geode.logging.internal.log4j.api.LogService;
import org.apache.geode.test.awaitility.GeodeAwaitility;
import org.apache.geode.test.dunit.VM;
@@ -217,7 +217,7 @@ public class RebalanceOperationComplexDistributedTest implements Serializable {
if (!temporaryDirectory.exists()) {
Files.createDirectory(temporaryDirectory.toPath());
}
- System.setProperty(GEODE_PREFIX + DEFAULT_DISK_DIRS_PROPERTY, path);
+ System.setProperty(SystemProperty.DEFAULT_PREFIX + DEFAULT_DISK_DIRS_PROPERTY, path);
});
clusterStartupRule.startServerVM(index, s -> s.withProperty("cache-xml-file",
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ha/HARQueueNewImplDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ha/HARQueueNewImplDUnitTest.java
index 1768278..a605573 100755
--- a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ha/HARQueueNewImplDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ha/HARQueueNewImplDUnitTest.java
@@ -20,7 +20,7 @@ import static org.apache.geode.distributed.ConfigurationProperties.DELTA_PROPAGA
import static org.apache.geode.distributed.ConfigurationProperties.LOCATORS;
import static org.apache.geode.distributed.ConfigurationProperties.MCAST_PORT;
import static org.apache.geode.internal.cache.CacheServerImpl.generateNameForClientMsgsRegion;
-import static org.apache.geode.internal.lang.SystemPropertyHelper.GEMFIRE_PREFIX;
+import static org.apache.geode.internal.lang.SystemProperty.GEMFIRE_PREFIX;
import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
import static org.apache.geode.test.dunit.NetworkUtils.getServerHostName;
import static org.assertj.core.api.Assertions.assertThat;
@@ -209,8 +209,7 @@ public class HARQueueNewImplDUnitTest extends JUnit4DistributedTestCase {
public static void createClientCache(String host, Integer port1, Integer port2, String rLevel,
Boolean addListener) throws Exception {
- System.setProperty(GEMFIRE_PREFIX + "bridge.disableShufflingOfEndpoints",
- "true");
+ System.setProperty(GEMFIRE_PREFIX + "bridge.disableShufflingOfEndpoints", "true");
Properties props = new Properties();
props.setProperty(MCAST_PORT, "0");
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ha/HARegionQueueExpiryRegressionTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ha/HARegionQueueExpiryRegressionTest.java
index f524c38..917b5e3 100755
--- a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ha/HARegionQueueExpiryRegressionTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ha/HARegionQueueExpiryRegressionTest.java
@@ -18,7 +18,6 @@ import static org.apache.geode.cache30.ClientServerTestCase.configureConnectionP
import static org.apache.geode.distributed.ConfigurationProperties.LOCATORS;
import static org.apache.geode.distributed.ConfigurationProperties.MCAST_PORT;
import static org.apache.geode.internal.cache.tier.sockets.ConflationDUnitTestHelper.setIsSlowStart;
-import static org.apache.geode.internal.lang.SystemPropertyHelper.GEODE_PREFIX;
import static org.apache.geode.internal.lang.SystemPropertyHelper.HA_REGION_QUEUE_EXPIRY_TIME_PROPERTY;
import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
import static org.apache.geode.test.dunit.Host.getHost;
@@ -44,6 +43,7 @@ import org.apache.geode.cache.DataPolicy;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.Scope;
import org.apache.geode.cache.server.CacheServer;
+import org.apache.geode.internal.lang.SystemProperty;
import org.apache.geode.test.dunit.VM;
import org.apache.geode.test.dunit.cache.CacheTestCase;
import org.apache.geode.test.dunit.rules.DistributedRestoreSystemProperties;
@@ -129,7 +129,8 @@ public class HARegionQueueExpiryRegressionTest extends CacheTestCase {
}
private int createServerCache() throws IOException {
- System.setProperty(GEODE_PREFIX + HA_REGION_QUEUE_EXPIRY_TIME_PROPERTY, String.valueOf(1));
+ System.setProperty(SystemProperty.DEFAULT_PREFIX + HA_REGION_QUEUE_EXPIRY_TIME_PROPERTY,
+ String.valueOf(1));
System.setProperty("slowStartTimeForTesting", String.valueOf(DISPATCHER_SLOWSTART_TIME));
AttributesFactory factory = new AttributesFactory();
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ha/HARegionQueueThreadIdExpiryRegressionTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ha/HARegionQueueThreadIdExpiryRegressionTest.java
index 47b9d4d..90d7f99 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ha/HARegionQueueThreadIdExpiryRegressionTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ha/HARegionQueueThreadIdExpiryRegressionTest.java
@@ -16,7 +16,6 @@ package org.apache.geode.internal.cache.ha;
import static org.apache.geode.cache.RegionShortcut.REPLICATE;
import static org.apache.geode.cache.client.ClientRegionShortcut.CACHING_PROXY;
-import static org.apache.geode.internal.lang.SystemPropertyHelper.GEODE_PREFIX;
import static org.apache.geode.internal.lang.SystemPropertyHelper.HA_REGION_QUEUE_EXPIRY_TIME_PROPERTY;
import static org.apache.geode.internal.lang.SystemPropertyHelper.THREAD_ID_EXPIRY_TIME_PROPERTY;
import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
@@ -39,6 +38,7 @@ import org.apache.geode.cache.client.ClientRegionFactory;
import org.apache.geode.cache.server.CacheServer;
import org.apache.geode.internal.cache.tier.sockets.CacheClientNotifier;
import org.apache.geode.internal.cache.tier.sockets.CacheClientProxy;
+import org.apache.geode.internal.lang.SystemProperty;
import org.apache.geode.test.dunit.VM;
import org.apache.geode.test.dunit.rules.CacheRule;
import org.apache.geode.test.dunit.rules.ClientCacheRule;
@@ -110,8 +110,10 @@ public class HARegionQueueThreadIdExpiryRegressionTest implements Serializable {
}
private int createCacheServer() throws IOException {
- System.setProperty(GEODE_PREFIX + HA_REGION_QUEUE_EXPIRY_TIME_PROPERTY, EXPIRY_TIME_SECONDS);
- System.setProperty(GEODE_PREFIX + THREAD_ID_EXPIRY_TIME_PROPERTY, EXPIRY_TIME_SECONDS);
+ System.setProperty(SystemProperty.DEFAULT_PREFIX + HA_REGION_QUEUE_EXPIRY_TIME_PROPERTY,
+ EXPIRY_TIME_SECONDS);
+ System.setProperty(SystemProperty.DEFAULT_PREFIX + THREAD_ID_EXPIRY_TIME_PROPERTY,
+ EXPIRY_TIME_SECONDS);
cacheRule.createCache();
cacheRule.getCache().setMessageSyncInterval(MESSAGE_SYNC_INTERVAL_SECONDS);
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/tier/sockets/RedundancyLevelPart1DUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/tier/sockets/RedundancyLevelPart1DUnitTest.java
index 83c7a7c..9688586 100755
--- a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/tier/sockets/RedundancyLevelPart1DUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/tier/sockets/RedundancyLevelPart1DUnitTest.java
@@ -17,7 +17,7 @@ package org.apache.geode.internal.cache.tier.sockets;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static org.apache.geode.distributed.ConfigurationProperties.LOCATORS;
import static org.apache.geode.distributed.ConfigurationProperties.MCAST_PORT;
-import static org.apache.geode.internal.lang.SystemPropertyHelper.GEMFIRE_PREFIX;
+import static org.apache.geode.internal.lang.SystemProperty.GEMFIRE_PREFIX;
import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
import static org.apache.geode.test.dunit.Disconnect.disconnectAllFromDS;
import static org.apache.geode.test.dunit.VM.getController;
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/ha/HARegionQueueJUnitTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/ha/HARegionQueueJUnitTest.java
index 93b5716..9c3d98f 100755
--- a/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/ha/HARegionQueueJUnitTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/ha/HARegionQueueJUnitTest.java
@@ -15,7 +15,6 @@
package org.apache.geode.internal.cache.ha;
import static org.apache.geode.distributed.ConfigurationProperties.MCAST_PORT;
-import static org.apache.geode.internal.lang.SystemPropertyHelper.GEODE_PREFIX;
import static org.apache.geode.internal.lang.SystemPropertyHelper.HA_REGION_QUEUE_EXPIRY_TIME_PROPERTY;
import static org.apache.geode.internal.statistics.StatisticsClockFactory.disabledClock;
import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
@@ -80,6 +79,7 @@ import org.apache.geode.internal.cache.tier.sockets.CacheClientProxy;
import org.apache.geode.internal.cache.tier.sockets.ClientProxyMembershipID;
import org.apache.geode.internal.cache.tier.sockets.ClientUpdateMessageImpl;
import org.apache.geode.internal.cache.tier.sockets.HAEventWrapper;
+import org.apache.geode.internal.lang.SystemProperty;
import org.apache.geode.test.dunit.ThreadUtils;
import org.apache.geode.test.junit.categories.ClientSubscriptionTest;
@@ -1350,7 +1350,7 @@ public class HARegionQueueJUnitTest {
*/
@Test
public void testExpiryUsingSystemProperty() throws Exception {
- System.setProperty(GEODE_PREFIX + HA_REGION_QUEUE_EXPIRY_TIME_PROPERTY, "1");
+ System.setProperty(SystemProperty.DEFAULT_PREFIX + HA_REGION_QUEUE_EXPIRY_TIME_PROPERTY, "1");
HARegionQueueAttributes haa = new HARegionQueueAttributes();
HARegionQueue regionQueue = createHARegionQueue(testName.getMethodName(), haa);
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/persistence/DefaultDiskDirsIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/persistence/DefaultDiskDirsIntegrationTest.java
index c5201d8..4061769 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/persistence/DefaultDiskDirsIntegrationTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/persistence/DefaultDiskDirsIntegrationTest.java
@@ -18,7 +18,6 @@ package org.apache.geode.internal.cache.persistence;
import static org.apache.geode.internal.cache.persistence.DefaultDiskDirs.getDefaultDiskDirs;
import static org.apache.geode.internal.lang.SystemPropertyHelper.DEFAULT_DISK_DIRS_PROPERTY;
-import static org.apache.geode.internal.lang.SystemPropertyHelper.GEODE_PREFIX;
import static org.assertj.core.api.Assertions.assertThat;
import org.junit.Rule;
@@ -27,6 +26,7 @@ import org.junit.contrib.java.lang.system.RestoreSystemProperties;
import org.junit.experimental.categories.Category;
import org.junit.rules.TemporaryFolder;
+import org.apache.geode.internal.lang.SystemProperty;
import org.apache.geode.test.junit.categories.PersistenceTest;
@Category({PersistenceTest.class})
@@ -40,7 +40,7 @@ public class DefaultDiskDirsIntegrationTest {
@Test
public void getDefaultDiskDirsReturnsOverriddenValue() {
- System.setProperty(GEODE_PREFIX + DEFAULT_DISK_DIRS_PROPERTY,
+ System.setProperty(SystemProperty.DEFAULT_PREFIX + DEFAULT_DISK_DIRS_PROPERTY,
temporaryFolder.getRoot().getAbsolutePath());
assertThat(getDefaultDiskDirs()[0]).exists().isEqualTo(temporaryFolder.getRoot());
}
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/EntryEventSerialization.java b/geode-core/src/main/java/org/apache/geode/internal/cache/EntryEventSerialization.java
index a49f9cb..4c48be0 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/EntryEventSerialization.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/EntryEventSerialization.java
@@ -14,8 +14,8 @@
*/
package org.apache.geode.internal.cache;
+import static org.apache.geode.internal.lang.SystemProperty.getProductBooleanProperty;
import static org.apache.geode.internal.lang.SystemPropertyHelper.EARLY_ENTRY_EVENT_SERIALIZATION;
-import static org.apache.geode.internal.lang.SystemPropertyHelper.getProductBooleanProperty;
import java.io.IOException;
import java.io.UncheckedIOException;
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/eviction/EvictionListBuilder.java b/geode-core/src/main/java/org/apache/geode/internal/cache/eviction/EvictionListBuilder.java
index a2f0563..408aba4 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/eviction/EvictionListBuilder.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/eviction/EvictionListBuilder.java
@@ -16,6 +16,7 @@ package org.apache.geode.internal.cache.eviction;
import java.util.Optional;
+import org.apache.geode.internal.lang.SystemProperty;
import org.apache.geode.internal.lang.SystemPropertyHelper;
public class EvictionListBuilder {
@@ -27,7 +28,7 @@ public class EvictionListBuilder {
public EvictionListBuilder(EvictionController evictionController) {
this.controller = evictionController;
Optional<Boolean> asyncScan =
- SystemPropertyHelper.getProductBooleanProperty(SystemPropertyHelper.EVICTION_SCAN_ASYNC);
+ SystemProperty.getProductBooleanProperty(SystemPropertyHelper.EVICTION_SCAN_ASYNC);
evictionScanAsync = asyncScan.orElse(true);
}
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/eviction/LRUListWithAsyncSorting.java b/geode-core/src/main/java/org/apache/geode/internal/cache/eviction/LRUListWithAsyncSorting.java
index b2f935b..8dadc6f 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/eviction/LRUListWithAsyncSorting.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/eviction/LRUListWithAsyncSorting.java
@@ -27,6 +27,7 @@ import org.apache.geode.internal.cache.BucketRegion;
import org.apache.geode.internal.cache.RegionEntry;
import org.apache.geode.internal.cache.RegionEntryContext;
import org.apache.geode.internal.cache.versions.RegionVersionVector;
+import org.apache.geode.internal.lang.SystemProperty;
import org.apache.geode.internal.lang.SystemPropertyHelper;
import org.apache.geode.internal.logging.log4j.LogMarker;
import org.apache.geode.logging.internal.executors.LoggingExecutors;
@@ -47,7 +48,7 @@ public class LRUListWithAsyncSorting extends AbstractEvictionList {
private static final Logger logger = LogService.getLogger();
@Immutable
- private static final Optional<Integer> EVICTION_SCAN_MAX_THREADS = SystemPropertyHelper
+ private static final Optional<Integer> EVICTION_SCAN_MAX_THREADS = SystemProperty
.getProductIntegerProperty(SystemPropertyHelper.EVICTION_SCAN_MAX_THREADS);
@MakeNotStatic
@@ -87,7 +88,7 @@ public class LRUListWithAsyncSorting extends AbstractEvictionList {
}
private double calculateScanThreshold() {
- Optional<Integer> configuredThresholdPercent = SystemPropertyHelper
+ Optional<Integer> configuredThresholdPercent = SystemProperty
.getProductIntegerProperty(SystemPropertyHelper.EVICTION_SCAN_THRESHOLD_PERCENT);
int thresholdPercent =
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/eviction/LRUListWithSyncSorting.java b/geode-core/src/main/java/org/apache/geode/internal/cache/eviction/LRUListWithSyncSorting.java
index 0ff2777..3002822 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/eviction/LRUListWithSyncSorting.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/eviction/LRUListWithSyncSorting.java
@@ -19,6 +19,7 @@ import java.util.Optional;
import org.apache.logging.log4j.Logger;
+import org.apache.geode.internal.lang.SystemProperty;
import org.apache.geode.internal.lang.SystemPropertyHelper;
import org.apache.geode.internal.logging.log4j.LogMarker;
import org.apache.geode.logging.internal.log4j.api.LogService;
@@ -36,7 +37,7 @@ public class LRUListWithSyncSorting extends AbstractEvictionList {
private int readMaxEntriesProperty() {
int result = -1;
- Optional<Integer> optionalMaxEntries = SystemPropertyHelper
+ Optional<Integer> optionalMaxEntries = SystemProperty
.getProductIntegerProperty(SystemPropertyHelper.EVICTION_SEARCH_MAX_ENTRIES);
if (optionalMaxEntries.isPresent()) {
result = optionalMaxEntries.get();
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/ha/HARegionQueue.java b/geode-core/src/main/java/org/apache/geode/internal/cache/ha/HARegionQueue.java
index 593909f..5340ad4 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/ha/HARegionQueue.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/ha/HARegionQueue.java
@@ -14,9 +14,9 @@
*/
package org.apache.geode.internal.cache.ha;
+import static org.apache.geode.internal.lang.SystemProperty.getProductIntegerProperty;
import static org.apache.geode.internal.lang.SystemPropertyHelper.HA_REGION_QUEUE_EXPIRY_TIME_PROPERTY;
import static org.apache.geode.internal.lang.SystemPropertyHelper.THREAD_ID_EXPIRY_TIME_PROPERTY;
-import static org.apache.geode.internal.lang.SystemPropertyHelper.getProductIntegerProperty;
import java.io.DataInput;
import java.io.DataOutput;
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/persistence/DefaultDiskDirs.java b/geode-core/src/main/java/org/apache/geode/internal/cache/persistence/DefaultDiskDirs.java
index e7325f9..789cdb1 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/persistence/DefaultDiskDirs.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/persistence/DefaultDiskDirs.java
@@ -16,8 +16,8 @@
*/
package org.apache.geode.internal.cache.persistence;
+import static org.apache.geode.internal.lang.SystemProperty.getProductStringProperty;
import static org.apache.geode.internal.lang.SystemPropertyHelper.DEFAULT_DISK_DIRS_PROPERTY;
-import static org.apache.geode.internal.lang.SystemPropertyHelper.getProductStringProperty;
import java.io.File;
import java.util.Optional;
diff --git a/geode-core/src/main/java/org/apache/geode/internal/config/JAXBService.java b/geode-core/src/main/java/org/apache/geode/internal/config/JAXBService.java
index 562399d..f99fdae 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/config/JAXBService.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/config/JAXBService.java
@@ -16,6 +16,9 @@
*/
package org.apache.geode.internal.config;
+import static org.apache.geode.internal.lang.SystemProperty.getProperty;
+import static org.apache.geode.internal.lang.SystemPropertyHelper.PACKAGES_TO_SCAN;
+
import java.io.StringReader;
import java.io.StringWriter;
import java.net.URL;
@@ -42,7 +45,6 @@ import org.xml.sax.helpers.XMLReaderFactory;
import org.apache.geode.cache.configuration.XSDRootElement;
import org.apache.geode.internal.ClassPathLoader;
-import org.apache.geode.internal.lang.SystemPropertyHelper;
import org.apache.geode.management.internal.util.ClasspathScanLoadHelper;
public class JAXBService {
@@ -94,7 +96,7 @@ public class JAXBService {
static Set<String> getPackagesToScan() {
Set<String> packages = new HashSet<>();
- String sysProperty = SystemPropertyHelper.getProperty(SystemPropertyHelper.PACKAGES_TO_SCAN);
+ String sysProperty = getProperty(PACKAGES_TO_SCAN);
if (sysProperty != null) {
packages = Arrays.stream(sysProperty.split(",")).collect(Collectors.toSet());
} else {
diff --git a/geode-core/src/main/java/org/apache/geode/internal/lang/SystemPropertyHelper.java b/geode-core/src/main/java/org/apache/geode/internal/lang/SystemPropertyHelper.java
index 4b4685a..01bdb67 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/lang/SystemPropertyHelper.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/lang/SystemPropertyHelper.java
@@ -14,8 +14,9 @@
*/
package org.apache.geode.internal.lang;
-import java.util.Optional;
+import static org.apache.geode.internal.lang.SystemProperty.getProductBooleanProperty;
+import org.apache.geode.internal.cache.eviction.LRUListWithAsyncSorting;
/**
* The SystemPropertyHelper class is an helper class for accessing system properties used in geode.
@@ -25,12 +26,9 @@ import java.util.Optional;
*/
public class SystemPropertyHelper {
- public static final String GEODE_PREFIX = "geode.";
- public static final String GEMFIRE_PREFIX = "gemfire.";
-
/**
* When set to "true" enables asynchronous eviction algorithm (defaults to true). For more details
- * see {@link org.apache.geode.internal.cache.eviction.LRUListWithAsyncSorting}.
+ * see {@link LRUListWithAsyncSorting}.
*
* @since Geode 1.4.0
*/
@@ -39,7 +37,7 @@ public class SystemPropertyHelper {
/**
* This property allows the maximum number of threads used for asynchronous eviction scanning to
* be configured. It defaults to "Math.max((Runtime.getRuntime().availableProcessors() / 4), 1)".
- * For more details see {@link org.apache.geode.internal.cache.eviction.LRUListWithAsyncSorting}.
+ * For more details see {@link LRUListWithAsyncSorting}.
*
* @since Geode 1.4.0
*/
@@ -50,7 +48,7 @@ public class SystemPropertyHelper {
* started. If the number of entries that have been recently used since the previous scan divided
* by total number of entries exceeds the threshold then a scan is started. The default threshold
* is 25. If the threshold is less than 0 or greater than 100 then the default threshold is used.
- * For more details see {@link org.apache.geode.internal.cache.eviction.LRUListWithAsyncSorting}.
+ * For more details see {@link LRUListWithAsyncSorting}.
*
* @since Geode 1.4.0
*/
@@ -72,8 +70,22 @@ public class SystemPropertyHelper {
public static final String USE_HTTP_SYSTEM_PROPERTY = "useHTTP";
/**
+ * This property allows users to enable retrying when client application encounters
+ * PdxSerializationException. The default setting is false, and PdxSerializationException will not
+ * be retried. It will cause client application to throw ServerOperationException. When the
+ * property is set to true, the client application will automatically retry the operation to
+ * another server if encountered PdxSerializationException.
+ *
+ * @since Geode 1.15.0
+ */
+ public static final String ENABLE_QUERY_RETRY_ON_PDX_SERIALIZATION_EXCEPTION =
+ "enableQueryRetryOnPdxSerializationException";
+
+ /**
* a comma separated string to list out the packages to scan. If not specified, the entire
* classpath is scanned.
+ *
+ * <p>
* This is used by the FastPathScanner to scan for:
* 1. XSDRootElement annotation
*
@@ -82,69 +94,34 @@ public class SystemPropertyHelper {
public static final String PACKAGES_TO_SCAN = "packagesToScan";
/**
- * This method will try to look up "geode." and "gemfire." versions of the system property. It
- * will check and prefer "geode." setting first, then try to check "gemfire." setting.
- *
- * @param name system property name set in Geode
- * @return an Optional containing the Boolean value of the system property
+ * This property turns on/off parallel disk store recovery during cluster restart.
+ * By default, the value is True, which allows parallel disk store recovery by multiple threads.
*/
- public static Optional<Boolean> getProductBooleanProperty(String name) {
- String property = getProperty(name);
- return property != null ? Optional.of(Boolean.parseBoolean(property)) : Optional.empty();
- }
+ public static final String PARALLEL_DISK_STORE_RECOVERY = "parallelDiskStoreRecovery";
/**
- * This method will try to look up "geode." and "gemfire." versions of the system property. It
- * will check and prefer "geode." setting first, then try to check "gemfire." setting.
- *
- * @param name system property name set in Geode
- * @return an Optional containing the Integer value of the system property
+ * Milliseconds to wait before retrying to get events for a transaction from the
+ * gateway sender queue when group-transaction-events is true.
*/
- public static Optional<Integer> getProductIntegerProperty(String name) {
- Integer propertyValue = Integer.getInteger(GEODE_PREFIX + name);
- if (propertyValue == null) {
- propertyValue = Integer.getInteger(GEMFIRE_PREFIX + name);
- }
-
- if (propertyValue != null) {
- return Optional.of(propertyValue);
- } else {
- return Optional.empty();
- }
- }
+ public static final String GET_TRANSACTION_EVENTS_FROM_QUEUE_WAIT_TIME_MS =
+ "get-transaction-events-from-queue-wait-time-ms";
/**
- * This method will try to look up "geode." and "gemfire." versions of the system property. It
- * will check and prefer "geode." setting first, then try to check "gemfire." setting.
- *
- * @param name system property name set in Geode
- * @return an Optional containing the String value of the system property
+ * Milliseconds to wait for the client to re-authenticate back before unregister this client
+ * proxy. If client re-authenticate back successfully within this period, messages will continue
+ * to be delivered to the client
*/
- public static Optional<String> getProductStringProperty(String name) {
- String property = getProperty(name);
- return property != null ? Optional.of(property) : Optional.empty();
- }
-
- public static String getProperty(String name) {
- String property = getGeodeProperty(name);
- return property != null ? property : getGemfireProperty(name);
- }
-
- private static String getGeodeProperty(String name) {
- return System.getProperty(GEODE_PREFIX + name);
- }
-
- private static String getGemfireProperty(String name) {
- return System.getProperty(GEMFIRE_PREFIX + name);
- }
+ public static final String RE_AUTHENTICATE_WAIT_TIME = "reauthenticate.wait.time";
/**
* As of Geode 1.4.0, a region set operation will be in a transaction even if it is the first
* operation in the transaction.
*
+ * <p>
* In previous releases, a region set operation is not in a transaction if it is the first
* operation of the transaction.
*
+ * <p>
* Setting this system property to true will restore the previous behavior.
*
* @since Geode 1.4.0
@@ -157,6 +134,7 @@ public class SystemPropertyHelper {
* As of Geode 1.4.0, idle expiration on a replicate or partitioned region will now do a
* distributed check for a more recent last access time on one of the other copies of the region.
*
+ * <p>
* This system property can be set to true to turn off this new check and restore the previous
* behavior of only using the local last access time as the basis for expiration.
*
@@ -165,4 +143,5 @@ public class SystemPropertyHelper {
public static boolean restoreIdleExpirationBehavior() {
return getProductBooleanProperty("restoreIdleExpirationBehavior").orElse(false);
}
+
}
diff --git a/geode-core/src/main/java/org/apache/geode/internal/logging/CoreLoggingExecutors.java b/geode-core/src/main/java/org/apache/geode/internal/logging/CoreLoggingExecutors.java
index 70ceea6..81d2efa 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/logging/CoreLoggingExecutors.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/logging/CoreLoggingExecutors.java
@@ -16,7 +16,7 @@ package org.apache.geode.internal.logging;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static java.util.concurrent.TimeUnit.SECONDS;
-import static org.apache.geode.internal.lang.SystemPropertyHelper.GEMFIRE_PREFIX;
+import static org.apache.geode.internal.lang.SystemProperty.GEMFIRE_PREFIX;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
diff --git a/geode-core/src/main/java/org/apache/geode/logging/internal/Configuration.java b/geode-core/src/main/java/org/apache/geode/logging/internal/Configuration.java
index 2f6d2df..1074067 100644
--- a/geode-core/src/main/java/org/apache/geode/logging/internal/Configuration.java
+++ b/geode-core/src/main/java/org/apache/geode/logging/internal/Configuration.java
@@ -14,11 +14,11 @@
*/
package org.apache.geode.logging.internal;
-import static org.apache.geode.internal.lang.SystemPropertyHelper.GEODE_PREFIX;
import static org.apache.geode.logging.internal.spi.LogLevelUpdateOccurs.ONLY_WHEN_USING_DEFAULT_CONFIG;
import static org.apache.geode.logging.internal.spi.LogLevelUpdateScope.GEODE_LOGGERS;
import org.apache.geode.annotations.VisibleForTesting;
+import org.apache.geode.internal.lang.SystemProperty;
import org.apache.geode.logging.internal.spi.LogConfig;
import org.apache.geode.logging.internal.spi.LogConfigListener;
import org.apache.geode.logging.internal.spi.LogConfigSupplier;
@@ -52,13 +52,13 @@ public class Configuration implements LogConfigListener {
* System property that may be used to override which {@code LogLevelUpdateOccurs} to use.
*/
public static final String LOG_LEVEL_UPDATE_OCCURS_PROPERTY =
- GEODE_PREFIX + "LOG_LEVEL_UPDATE_OCCURS";
+ SystemProperty.DEFAULT_PREFIX + "LOG_LEVEL_UPDATE_OCCURS";
/**
* System property that may be used to override which {@code LogLevelUpdateScope} to use.
*/
static final String LOG_LEVEL_UPDATE_SCOPE_PROPERTY =
- GEODE_PREFIX + "LOG_LEVEL_UPDATE_SCOPE";
+ SystemProperty.DEFAULT_PREFIX + "LOG_LEVEL_UPDATE_SCOPE";
private final LogLevelUpdateOccurs logLevelUpdateOccurs;
private final LogLevelUpdateScope logLevelUpdateScope;
diff --git a/geode-core/src/main/java/org/apache/geode/logging/internal/LoggingProviderLoader.java b/geode-core/src/main/java/org/apache/geode/logging/internal/LoggingProviderLoader.java
index ebf6228..8505a37 100644
--- a/geode-core/src/main/java/org/apache/geode/logging/internal/LoggingProviderLoader.java
+++ b/geode-core/src/main/java/org/apache/geode/logging/internal/LoggingProviderLoader.java
@@ -14,8 +14,6 @@
*/
package org.apache.geode.logging.internal;
-import static org.apache.geode.internal.lang.SystemPropertyHelper.GEODE_PREFIX;
-
import java.util.Collection;
import java.util.SortedMap;
import java.util.TreeMap;
@@ -25,6 +23,7 @@ import org.apache.logging.log4j.Logger;
import org.apache.geode.annotations.VisibleForTesting;
import org.apache.geode.internal.ClassPathLoader;
+import org.apache.geode.internal.lang.SystemProperty;
import org.apache.geode.internal.util.CollectingServiceLoader;
import org.apache.geode.internal.util.ListCollectingServiceLoader;
import org.apache.geode.logging.internal.spi.LoggingProvider;
@@ -47,7 +46,7 @@ public class LoggingProviderLoader {
*/
@VisibleForTesting
public static final String LOGGING_PROVIDER_NAME_PROPERTY =
- GEODE_PREFIX + "LOGGING_PROVIDER_NAME";
+ SystemProperty.DEFAULT_PREFIX + "LOGGING_PROVIDER_NAME";
public LoggingProvider load() {
// 1: use LOGGING_PROVIDER_NAME_PROPERTY if set
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/EntryEventSerializationTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/EntryEventSerializationTest.java
index c6a441d..2700c02 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/EntryEventSerializationTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/EntryEventSerializationTest.java
@@ -15,7 +15,6 @@
package org.apache.geode.internal.cache;
import static org.apache.geode.internal.lang.SystemPropertyHelper.EARLY_ENTRY_EVENT_SERIALIZATION;
-import static org.apache.geode.internal.lang.SystemPropertyHelper.GEODE_PREFIX;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatCode;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
@@ -36,6 +35,7 @@ import org.mockito.ArgumentCaptor;
import org.apache.geode.SerializationException;
import org.apache.geode.cache.Scope;
+import org.apache.geode.internal.lang.SystemProperty;
import org.apache.geode.pdx.internal.PdxInstanceImpl;
public class EntryEventSerializationTest {
@@ -50,7 +50,7 @@ public class EntryEventSerializationTest {
@Before
public void setUp() {
- System.setProperty(GEODE_PREFIX + EARLY_ENTRY_EVENT_SERIALIZATION, "true");
+ System.setProperty(SystemProperty.DEFAULT_PREFIX + EARLY_ENTRY_EVENT_SERIALIZATION, "true");
region = mock(InternalRegion.class);
event = mock(InternalEntryEvent.class);
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/persistence/DefaultDiskDirsTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/persistence/DefaultDiskDirsTest.java
index 8a77133..1a69c79 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/persistence/DefaultDiskDirsTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/persistence/DefaultDiskDirsTest.java
@@ -18,7 +18,6 @@ package org.apache.geode.internal.cache.persistence;
import static org.apache.geode.internal.cache.persistence.DefaultDiskDirs.getDefaultDiskDirs;
import static org.apache.geode.internal.lang.SystemPropertyHelper.DEFAULT_DISK_DIRS_PROPERTY;
-import static org.apache.geode.internal.lang.SystemPropertyHelper.GEODE_PREFIX;
import static org.assertj.core.api.Assertions.assertThat;
import java.io.File;
@@ -27,6 +26,8 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.contrib.java.lang.system.RestoreSystemProperties;
+import org.apache.geode.internal.lang.SystemProperty;
+
public class DefaultDiskDirsTest {
@@ -40,7 +41,8 @@ public class DefaultDiskDirsTest {
@Test
public void getDefaultDiskDirsReturnsOverriddenValue() {
- System.setProperty(GEODE_PREFIX + DEFAULT_DISK_DIRS_PROPERTY, "/FullyQualifiedPath");
+ System.setProperty(SystemProperty.DEFAULT_PREFIX + DEFAULT_DISK_DIRS_PROPERTY,
+ "/FullyQualifiedPath");
assertThat(getDefaultDiskDirs()).isEqualTo(new File[] {new File("/FullyQualifiedPath")});
}
}
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/persistence/PersistenceInitialImageAdvisorTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/persistence/PersistenceInitialImageAdvisorTest.java
index 66f1004..d811cdd 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/persistence/PersistenceInitialImageAdvisorTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/persistence/PersistenceInitialImageAdvisorTest.java
@@ -20,7 +20,6 @@ import static java.util.Collections.emptySet;
import static java.util.stream.Collectors.toCollection;
import static java.util.stream.Collectors.toSet;
import static org.apache.geode.internal.cache.persistence.MembershipChangeListenerFactory.cancelCondition;
-import static org.apache.geode.internal.lang.SystemPropertyHelper.GEODE_PREFIX;
import static org.apache.geode.internal.lang.SystemPropertyHelper.PERSISTENT_VIEW_RETRY_TIMEOUT_SECONDS;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.catchThrowable;
@@ -58,6 +57,7 @@ import org.apache.geode.distributed.internal.ReplyException;
import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
import org.apache.geode.internal.cache.CacheDistributionAdvisor;
import org.apache.geode.internal.cache.CacheDistributionAdvisor.InitialImageAdvice;
+import org.apache.geode.internal.lang.SystemProperty;
public class PersistenceInitialImageAdvisorTest {
@@ -73,7 +73,8 @@ public class PersistenceInitialImageAdvisorTest {
@Before
public void setUp() {
- System.setProperty(GEODE_PREFIX + PERSISTENT_VIEW_RETRY_TIMEOUT_SECONDS, String.valueOf(15));
+ System.setProperty(SystemProperty.DEFAULT_PREFIX + PERSISTENT_VIEW_RETRY_TIMEOUT_SECONDS,
+ String.valueOf(15));
persistenceAdvisor = mock(InternalPersistenceAdvisor.class);
cacheDistributionAdvisor = mock(CacheDistributionAdvisor.class, RETURNS_DEEP_STUBS);
diff --git a/geode-core/src/test/java/org/apache/geode/internal/lang/SystemPropertyHelperTest.java b/geode-core/src/test/java/org/apache/geode/internal/lang/SystemPropertyHelperTest.java
index 5193003..f1f61d9 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/lang/SystemPropertyHelperTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/lang/SystemPropertyHelperTest.java
@@ -14,94 +14,105 @@
*/
package org.apache.geode.internal.lang;
+import static org.apache.geode.internal.lang.SystemProperty.DEFAULT_PREFIX;
+import static org.apache.geode.internal.lang.SystemProperty.GEMFIRE_PREFIX;
+import static org.apache.geode.internal.lang.SystemProperty.getProductBooleanProperty;
+import static org.apache.geode.internal.lang.SystemPropertyHelper.PARALLEL_DISK_STORE_RECOVERY;
+import static org.apache.geode.internal.lang.SystemPropertyHelper.restoreSetOperationTransactionBehavior;
import static org.assertj.core.api.Assertions.assertThat;
+import org.junit.Rule;
import org.junit.Test;
-
+import org.junit.contrib.java.lang.system.RestoreSystemProperties;
public class SystemPropertyHelperTest {
- private String restoreSetOperationTransactionBehavior = "restoreSetOperationTransactionBehavior";
+
+ private final String restoreSetOperationTransactionBehavior =
+ "restoreSetOperationTransactionBehavior";
+
+ @Rule
+ public RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties();
@Test
public void testRestoreSetOperationTransactionBehaviorDefaultToFalse() {
- assertThat(SystemPropertyHelper.restoreSetOperationTransactionBehavior()).isFalse();
+ assertThat(restoreSetOperationTransactionBehavior()).isFalse();
}
@Test
- public void testRestoreSetOperationTransactionBehaviorSystemProperty() {
+ public void testRestoreSetOperationTransactionBehaviorGemfireSystemProperty() {
String gemfirePrefixProperty = "gemfire." + restoreSetOperationTransactionBehavior;
System.setProperty(gemfirePrefixProperty, "true");
- assertThat(SystemPropertyHelper.restoreSetOperationTransactionBehavior()).isTrue();
- System.clearProperty(gemfirePrefixProperty);
+ assertThat(restoreSetOperationTransactionBehavior()).isTrue();
+ }
+ @Test
+ public void testRestoreSetOperationTransactionBehaviorGeodeSystemProperty() {
String geodePrefixProperty = "geode." + restoreSetOperationTransactionBehavior;
System.setProperty(geodePrefixProperty, "true");
- assertThat(SystemPropertyHelper.restoreSetOperationTransactionBehavior()).isTrue();
- System.clearProperty(geodePrefixProperty);
+ assertThat(restoreSetOperationTransactionBehavior()).isTrue();
}
@Test
public void testRestoreSetOperationTransactionBehaviorGeodePreference() {
String gemfirePrefixProperty = "gemfire." + restoreSetOperationTransactionBehavior;
String geodePrefixProperty = "geode." + restoreSetOperationTransactionBehavior;
+
System.setProperty(geodePrefixProperty, "false");
System.setProperty(gemfirePrefixProperty, "true");
- assertThat(SystemPropertyHelper.restoreSetOperationTransactionBehavior()).isFalse();
- System.clearProperty(geodePrefixProperty);
- System.clearProperty(gemfirePrefixProperty);
+
+ assertThat(restoreSetOperationTransactionBehavior()).isFalse();
}
@Test
- public void getIntegerPropertyPrefersGeodePrefix() {
- String testProperty = "testIntegerProperty";
+ public void getBooleanPropertyReturnsEnableRetryOnPdxSerializationException() {
+ String testProperty = "enableQueryRetryOnPdxSerializationException";
String gemfirePrefixProperty = "gemfire." + testProperty;
- String geodePrefixProperty = "geode." + testProperty;
- System.setProperty(geodePrefixProperty, "1");
- System.setProperty(gemfirePrefixProperty, "0");
- assertThat(SystemPropertyHelper.getProductIntegerProperty(testProperty).get()).isEqualTo(1);
- System.clearProperty(geodePrefixProperty);
+
+ System.setProperty(gemfirePrefixProperty, "true");
+ assertThat(getProductBooleanProperty(testProperty).get()).isTrue();
+
System.clearProperty(gemfirePrefixProperty);
+ assertThat(getProductBooleanProperty(testProperty).orElse(false)).isFalse();
}
@Test
- public void getIntegerPropertyReturnsGemfirePrefixIfGeodeMissing() {
- String testProperty = "testIntegerProperty";
- String gemfirePrefixProperty = "gemfire." + testProperty;
- System.setProperty(gemfirePrefixProperty, "1");
- assertThat(SystemPropertyHelper.getProductIntegerProperty(testProperty).get()).isEqualTo(1);
- System.clearProperty(gemfirePrefixProperty);
+ public void getBooleanPropertyParallelDiskStoreRecovery_default() {
+ // default
+ assertThat(getProductBooleanProperty(PARALLEL_DISK_STORE_RECOVERY).isPresent()).isFalse();
+ assertThat(getProductBooleanProperty(PARALLEL_DISK_STORE_RECOVERY).orElse(true)).isTrue();
}
@Test
- public void getIntegerPropertyReturnsEmptyOptionalIfPropertiesMissing() {
- String testProperty = "notSetProperty";
- assertThat(SystemPropertyHelper.getProductIntegerProperty(testProperty).isPresent()).isFalse();
+ public void getBooleanPropertyParallelDiskStoreRecovery_withoutPrefix() {
+ // without geode or gemfire prefix
+ System.setProperty(PARALLEL_DISK_STORE_RECOVERY, "true");
+ assertThat(getProductBooleanProperty(PARALLEL_DISK_STORE_RECOVERY).isPresent()).isFalse();
}
@Test
- public void getBooleanPropertyReturnsEmptyOptionalIfProperiesMissing() {
- String testProperty = "notSetProperty";
- assertThat(SystemPropertyHelper.getProductBooleanProperty(testProperty).isPresent()).isFalse();
+ public void getBooleanPropertyParallelDiskStoreRecovery_withGeodePrefix() {
+ // with geode prefix
+ System.setProperty(DEFAULT_PREFIX + PARALLEL_DISK_STORE_RECOVERY, "true");
+ assertThat(getProductBooleanProperty(PARALLEL_DISK_STORE_RECOVERY).get()).isTrue();
+ System.setProperty(DEFAULT_PREFIX + PARALLEL_DISK_STORE_RECOVERY, "false");
+ assertThat(getProductBooleanProperty(PARALLEL_DISK_STORE_RECOVERY).get()).isFalse();
}
@Test
- public void getBooleanPropertyPrefersGeodePrefix() {
- String testProperty = "testBooleanProperty";
- String gemfirePrefixProperty = "gemfire." + testProperty;
- String geodePrefixProperty = "geode." + testProperty;
- System.setProperty(geodePrefixProperty, "true");
- System.setProperty(gemfirePrefixProperty, "false");
- assertThat(SystemPropertyHelper.getProductBooleanProperty(testProperty).get()).isTrue();
- System.clearProperty(geodePrefixProperty);
- System.clearProperty(gemfirePrefixProperty);
+ public void getBooleanPropertyParallelDiskStoreRecovery_withGemFirePrefix() {
+ // with gemfire prefix
+ System.clearProperty(DEFAULT_PREFIX + PARALLEL_DISK_STORE_RECOVERY);
+ System.setProperty(GEMFIRE_PREFIX + PARALLEL_DISK_STORE_RECOVERY, "true");
+ assertThat(getProductBooleanProperty(PARALLEL_DISK_STORE_RECOVERY).get()).isTrue();
+ System.setProperty(GEMFIRE_PREFIX + PARALLEL_DISK_STORE_RECOVERY, "false");
+ assertThat(getProductBooleanProperty(PARALLEL_DISK_STORE_RECOVERY).get()).isFalse();
}
@Test
- public void getBooleanPropertyReturnsGemfirePrefixIfGeodeMissing() {
- String testProperty = "testBooleanProperty";
- String gemfirePrefixProperty = "gemfire." + testProperty;
- System.setProperty(gemfirePrefixProperty, "true");
- assertThat(SystemPropertyHelper.getProductBooleanProperty(testProperty).get()).isTrue();
- System.clearProperty(gemfirePrefixProperty);
+ public void getBooleanPropertyParallelDiskStoreRecovery_withBothPrefixes() {
+ // with geode and gemfire prefix
+ System.setProperty(DEFAULT_PREFIX + PARALLEL_DISK_STORE_RECOVERY, "true");
+ System.setProperty(GEMFIRE_PREFIX + PARALLEL_DISK_STORE_RECOVERY, "false");
+ assertThat(getProductBooleanProperty(PARALLEL_DISK_STORE_RECOVERY).get()).isTrue();
}
}
diff --git a/geode-dunit/src/distributedTest/java/org/apache/geode/test/dunit/rules/tests/DistributedDiskDirRuleDistributedTest.java b/geode-dunit/src/distributedTest/java/org/apache/geode/test/dunit/rules/tests/DistributedDiskDirRuleDistributedTest.java
index deb2151..e152817 100644
--- a/geode-dunit/src/distributedTest/java/org/apache/geode/test/dunit/rules/tests/DistributedDiskDirRuleDistributedTest.java
+++ b/geode-dunit/src/distributedTest/java/org/apache/geode/test/dunit/rules/tests/DistributedDiskDirRuleDistributedTest.java
@@ -15,7 +15,6 @@
package org.apache.geode.test.dunit.rules.tests;
import static org.apache.geode.internal.lang.SystemPropertyHelper.DEFAULT_DISK_DIRS_PROPERTY;
-import static org.apache.geode.internal.lang.SystemPropertyHelper.GEODE_PREFIX;
import static org.apache.geode.test.dunit.VM.getAllVMs;
import static org.apache.geode.test.dunit.VM.getController;
import static org.apache.geode.test.dunit.VM.getVM;
@@ -30,6 +29,7 @@ import java.util.List;
import org.junit.Rule;
import org.junit.Test;
+import org.apache.geode.internal.lang.SystemProperty;
import org.apache.geode.test.dunit.VM;
import org.apache.geode.test.dunit.rules.DistributedDiskDirRule;
import org.apache.geode.test.dunit.rules.DistributedRule;
@@ -50,7 +50,8 @@ public class DistributedDiskDirRuleDistributedTest implements Serializable {
public void setsDefaultDiskDirsPropertyInEveryVm() {
for (VM vm : toArray(getAllVMs(), getController())) {
vm.invoke(() -> {
- String propertyValue = System.getProperty(GEODE_PREFIX + DEFAULT_DISK_DIRS_PROPERTY);
+ String propertyValue =
+ System.getProperty(SystemProperty.DEFAULT_PREFIX + DEFAULT_DISK_DIRS_PROPERTY);
assertThat(propertyValue)
.isEqualTo(distributedDiskDirRule.getDiskDirFor(vm).getAbsolutePath());
@@ -64,7 +65,8 @@ public class DistributedDiskDirRuleDistributedTest implements Serializable {
for (VM vm : toArray(getAllVMs(), getController())) {
String propertyValue =
- vm.invoke(() -> System.getProperty(GEODE_PREFIX + DEFAULT_DISK_DIRS_PROPERTY));
+ vm.invoke(
+ () -> System.getProperty(SystemProperty.DEFAULT_PREFIX + DEFAULT_DISK_DIRS_PROPERTY));
assertThat(propertyValues).doesNotContain(propertyValue);
propertyValues.add(propertyValue);
}
@@ -77,7 +79,8 @@ public class DistributedDiskDirRuleDistributedTest implements Serializable {
VM newVM = getVM(getVMCount());
String propertyValue =
- newVM.invoke(() -> System.getProperty(GEODE_PREFIX + DEFAULT_DISK_DIRS_PROPERTY));
+ newVM.invoke(
+ () -> System.getProperty(SystemProperty.DEFAULT_PREFIX + DEFAULT_DISK_DIRS_PROPERTY));
assertThat(propertyValue).isNotNull();
}
@@ -85,12 +88,14 @@ public class DistributedDiskDirRuleDistributedTest implements Serializable {
@Test
public void defaultDiskDirsPropertyIsKeptInBouncedVm() {
String propertyValueBeforeBounce =
- getVM(0).invoke(() -> System.getProperty(GEODE_PREFIX + DEFAULT_DISK_DIRS_PROPERTY));
+ getVM(0).invoke(
+ () -> System.getProperty(SystemProperty.DEFAULT_PREFIX + DEFAULT_DISK_DIRS_PROPERTY));
getVM(0).bounce();
String propertyValueAfterBounce =
- getVM(0).invoke(() -> System.getProperty(GEODE_PREFIX + DEFAULT_DISK_DIRS_PROPERTY));
+ getVM(0).invoke(
+ () -> System.getProperty(SystemProperty.DEFAULT_PREFIX + DEFAULT_DISK_DIRS_PROPERTY));
assertThat(propertyValueAfterBounce).isEqualTo(propertyValueBeforeBounce);
}
}
diff --git a/geode-dunit/src/integrationTest/java/org/apache/geode/test/junit/rules/DiskDirRuleIntegrationTest.java b/geode-dunit/src/integrationTest/java/org/apache/geode/test/junit/rules/DiskDirRuleIntegrationTest.java
index 83f2294..0c5492c 100644
--- a/geode-dunit/src/integrationTest/java/org/apache/geode/test/junit/rules/DiskDirRuleIntegrationTest.java
+++ b/geode-dunit/src/integrationTest/java/org/apache/geode/test/junit/rules/DiskDirRuleIntegrationTest.java
@@ -16,7 +16,6 @@ package org.apache.geode.test.junit.rules;
import static org.apache.geode.distributed.ConfigurationProperties.LOCATORS;
import static org.apache.geode.internal.lang.SystemPropertyHelper.DEFAULT_DISK_DIRS_PROPERTY;
-import static org.apache.geode.internal.lang.SystemPropertyHelper.GEODE_PREFIX;
import static org.assertj.core.api.Assertions.assertThat;
import java.io.File;
@@ -30,6 +29,7 @@ import org.junit.rules.TestName;
import org.apache.geode.cache.CacheFactory;
import org.apache.geode.internal.cache.DiskStoreImpl;
import org.apache.geode.internal.cache.InternalCache;
+import org.apache.geode.internal.lang.SystemProperty;
/**
* Integration tests for {@link DiskDirRule}.
@@ -74,7 +74,8 @@ public class DiskDirRuleIntegrationTest {
@Test
public void setsDefaultDiskDirsSystemProperty() {
- String propertyValue = System.getProperty(GEODE_PREFIX + DEFAULT_DISK_DIRS_PROPERTY);
+ String propertyValue =
+ System.getProperty(SystemProperty.DEFAULT_PREFIX + DEFAULT_DISK_DIRS_PROPERTY);
assertThat(propertyValue).isEqualTo(diskDirRule.getDiskDir().getAbsolutePath());
}
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/DistributedDiskDirRule.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/DistributedDiskDirRule.java
index 672e9a9..0ebf10d 100644
--- a/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/DistributedDiskDirRule.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/DistributedDiskDirRule.java
@@ -16,9 +16,8 @@
*/
package org.apache.geode.test.dunit.rules;
+import static org.apache.geode.internal.lang.SystemProperty.getProductStringProperty;
import static org.apache.geode.internal.lang.SystemPropertyHelper.DEFAULT_DISK_DIRS_PROPERTY;
-import static org.apache.geode.internal.lang.SystemPropertyHelper.GEODE_PREFIX;
-import static org.apache.geode.internal.lang.SystemPropertyHelper.getProductStringProperty;
import static org.apache.geode.test.dunit.VM.DEFAULT_VM_COUNT;
import static org.apache.geode.test.dunit.VM.getCurrentVMNum;
@@ -32,6 +31,7 @@ import org.junit.rules.TemporaryFolder;
import org.junit.rules.TestName;
import org.junit.runner.Description;
+import org.apache.geode.internal.lang.SystemProperty;
import org.apache.geode.test.dunit.VM;
import org.apache.geode.test.dunit.VMEventListener;
import org.apache.geode.test.dunit.internal.DUnitLauncher;
@@ -118,7 +118,9 @@ public class DistributedDiskDirRule extends DiskDirRule implements SerializableT
* Returns the current default disk dirs value for the specified VM.
*/
public File getDiskDirFor(VM vm) {
- return new File(vm.invoke(() -> System.getProperty(GEODE_PREFIX + DEFAULT_DISK_DIRS_PROPERTY)));
+ return new File(
+ vm.invoke(
+ () -> System.getProperty(SystemProperty.DEFAULT_PREFIX + DEFAULT_DISK_DIRS_PROPERTY)));
}
@Override
@@ -176,7 +178,8 @@ public class DistributedDiskDirRule extends DiskDirRule implements SerializableT
Files.createDirectory(diskDir.toPath());
}
- System.setProperty(GEODE_PREFIX + DEFAULT_DISK_DIRS_PROPERTY, diskDir.getAbsolutePath());
+ System.setProperty(SystemProperty.DEFAULT_PREFIX + DEFAULT_DISK_DIRS_PROPERTY,
+ diskDir.getAbsolutePath());
}
private void doAfter() {
@@ -185,9 +188,10 @@ public class DistributedDiskDirRule extends DiskDirRule implements SerializableT
+ getCurrentVMNum() + ". Rule does not support VM.bounce().");
}
if (data.originalValue() == null) {
- System.clearProperty(GEODE_PREFIX + DEFAULT_DISK_DIRS_PROPERTY);
+ System.clearProperty(SystemProperty.DEFAULT_PREFIX + DEFAULT_DISK_DIRS_PROPERTY);
} else {
- System.setProperty(GEODE_PREFIX + DEFAULT_DISK_DIRS_PROPERTY, data.originalValue());
+ System.setProperty(SystemProperty.DEFAULT_PREFIX + DEFAULT_DISK_DIRS_PROPERTY,
+ data.originalValue());
}
}
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/junit/rules/DiskDirRule.java b/geode-dunit/src/main/java/org/apache/geode/test/junit/rules/DiskDirRule.java
index 6a9f00e..b221dac 100644
--- a/geode-dunit/src/main/java/org/apache/geode/test/junit/rules/DiskDirRule.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/junit/rules/DiskDirRule.java
@@ -16,9 +16,8 @@
*/
package org.apache.geode.test.junit.rules;
+import static org.apache.geode.internal.lang.SystemProperty.getProductStringProperty;
import static org.apache.geode.internal.lang.SystemPropertyHelper.DEFAULT_DISK_DIRS_PROPERTY;
-import static org.apache.geode.internal.lang.SystemPropertyHelper.GEODE_PREFIX;
-import static org.apache.geode.internal.lang.SystemPropertyHelper.getProductStringProperty;
import java.io.File;
import java.lang.reflect.Method;
@@ -28,6 +27,8 @@ import org.junit.rules.TemporaryFolder;
import org.junit.rules.TestName;
import org.junit.runner.Description;
+import org.apache.geode.internal.lang.SystemProperty;
+
/**
* JUnit Rule that overrides the default DiskDirs directory. Internally, TemporaryFolder and
* TestName are used by this rule to define the directory locations and names.
@@ -73,7 +74,7 @@ public class DiskDirRule extends DescribedExternalResource {
* Returns the current default disk dirs value.
*/
public File getDiskDir() {
- return new File(System.getProperty(GEODE_PREFIX + DEFAULT_DISK_DIRS_PROPERTY));
+ return new File(System.getProperty(SystemProperty.DEFAULT_PREFIX + DEFAULT_DISK_DIRS_PROPERTY));
}
@Override
@@ -85,15 +86,16 @@ public class DiskDirRule extends DescribedExternalResource {
File diskDir = temporaryFolder.newFolder(getDiskDirName(description.getClassName()));
- System.setProperty(GEODE_PREFIX + DEFAULT_DISK_DIRS_PROPERTY, diskDir.getAbsolutePath());
+ System.setProperty(SystemProperty.DEFAULT_PREFIX + DEFAULT_DISK_DIRS_PROPERTY,
+ diskDir.getAbsolutePath());
}
@Override
protected void after(Description description) {
if (originalValue == null) {
- System.clearProperty(GEODE_PREFIX + DEFAULT_DISK_DIRS_PROPERTY);
+ System.clearProperty(SystemProperty.DEFAULT_PREFIX + DEFAULT_DISK_DIRS_PROPERTY);
} else {
- System.setProperty(GEODE_PREFIX + DEFAULT_DISK_DIRS_PROPERTY, originalValue);
+ System.setProperty(SystemProperty.DEFAULT_PREFIX + DEFAULT_DISK_DIRS_PROPERTY, originalValue);
}
}
[geode] 03/06: GEODE-9758: Move ClassUtils to geode-common (#7166)
Posted by kl...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
klund pushed a commit to branch support/1.12
in repository https://gitbox.apache.org/repos/asf/geode.git
commit 4f7f575914a3d7b500b792457e24f5430a3f4435
Author: Kirk Lund <kl...@apache.org>
AuthorDate: Fri Dec 10 11:28:17 2021 -0800
GEODE-9758: Move ClassUtils to geode-common (#7166)
(cherry picked from commit b6fca291378a1bc334b0f9927c899a1892442939)
---
.../src/main/java/org/apache/geode/internal/lang/ClassUtils.java | 2 +-
.../java/org/apache/geode/internal/lang/utils/ClassUtilsTest.java | 8 ++++----
.../main/java/org/apache/geode/distributed/AbstractLauncher.java | 2 +-
.../java/org/apache/geode/internal/InternalDataSerializer.java | 2 +-
.../InternalDataSerializerSerializationAcceptlistTest.java | 2 +-
.../geode/internal/InternalDataSerializerShiroAcceptListTest.java | 2 +-
.../internal/cli/commands/DescribeDiskStoreCommand.java | 2 +-
.../java/org/apache/geode/management/internal/cli/shell/Gfsh.java | 2 +-
.../java/org/apache/geode/codeAnalysis/CompiledClassUtils.java | 8 +++++---
.../internal/serialization/SerializationDependenciesTest.java | 3 ++-
.../java/org/apache/geode/rest/internal/web/util/NumberUtils.java | 2 +-
11 files changed, 19 insertions(+), 16 deletions(-)
diff --git a/geode-core/src/main/java/org/apache/geode/internal/lang/ClassUtils.java b/geode-common/src/main/java/org/apache/geode/internal/lang/ClassUtils.java
similarity index 99%
rename from geode-core/src/main/java/org/apache/geode/internal/lang/ClassUtils.java
rename to geode-common/src/main/java/org/apache/geode/internal/lang/ClassUtils.java
index 82bae79..82198dd 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/lang/ClassUtils.java
+++ b/geode-common/src/main/java/org/apache/geode/internal/lang/ClassUtils.java
@@ -13,7 +13,7 @@
* the License.
*/
-package org.apache.geode.internal.lang;
+package org.apache.geode.internal.lang.utils;
import org.apache.geode.annotations.Immutable;
diff --git a/geode-core/src/test/java/org/apache/geode/internal/lang/ClassUtilsJUnitTest.java b/geode-common/src/test/java/org/apache/geode/internal/lang/utils/ClassUtilsTest.java
similarity index 97%
rename from geode-core/src/test/java/org/apache/geode/internal/lang/ClassUtilsJUnitTest.java
rename to geode-common/src/test/java/org/apache/geode/internal/lang/utils/ClassUtilsTest.java
index ad118ef..49e3714 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/lang/ClassUtilsJUnitTest.java
+++ b/geode-common/src/test/java/org/apache/geode/internal/lang/utils/ClassUtilsTest.java
@@ -12,7 +12,7 @@
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
-package org.apache.geode.internal.lang;
+package org.apache.geode.internal.lang.utils;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -22,20 +22,20 @@ import static org.junit.Assert.assertTrue;
import java.util.Calendar;
import java.util.Date;
+import org.apache.commons.lang3.StringUtils;
import org.junit.Test;
-
/**
* The ClassUtilsJUnitTest class is a test suite with test cases to test the contract and
* functionality of the ClassUtils class.
* <p/>
*
- * @see org.apache.geode.internal.lang.ClassUtils
+ * @see ClassUtils
* @see org.junit.Assert
* @see org.junit.Test
* @since GemFire 7.0
*/
-public class ClassUtilsJUnitTest {
+public class ClassUtilsTest {
@Test
public void testForNameWithExistingClass() {
diff --git a/geode-core/src/main/java/org/apache/geode/distributed/AbstractLauncher.java b/geode-core/src/main/java/org/apache/geode/distributed/AbstractLauncher.java
index c91e73a..8bac461 100644
--- a/geode-core/src/main/java/org/apache/geode/distributed/AbstractLauncher.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/AbstractLauncher.java
@@ -18,9 +18,9 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank;
import static org.apache.commons.lang3.StringUtils.join;
import static org.apache.commons.lang3.StringUtils.lowerCase;
import static org.apache.geode.distributed.ConfigurationProperties.NAME;
-import static org.apache.geode.internal.lang.ClassUtils.forName;
import static org.apache.geode.internal.lang.StringUtils.defaultString;
import static org.apache.geode.internal.lang.SystemUtils.CURRENT_DIRECTORY;
+import static org.apache.geode.internal.lang.utils.ClassUtils.forName;
import java.io.File;
import java.io.FileReader;
diff --git a/geode-core/src/main/java/org/apache/geode/internal/InternalDataSerializer.java b/geode-core/src/main/java/org/apache/geode/internal/InternalDataSerializer.java
index 08f5de9..66241ba 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/InternalDataSerializer.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/InternalDataSerializer.java
@@ -103,7 +103,7 @@ import org.apache.geode.internal.cache.tier.sockets.ClientDataSerializerMessage;
import org.apache.geode.internal.cache.tier.sockets.ClientProxyMembershipID;
import org.apache.geode.internal.cache.tier.sockets.OldClientSupportService;
import org.apache.geode.internal.cache.tier.sockets.Part;
-import org.apache.geode.internal.lang.ClassUtils;
+import org.apache.geode.internal.lang.utils.ClassUtils;
import org.apache.geode.internal.logging.log4j.LogMarker;
import org.apache.geode.internal.serialization.BasicSerializable;
import org.apache.geode.internal.serialization.DSCODE;
diff --git a/geode-core/src/test/java/org/apache/geode/internal/InternalDataSerializerSerializationAcceptlistTest.java b/geode-core/src/test/java/org/apache/geode/internal/InternalDataSerializerSerializationAcceptlistTest.java
index b460888..6242203 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/InternalDataSerializerSerializationAcceptlistTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/InternalDataSerializerSerializationAcceptlistTest.java
@@ -17,7 +17,7 @@ package org.apache.geode.internal;
import static java.util.Collections.emptySet;
import static org.apache.geode.distributed.internal.DistributionConfig.SERIALIZABLE_OBJECT_FILTER_NAME;
import static org.apache.geode.distributed.internal.DistributionConfig.VALIDATE_SERIALIZABLE_OBJECTS_NAME;
-import static org.apache.geode.internal.lang.ClassUtils.isClassAvailable;
+import static org.apache.geode.internal.lang.utils.ClassUtils.isClassAvailable;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.catchThrowable;
import static org.junit.Assume.assumeTrue;
diff --git a/geode-core/src/test/java/org/apache/geode/internal/InternalDataSerializerShiroAcceptListTest.java b/geode-core/src/test/java/org/apache/geode/internal/InternalDataSerializerShiroAcceptListTest.java
index 55bb9fe..d368a10b 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/InternalDataSerializerShiroAcceptListTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/InternalDataSerializerShiroAcceptListTest.java
@@ -16,7 +16,7 @@ package org.apache.geode.internal;
import static java.util.Collections.emptySet;
import static org.apache.geode.distributed.internal.DistributionConfig.VALIDATE_SERIALIZABLE_OBJECTS_NAME;
-import static org.apache.geode.internal.lang.ClassUtils.isClassAvailable;
+import static org.apache.geode.internal.lang.utils.ClassUtils.isClassAvailable;
import static org.apache.geode.internal.serialization.Version.CURRENT;
import static org.junit.Assume.assumeTrue;
diff --git a/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/commands/DescribeDiskStoreCommand.java b/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/commands/DescribeDiskStoreCommand.java
index dd1ffca..0314398 100644
--- a/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/commands/DescribeDiskStoreCommand.java
+++ b/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/commands/DescribeDiskStoreCommand.java
@@ -23,7 +23,7 @@ import org.springframework.shell.core.annotation.CliOption;
import org.apache.geode.cache.execute.ResultCollector;
import org.apache.geode.distributed.DistributedMember;
-import org.apache.geode.internal.lang.ClassUtils;
+import org.apache.geode.internal.lang.utils.ClassUtils;
import org.apache.geode.management.cli.CliMetaData;
import org.apache.geode.management.cli.ConverterHint;
import org.apache.geode.management.cli.GfshCommand;
diff --git a/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/shell/Gfsh.java b/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/shell/Gfsh.java
index b0d9bbd..f17826d 100755
--- a/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/shell/Gfsh.java
+++ b/geode-gfsh/src/main/java/org/apache/geode/management/internal/cli/shell/Gfsh.java
@@ -46,7 +46,7 @@ import org.springframework.shell.event.ShellStatus.Status;
import org.apache.geode.annotations.internal.MakeNotStatic;
import org.apache.geode.annotations.internal.MutableForTesting;
import org.apache.geode.internal.GemFireVersion;
-import org.apache.geode.internal.lang.ClassUtils;
+import org.apache.geode.internal.lang.utils.ClassUtils;
import org.apache.geode.internal.logging.Banner;
import org.apache.geode.internal.process.signal.AbstractSignalNotificationHandler;
import org.apache.geode.internal.serialization.Version;
diff --git a/geode-junit/src/main/java/org/apache/geode/codeAnalysis/CompiledClassUtils.java b/geode-junit/src/main/java/org/apache/geode/codeAnalysis/CompiledClassUtils.java
index 25dda45..e14ef09 100644
--- a/geode-junit/src/main/java/org/apache/geode/codeAnalysis/CompiledClassUtils.java
+++ b/geode-junit/src/main/java/org/apache/geode/codeAnalysis/CompiledClassUtils.java
@@ -14,6 +14,8 @@
*/
package org.apache.geode.codeAnalysis;
+import static org.apache.commons.lang3.StringUtils.isBlank;
+
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
@@ -303,11 +305,11 @@ public class CompiledClassUtils {
String line;
while ((line = in.readLine()) != null) {
line = line.trim();
- if (line.startsWith("#") || line.startsWith("//")) {
+ if (isBlank(line) || line.startsWith("#") || line.startsWith("//")) {
// comment line
- } else {
- result.add(new ClassAndVariableDetails(line));
+ continue;
}
+ result.add(new ClassAndVariableDetails(line));
}
return result;
}
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/SerializationDependenciesTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/SerializationDependenciesTest.java
index 199cb0f..3806564 100644
--- a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/SerializationDependenciesTest.java
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/SerializationDependenciesTest.java
@@ -43,6 +43,7 @@ public class SerializationDependenciesTest {
resideInAPackage("org.apache.geode.internal.serialization..")
.or(not(resideInAPackage("org.apache.geode..")))
.or(resideInAPackage("org.apache.geode.annotations.."))
- .or(resideInAPackage("org.apache.geode.logging.."))
+ .or(resideInAPackage("org.apache.geode.internal.lang.utils.."))
+ .or(resideInAPackage("org.apache.geode.logging.internal.log4j.api.."))
.or(resideInAPackage("org.apache.geode.test..")));
}
diff --git a/geode-web-api/src/main/java/org/apache/geode/rest/internal/web/util/NumberUtils.java b/geode-web-api/src/main/java/org/apache/geode/rest/internal/web/util/NumberUtils.java
index 72b4d41..6fcfcfc 100644
--- a/geode-web-api/src/main/java/org/apache/geode/rest/internal/web/util/NumberUtils.java
+++ b/geode-web-api/src/main/java/org/apache/geode/rest/internal/web/util/NumberUtils.java
@@ -17,7 +17,7 @@ package org.apache.geode.rest.internal.web.util;
import org.springframework.util.StringUtils;
-import org.apache.geode.internal.lang.ClassUtils;
+import org.apache.geode.internal.lang.utils.ClassUtils;
/**
* The NumberUtils class is a utility class for working with numbers.
[geode] 02/06: GEODE-9758: Move SanctionedSerializables to filter package (#7165)
Posted by kl...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
klund pushed a commit to branch support/1.12
in repository https://gitbox.apache.org/repos/asf/geode.git
commit 73054f46dbfb3ac84b7a5882c1d16c83a6d1446d
Author: Kirk Lund <kl...@apache.org>
AuthorDate: Thu Dec 9 10:15:20 2021 -0800
GEODE-9758: Move SanctionedSerializables to filter package (#7165)
Move SanctionedSerializables to new package
org.apache.geode.internal.serialization.filter.
(cherry picked from commit db64b4948e790d61e82f95ae6163a62adc4c67fb)
---
geode-common/build.gradle | 1 +
...ctionedSerializablesServiceIntegrationTest.java | 2 +-
.../ConnectorsSanctionedSerializablesService.java | 2 +-
...lization.filter.SanctionedSerializablesService} | 0
geode-core/build.gradle | 2 +
...ctionedSerializablesServiceIntegrationTest.java | 2 +-
.../CoreSanctionedSerializablesService.java | 2 +-
.../geode/internal/InternalDataSerializer.java | 4 +-
.../internal/ObjectInputStreamFilterWrapper.java | 2 +-
...lization.filter.SanctionedSerializablesService} | 0
...ctionedSerializablesServiceIntegrationTest.java | 2 +-
.../internal/CQSanctionedSerializablesService.java | 2 +-
...lization.filter.SanctionedSerializablesService} | 0
...ctionedSerializablesServiceIntegrationTest.java | 2 +-
.../DUnitSanctionedSerializablesService.java | 2 +-
...lization.filter.SanctionedSerializablesService} | 0
.../AnalyzeGfshSerializablesIntegrationTest.java | 2 +-
...ctionedSerializablesServiceIntegrationTest.java | 4 +-
.../GfshSanctionedSerializablesService.java | 4 +-
...lization.filter.SanctionedSerializablesService} | 2 +-
.../sanctioned-geode-gfsh-serializables.txt | 0
...ctionedSerializablesServiceIntegrationTest.java | 5 +-
...nedSerializablesServiceIntegrationTestBase.java | 16 ++--
.../categories/SanctionedSerializablesTest.java | 5 +-
.../JUnitSanctionedSerializablesService.java | 2 +-
...lization.filter.SanctionedSerializablesService} | 0
...ctionedSerializablesServiceIntegrationTest.java | 2 +-
.../LuceneSanctionedSerializablesService.java | 2 +-
...lization.filter.SanctionedSerializablesService} | 0
...ctionedSerializablesServiceIntegrationTest.java | 2 +-
.../ManagementSanctionedSerializablesService.java | 2 +-
...lization.filter.SanctionedSerializablesService} | 0
.../MembershipDependenciesJUnitTest.java | 1 -
...ctionedSerializablesServiceIntegrationTest.java | 2 +-
.../MembershipSanctionedSerializablesService.java | 2 +-
...lization.filter.SanctionedSerializablesService} | 0
...ctionedSerializablesServiceIntegrationTest.java | 2 +-
.../MemcachedSanctionedSerializablesService.java | 2 +-
...lization.filter.SanctionedSerializablesService} | 0
.../RedisSanctionedSerializablesService.java | 2 +-
...lization.filter.SanctionedSerializablesService} | 0
...ctionedSerializablesServiceIntegrationTest.java | 2 +-
...lization.filter.SanctionedSerializablesService} | 0
geode-serialization/build.gradle | 4 +
...ctionedSerializablesServiceIntegrationTest.java | 1 +
.../apache/geode/codeAnalysis/excludedClasses.txt | 0
...erializationSanctionedSerializablesService.java | 2 +
.../{ => filter}/SanctionedSerializables.java | 37 ++++++++-
.../SanctionedSerializablesService.java | 2 +-
...lization.filter.SanctionedSerializablesService} | 0
...est.java => SerializationDependenciesTest.java} | 17 ++--
.../filter/SanctionedSerializablesTest.java | 95 ++++++++++++++++++++++
.../src/test/resources/expected-pom.xml | 10 +++
...ctionedSerializablesServiceIntegrationTest.java | 4 +-
.../AnalyzeWANSerializablesIntegrationTest.java | 2 +-
.../WANSanctionedSerializablesService.java | 4 +-
...lization.filter.SanctionedSerializablesService} | 2 +-
.../sanctioned-geode-wan-serializables.txt | 0
...ctionedSerializablesServiceIntegrationTest.java | 2 +-
.../WebApiSanctionedSerializablesService.java | 2 +-
...lization.filter.SanctionedSerializablesService} | 0
61 files changed, 212 insertions(+), 58 deletions(-)
diff --git a/geode-common/build.gradle b/geode-common/build.gradle
index ced5435..3ba882f 100755
--- a/geode-common/build.gradle
+++ b/geode-common/build.gradle
@@ -23,6 +23,7 @@ dependencies {
compile(platform(project(':boms:geode-all-bom')))
compile('com.fasterxml.jackson.core:jackson-databind')
testCompile('junit:junit')
+ testImplementation('org.apache.commons:commons-lang3')
testCompile('org.assertj:assertj-core')
testCompile('org.mockito:mockito-core')
}
diff --git a/geode-connectors/src/integrationTest/java/org/apache/geode/connectors/jdbc/internal/ConnectorsSanctionedSerializablesServiceIntegrationTest.java b/geode-connectors/src/integrationTest/java/org/apache/geode/connectors/jdbc/internal/ConnectorsSanctionedSerializablesServiceIntegrationTest.java
index 7a6d11a..9a1be57 100644
--- a/geode-connectors/src/integrationTest/java/org/apache/geode/connectors/jdbc/internal/ConnectorsSanctionedSerializablesServiceIntegrationTest.java
+++ b/geode-connectors/src/integrationTest/java/org/apache/geode/connectors/jdbc/internal/ConnectorsSanctionedSerializablesServiceIntegrationTest.java
@@ -17,7 +17,7 @@ package org.apache.geode.connectors.jdbc.internal;
import org.junit.experimental.categories.Category;
import org.apache.geode.codeAnalysis.SanctionedSerializablesServiceIntegrationTestBase;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
import org.apache.geode.test.junit.categories.SanctionedSerializablesTest;
import org.apache.geode.test.junit.categories.SerializationTest;
diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/ConnectorsSanctionedSerializablesService.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/ConnectorsSanctionedSerializablesService.java
index 76b5390..007978b 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/ConnectorsSanctionedSerializablesService.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/ConnectorsSanctionedSerializablesService.java
@@ -16,7 +16,7 @@ package org.apache.geode.connectors.jdbc.internal;
import java.net.URL;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
public class ConnectorsSanctionedSerializablesService implements SanctionedSerializablesService {
diff --git a/geode-connectors/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService b/geode-connectors/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
similarity index 100%
rename from geode-connectors/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService
rename to geode-connectors/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
diff --git a/geode-core/build.gradle b/geode-core/build.gradle
index bb68649..2204263 100755
--- a/geode-core/build.gradle
+++ b/geode-core/build.gradle
@@ -318,6 +318,7 @@ dependencies {
exclude module: 'geode-core'
}
testCompile(project(':geode-concurrency-test'))
+ testImplementation(project(':geode-serialization'))
testCompile('org.apache.bcel:bcel')
testCompile('org.mockito:mockito-core')
testCompile('com.pholser:junit-quickcheck-core')
@@ -348,6 +349,7 @@ dependencies {
exclude module: 'geode-core'
}
integrationTestCompile(project(':geode-concurrency-test'))
+ integrationTestImplementation(project(':geode-serialization'))
integrationTestCompile('org.apache.bcel:bcel')
integrationTestCompile('org.powermock:powermock-core')
integrationTestCompile('org.powermock:powermock-module-junit4')
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/CoreSanctionedSerializablesServiceIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/CoreSanctionedSerializablesServiceIntegrationTest.java
index feeb08d..36e0623 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/internal/CoreSanctionedSerializablesServiceIntegrationTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/CoreSanctionedSerializablesServiceIntegrationTest.java
@@ -17,7 +17,7 @@ package org.apache.geode.internal;
import org.junit.experimental.categories.Category;
import org.apache.geode.codeAnalysis.SanctionedSerializablesServiceIntegrationTestBase;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
import org.apache.geode.test.junit.categories.SanctionedSerializablesTest;
import org.apache.geode.test.junit.categories.SerializationTest;
diff --git a/geode-core/src/main/java/org/apache/geode/internal/CoreSanctionedSerializablesService.java b/geode-core/src/main/java/org/apache/geode/internal/CoreSanctionedSerializablesService.java
index 790520e..fa5f1e1 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/CoreSanctionedSerializablesService.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/CoreSanctionedSerializablesService.java
@@ -16,7 +16,7 @@ package org.apache.geode.internal;
import java.net.URL;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
public class CoreSanctionedSerializablesService implements SanctionedSerializablesService {
diff --git a/geode-core/src/main/java/org/apache/geode/internal/InternalDataSerializer.java b/geode-core/src/main/java/org/apache/geode/internal/InternalDataSerializer.java
index 22cb748..08f5de9 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/InternalDataSerializer.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/InternalDataSerializer.java
@@ -14,7 +14,7 @@
*/
package org.apache.geode.internal;
-import static org.apache.geode.internal.serialization.SanctionedSerializables.loadSanctionedSerializablesServices;
+import static org.apache.geode.internal.serialization.filter.SanctionedSerializables.loadSanctionedSerializablesServices;
import java.io.DataInput;
import java.io.DataOutput;
@@ -114,12 +114,12 @@ import org.apache.geode.internal.serialization.DeserializationContext;
import org.apache.geode.internal.serialization.DscodeHelper;
import org.apache.geode.internal.serialization.ObjectDeserializer;
import org.apache.geode.internal.serialization.ObjectSerializer;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
import org.apache.geode.internal.serialization.SerializationContext;
import org.apache.geode.internal.serialization.SerializationVersions;
import org.apache.geode.internal.serialization.StaticSerialization;
import org.apache.geode.internal.serialization.Version;
import org.apache.geode.internal.serialization.VersionedDataStream;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
import org.apache.geode.internal.util.concurrent.CopyOnWriteHashMap;
import org.apache.geode.logging.internal.log4j.api.LogService;
import org.apache.geode.pdx.NonPortableClassException;
diff --git a/geode-core/src/main/java/org/apache/geode/internal/ObjectInputStreamFilterWrapper.java b/geode-core/src/main/java/org/apache/geode/internal/ObjectInputStreamFilterWrapper.java
index 184eb9f..25d5e35 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/ObjectInputStreamFilterWrapper.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/ObjectInputStreamFilterWrapper.java
@@ -30,7 +30,7 @@ import org.apache.logging.log4j.Logger;
import org.apache.geode.GemFireConfigException;
import org.apache.geode.InternalGemFireError;
import org.apache.geode.InternalGemFireException;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
import org.apache.geode.logging.internal.log4j.api.LogService;
diff --git a/geode-core/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService b/geode-core/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
similarity index 100%
rename from geode-core/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService
rename to geode-core/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
diff --git a/geode-cq/src/integrationTest/java/org/apache/geode/cache/query/cq/internal/CQSanctionedSerializablesServiceIntegrationTest.java b/geode-cq/src/integrationTest/java/org/apache/geode/cache/query/cq/internal/CQSanctionedSerializablesServiceIntegrationTest.java
index b17a1cf..1d1d09c 100644
--- a/geode-cq/src/integrationTest/java/org/apache/geode/cache/query/cq/internal/CQSanctionedSerializablesServiceIntegrationTest.java
+++ b/geode-cq/src/integrationTest/java/org/apache/geode/cache/query/cq/internal/CQSanctionedSerializablesServiceIntegrationTest.java
@@ -17,7 +17,7 @@ package org.apache.geode.cache.query.cq.internal;
import org.junit.experimental.categories.Category;
import org.apache.geode.codeAnalysis.SanctionedSerializablesServiceIntegrationTestBase;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
import org.apache.geode.test.junit.categories.SanctionedSerializablesTest;
import org.apache.geode.test.junit.categories.SerializationTest;
diff --git a/geode-cq/src/main/java/org/apache/geode/cache/query/cq/internal/CQSanctionedSerializablesService.java b/geode-cq/src/main/java/org/apache/geode/cache/query/cq/internal/CQSanctionedSerializablesService.java
index 59838f8..b61cbc5 100644
--- a/geode-cq/src/main/java/org/apache/geode/cache/query/cq/internal/CQSanctionedSerializablesService.java
+++ b/geode-cq/src/main/java/org/apache/geode/cache/query/cq/internal/CQSanctionedSerializablesService.java
@@ -16,7 +16,7 @@ package org.apache.geode.cache.query.cq.internal;
import java.net.URL;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
public class CQSanctionedSerializablesService implements SanctionedSerializablesService {
diff --git a/geode-cq/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService b/geode-cq/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
similarity index 100%
rename from geode-cq/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService
rename to geode-cq/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
diff --git a/geode-dunit/src/integrationTest/java/org/apache/geode/test/dunit/internal/DUnitSanctionedSerializablesServiceIntegrationTest.java b/geode-dunit/src/integrationTest/java/org/apache/geode/test/dunit/internal/DUnitSanctionedSerializablesServiceIntegrationTest.java
index f70d3c3..d73861e 100644
--- a/geode-dunit/src/integrationTest/java/org/apache/geode/test/dunit/internal/DUnitSanctionedSerializablesServiceIntegrationTest.java
+++ b/geode-dunit/src/integrationTest/java/org/apache/geode/test/dunit/internal/DUnitSanctionedSerializablesServiceIntegrationTest.java
@@ -17,7 +17,7 @@ package org.apache.geode.test.dunit.internal;
import org.junit.experimental.categories.Category;
import org.apache.geode.codeAnalysis.SanctionedSerializablesServiceIntegrationTestBase;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
import org.apache.geode.test.junit.categories.SanctionedSerializablesTest;
import org.apache.geode.test.junit.categories.SerializationTest;
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/DUnitSanctionedSerializablesService.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/DUnitSanctionedSerializablesService.java
index 6ae34d7..beb4daf 100644
--- a/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/DUnitSanctionedSerializablesService.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/DUnitSanctionedSerializablesService.java
@@ -16,7 +16,7 @@ package org.apache.geode.test.dunit.internal;
import java.net.URL;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
public class DUnitSanctionedSerializablesService implements SanctionedSerializablesService {
diff --git a/geode-dunit/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService b/geode-dunit/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
similarity index 100%
rename from geode-dunit/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService
rename to geode-dunit/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
diff --git a/geode-gfsh/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeGfshSerializablesIntegrationTest.java b/geode-gfsh/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeGfshSerializablesIntegrationTest.java
index 1de44bf..bac8886 100755
--- a/geode-gfsh/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeGfshSerializablesIntegrationTest.java
+++ b/geode-gfsh/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeGfshSerializablesIntegrationTest.java
@@ -18,7 +18,7 @@ import java.util.Optional;
import org.junit.experimental.categories.Category;
-import org.apache.geode.management.internal.GfshSanctionedSerializablesService;
+import org.apache.geode.gfsh.internal.management.GfshSanctionedSerializablesService;
import org.apache.geode.test.junit.categories.SerializationTest;
@Category(SerializationTest.class)
diff --git a/geode-gfsh/src/integrationTest/java/org/apache/geode/management/internal/GfshSanctionedSerializablesServiceIntegrationTest.java b/geode-gfsh/src/integrationTest/java/org/apache/geode/gfsh/internal/management/GfshSanctionedSerializablesServiceIntegrationTest.java
similarity index 93%
rename from geode-gfsh/src/integrationTest/java/org/apache/geode/management/internal/GfshSanctionedSerializablesServiceIntegrationTest.java
rename to geode-gfsh/src/integrationTest/java/org/apache/geode/gfsh/internal/management/GfshSanctionedSerializablesServiceIntegrationTest.java
index a2d7644..48a414c 100644
--- a/geode-gfsh/src/integrationTest/java/org/apache/geode/management/internal/GfshSanctionedSerializablesServiceIntegrationTest.java
+++ b/geode-gfsh/src/integrationTest/java/org/apache/geode/gfsh/internal/management/GfshSanctionedSerializablesServiceIntegrationTest.java
@@ -12,7 +12,7 @@
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
-package org.apache.geode.management.internal;
+package org.apache.geode.gfsh.internal.management;
import static org.assertj.core.api.Assertions.assertThat;
@@ -23,7 +23,7 @@ import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.apache.geode.codeAnalysis.SanctionedSerializablesServiceIntegrationTestBase;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
import org.apache.geode.management.cli.CommandProcessingException;
import org.apache.geode.test.junit.categories.SanctionedSerializablesTest;
import org.apache.geode.test.junit.categories.SerializationTest;
diff --git a/geode-gfsh/src/main/java/org/apache/geode/management/internal/GfshSanctionedSerializablesService.java b/geode-gfsh/src/main/java/org/apache/geode/gfsh/internal/management/GfshSanctionedSerializablesService.java
similarity index 88%
rename from geode-gfsh/src/main/java/org/apache/geode/management/internal/GfshSanctionedSerializablesService.java
rename to geode-gfsh/src/main/java/org/apache/geode/gfsh/internal/management/GfshSanctionedSerializablesService.java
index 66c9457..867b897 100644
--- a/geode-gfsh/src/main/java/org/apache/geode/management/internal/GfshSanctionedSerializablesService.java
+++ b/geode-gfsh/src/main/java/org/apache/geode/gfsh/internal/management/GfshSanctionedSerializablesService.java
@@ -12,11 +12,11 @@
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
-package org.apache.geode.management.internal;
+package org.apache.geode.gfsh.internal.management;
import java.net.URL;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
public class GfshSanctionedSerializablesService implements SanctionedSerializablesService {
diff --git a/geode-gfsh/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService b/geode-gfsh/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
similarity index 90%
rename from geode-gfsh/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService
rename to geode-gfsh/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
index e51ef5e..51b4140 100644
--- a/geode-gfsh/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService
+++ b/geode-gfsh/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
@@ -12,4 +12,4 @@
# or implied. See the License for the specific language governing permissions and limitations under
# the License.
#
-org.apache.geode.management.internal.GfshSanctionedSerializablesService
+org.apache.geode.gfsh.internal.management.GfshSanctionedSerializablesService
diff --git a/geode-gfsh/src/main/resources/org/apache/geode/management/internal/sanctioned-geode-gfsh-serializables.txt b/geode-gfsh/src/main/resources/org/apache/geode/gfsh/internal/management/sanctioned-geode-gfsh-serializables.txt
similarity index 100%
rename from geode-gfsh/src/main/resources/org/apache/geode/management/internal/sanctioned-geode-gfsh-serializables.txt
rename to geode-gfsh/src/main/resources/org/apache/geode/gfsh/internal/management/sanctioned-geode-gfsh-serializables.txt
diff --git a/geode-junit/src/integrationTest/java/org/apache/geode/test/junit/internal/JUnitSanctionedSerializablesServiceIntegrationTest.java b/geode-junit/src/integrationTest/java/org/apache/geode/test/junit/internal/JUnitSanctionedSerializablesServiceIntegrationTest.java
index f317278..2f48af8 100644
--- a/geode-junit/src/integrationTest/java/org/apache/geode/test/junit/internal/JUnitSanctionedSerializablesServiceIntegrationTest.java
+++ b/geode-junit/src/integrationTest/java/org/apache/geode/test/junit/internal/JUnitSanctionedSerializablesServiceIntegrationTest.java
@@ -17,8 +17,7 @@ package org.apache.geode.test.junit.internal;
import org.junit.experimental.categories.Category;
import org.apache.geode.codeAnalysis.SanctionedSerializablesServiceIntegrationTestBase;
-import org.apache.geode.internal.CoreSanctionedSerializablesService;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
import org.apache.geode.test.junit.categories.SanctionedSerializablesTest;
import org.apache.geode.test.junit.categories.SerializationTest;
@@ -26,7 +25,7 @@ import org.apache.geode.test.junit.categories.SerializationTest;
public class JUnitSanctionedSerializablesServiceIntegrationTest
extends SanctionedSerializablesServiceIntegrationTestBase {
- private final SanctionedSerializablesService service = new CoreSanctionedSerializablesService();
+ private final SanctionedSerializablesService service = new JUnitSanctionedSerializablesService();
@Override
protected SanctionedSerializablesService getService() {
diff --git a/geode-junit/src/main/java/org/apache/geode/codeAnalysis/SanctionedSerializablesServiceIntegrationTestBase.java b/geode-junit/src/main/java/org/apache/geode/codeAnalysis/SanctionedSerializablesServiceIntegrationTestBase.java
index 2fd6672..d938769 100644
--- a/geode-junit/src/main/java/org/apache/geode/codeAnalysis/SanctionedSerializablesServiceIntegrationTestBase.java
+++ b/geode-junit/src/main/java/org/apache/geode/codeAnalysis/SanctionedSerializablesServiceIntegrationTestBase.java
@@ -14,7 +14,7 @@
*/
package org.apache.geode.codeAnalysis;
-import static org.apache.geode.internal.serialization.SanctionedSerializables.loadSanctionedSerializablesServices;
+import static org.apache.geode.internal.serialization.filter.SanctionedSerializables.loadSanctionedSerializablesServices;
import static org.assertj.core.api.Assertions.assertThat;
import java.io.IOException;
@@ -23,7 +23,7 @@ import java.util.Collection;
import org.junit.Test;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
public abstract class SanctionedSerializablesServiceIntegrationTestBase {
@@ -61,13 +61,19 @@ public abstract class SanctionedSerializablesServiceIntegrationTestBase {
URL url = service.getSanctionedSerializablesURL();
- switch (getServiceResourceExpectation()) {
+ ServiceResourceExpectation expectation = getServiceResourceExpectation();
+ String description = "Sanctioned serializables URL " + url + " " + expectation;
+ switch (expectation) {
case NULL:
- assertThat(url).isNull();
+ assertThat(url)
+ .as(description)
+ .isNull();
break;
case EMPTY:
case NON_EMPTY:
- assertThat(url).isNotNull();
+ assertThat(url)
+ .as(description)
+ .isNotNull();
}
}
diff --git a/geode-junit/src/main/java/org/apache/geode/test/junit/categories/SanctionedSerializablesTest.java b/geode-junit/src/main/java/org/apache/geode/test/junit/categories/SanctionedSerializablesTest.java
index 3401da1..ac0d7ac 100644
--- a/geode-junit/src/main/java/org/apache/geode/test/junit/categories/SanctionedSerializablesTest.java
+++ b/geode-junit/src/main/java/org/apache/geode/test/junit/categories/SanctionedSerializablesTest.java
@@ -14,5 +14,8 @@
*/
package org.apache.geode.test.junit.categories;
-public interface SanctionedSerializablesTest {
+/**
+ * A test category for SanctionedSerializables.
+ */
+public interface SanctionedSerializablesTest extends SerializationTest {
}
diff --git a/geode-junit/src/main/java/org/apache/geode/test/junit/internal/JUnitSanctionedSerializablesService.java b/geode-junit/src/main/java/org/apache/geode/test/junit/internal/JUnitSanctionedSerializablesService.java
index 0c3030e..4de5d3a 100644
--- a/geode-junit/src/main/java/org/apache/geode/test/junit/internal/JUnitSanctionedSerializablesService.java
+++ b/geode-junit/src/main/java/org/apache/geode/test/junit/internal/JUnitSanctionedSerializablesService.java
@@ -16,7 +16,7 @@ package org.apache.geode.test.junit.internal;
import java.net.URL;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
public class JUnitSanctionedSerializablesService implements SanctionedSerializablesService {
diff --git a/geode-junit/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService b/geode-junit/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
similarity index 100%
rename from geode-junit/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService
rename to geode-junit/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
diff --git a/geode-lucene/src/integrationTest/java/org/apache/geode/cache/lucene/internal/LuceneSanctionedSerializablesServiceIntegrationTest.java b/geode-lucene/src/integrationTest/java/org/apache/geode/cache/lucene/internal/LuceneSanctionedSerializablesServiceIntegrationTest.java
index 2c6ba29..f88e099 100644
--- a/geode-lucene/src/integrationTest/java/org/apache/geode/cache/lucene/internal/LuceneSanctionedSerializablesServiceIntegrationTest.java
+++ b/geode-lucene/src/integrationTest/java/org/apache/geode/cache/lucene/internal/LuceneSanctionedSerializablesServiceIntegrationTest.java
@@ -17,7 +17,7 @@ package org.apache.geode.cache.lucene.internal;
import org.junit.experimental.categories.Category;
import org.apache.geode.codeAnalysis.SanctionedSerializablesServiceIntegrationTestBase;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
import org.apache.geode.test.junit.categories.SanctionedSerializablesTest;
import org.apache.geode.test.junit.categories.SerializationTest;
diff --git a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneSanctionedSerializablesService.java b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneSanctionedSerializablesService.java
index 918c05d..57db794 100644
--- a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneSanctionedSerializablesService.java
+++ b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneSanctionedSerializablesService.java
@@ -16,7 +16,7 @@ package org.apache.geode.cache.lucene.internal;
import java.net.URL;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
public class LuceneSanctionedSerializablesService implements SanctionedSerializablesService {
diff --git a/geode-lucene/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService b/geode-lucene/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
similarity index 100%
rename from geode-lucene/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService
rename to geode-lucene/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
diff --git a/geode-management/src/integrationTest/java/org/apache/geode/management/internal/ManagementSanctionedSerializablesServiceIntegrationTest.java b/geode-management/src/integrationTest/java/org/apache/geode/management/internal/ManagementSanctionedSerializablesServiceIntegrationTest.java
index e2f1c10..7a54d77 100644
--- a/geode-management/src/integrationTest/java/org/apache/geode/management/internal/ManagementSanctionedSerializablesServiceIntegrationTest.java
+++ b/geode-management/src/integrationTest/java/org/apache/geode/management/internal/ManagementSanctionedSerializablesServiceIntegrationTest.java
@@ -17,7 +17,7 @@ package org.apache.geode.management.internal;
import org.junit.experimental.categories.Category;
import org.apache.geode.codeAnalysis.SanctionedSerializablesServiceIntegrationTestBase;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
import org.apache.geode.test.junit.categories.SanctionedSerializablesTest;
import org.apache.geode.test.junit.categories.SerializationTest;
diff --git a/geode-management/src/main/java/org/apache/geode/management/internal/ManagementSanctionedSerializablesService.java b/geode-management/src/main/java/org/apache/geode/management/internal/ManagementSanctionedSerializablesService.java
index 6e232a5..051cc1d 100644
--- a/geode-management/src/main/java/org/apache/geode/management/internal/ManagementSanctionedSerializablesService.java
+++ b/geode-management/src/main/java/org/apache/geode/management/internal/ManagementSanctionedSerializablesService.java
@@ -16,7 +16,7 @@ package org.apache.geode.management.internal;
import java.net.URL;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
public class ManagementSanctionedSerializablesService implements SanctionedSerializablesService {
diff --git a/geode-management/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService b/geode-management/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
similarity index 100%
rename from geode-management/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService
rename to geode-management/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
diff --git a/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/MembershipDependenciesJUnitTest.java b/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/MembershipDependenciesJUnitTest.java
index 08211f8..d50d2e8 100644
--- a/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/MembershipDependenciesJUnitTest.java
+++ b/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/MembershipDependenciesJUnitTest.java
@@ -58,7 +58,6 @@ public class MembershipDependenciesJUnitTest {
.or(resideInAPackage("org.apache.geode.internal.inet.."))
.or(resideInAPackage("org.apache.geode.internal.lang.."))
.or(resideInAPackage("org.apache.geode.codeAnalysis.."))
-
.or(not(resideInAPackage("org.apache.geode..")))
.or(type(AvailablePortHelper.class))
diff --git a/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/MembershipSanctionedSerializablesServiceIntegrationTest.java b/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/MembershipSanctionedSerializablesServiceIntegrationTest.java
index cc1e6e9..1758efc 100644
--- a/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/MembershipSanctionedSerializablesServiceIntegrationTest.java
+++ b/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/MembershipSanctionedSerializablesServiceIntegrationTest.java
@@ -17,7 +17,7 @@ package org.apache.geode.distributed.internal.membership.gms;
import org.junit.experimental.categories.Category;
import org.apache.geode.codeAnalysis.SanctionedSerializablesServiceIntegrationTestBase;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
import org.apache.geode.test.junit.categories.SanctionedSerializablesTest;
import org.apache.geode.test.junit.categories.SerializationTest;
diff --git a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/MembershipSanctionedSerializablesService.java b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/MembershipSanctionedSerializablesService.java
index b611b75..9311b06 100644
--- a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/MembershipSanctionedSerializablesService.java
+++ b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/MembershipSanctionedSerializablesService.java
@@ -16,7 +16,7 @@ package org.apache.geode.distributed.internal.membership.gms;
import java.net.URL;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
public class MembershipSanctionedSerializablesService implements SanctionedSerializablesService {
diff --git a/geode-membership/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService b/geode-membership/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
similarity index 100%
rename from geode-membership/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService
rename to geode-membership/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
diff --git a/geode-memcached/src/integrationTest/java/org/apache/geode/internal/memcached/MemcachedSanctionedSerializablesServiceIntegrationTest.java b/geode-memcached/src/integrationTest/java/org/apache/geode/internal/memcached/MemcachedSanctionedSerializablesServiceIntegrationTest.java
index 536b61b..9badf90 100644
--- a/geode-memcached/src/integrationTest/java/org/apache/geode/internal/memcached/MemcachedSanctionedSerializablesServiceIntegrationTest.java
+++ b/geode-memcached/src/integrationTest/java/org/apache/geode/internal/memcached/MemcachedSanctionedSerializablesServiceIntegrationTest.java
@@ -17,7 +17,7 @@ package org.apache.geode.internal.memcached;
import org.junit.experimental.categories.Category;
import org.apache.geode.codeAnalysis.SanctionedSerializablesServiceIntegrationTestBase;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
import org.apache.geode.test.junit.categories.SanctionedSerializablesTest;
import org.apache.geode.test.junit.categories.SerializationTest;
diff --git a/geode-memcached/src/main/java/org/apache/geode/internal/memcached/MemcachedSanctionedSerializablesService.java b/geode-memcached/src/main/java/org/apache/geode/internal/memcached/MemcachedSanctionedSerializablesService.java
index ab04e2d..014a234 100644
--- a/geode-memcached/src/main/java/org/apache/geode/internal/memcached/MemcachedSanctionedSerializablesService.java
+++ b/geode-memcached/src/main/java/org/apache/geode/internal/memcached/MemcachedSanctionedSerializablesService.java
@@ -16,7 +16,7 @@ package org.apache.geode.internal.memcached;
import java.net.URL;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
public class MemcachedSanctionedSerializablesService implements SanctionedSerializablesService {
diff --git a/geode-memcached/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService b/geode-memcached/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
similarity index 100%
rename from geode-memcached/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService
rename to geode-memcached/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
diff --git a/geode-redis/src/main/java/org/apache/geode/redis/internal/RedisSanctionedSerializablesService.java b/geode-redis/src/main/java/org/apache/geode/redis/internal/RedisSanctionedSerializablesService.java
index d9853ef..59842e1 100644
--- a/geode-redis/src/main/java/org/apache/geode/redis/internal/RedisSanctionedSerializablesService.java
+++ b/geode-redis/src/main/java/org/apache/geode/redis/internal/RedisSanctionedSerializablesService.java
@@ -16,7 +16,7 @@ package org.apache.geode.redis.internal;
import java.net.URL;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
public class RedisSanctionedSerializablesService implements SanctionedSerializablesService {
diff --git a/geode-redis/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService b/geode-redis/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
similarity index 100%
copy from geode-redis/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService
copy to geode-redis/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
diff --git a/geode-redis/src/test/java/org/apache/geode/redis/internal/executor/RedisSanctionedSerializablesServiceIntegrationTest.java b/geode-redis/src/test/java/org/apache/geode/redis/internal/executor/RedisSanctionedSerializablesServiceIntegrationTest.java
index 420db71..82f8cf9 100644
--- a/geode-redis/src/test/java/org/apache/geode/redis/internal/executor/RedisSanctionedSerializablesServiceIntegrationTest.java
+++ b/geode-redis/src/test/java/org/apache/geode/redis/internal/executor/RedisSanctionedSerializablesServiceIntegrationTest.java
@@ -17,7 +17,7 @@ package org.apache.geode.redis.internal;
import org.junit.experimental.categories.Category;
import org.apache.geode.codeAnalysis.SanctionedSerializablesServiceIntegrationTestBase;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
import org.apache.geode.test.junit.categories.SanctionedSerializablesTest;
import org.apache.geode.test.junit.categories.SerializationTest;
diff --git a/geode-redis/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService b/geode-redis/src/test/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
similarity index 100%
rename from geode-redis/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService
rename to geode-redis/src/test/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
diff --git a/geode-serialization/build.gradle b/geode-serialization/build.gradle
index c918683..3ff7bb4 100755
--- a/geode-serialization/build.gradle
+++ b/geode-serialization/build.gradle
@@ -24,10 +24,14 @@ dependencies {
//Geode-common has annotations and other pieces used by geode-serialization
implementation(project(':geode-common'))
+ implementation(project(':geode-logging'))
//FastUtil contains optimized collections that are used in multiple places in core
implementation('it.unimi.dsi:fastutil')
+ // serialization filtering uses Apache Commons
+ implementation('org.apache.commons:commons-lang3')
+
//Log4j is used everywhere
implementation('org.apache.logging.log4j:log4j-api')
diff --git a/geode-serialization/src/integrationTest/java/org/apache/geode/internal/serialization/SerializationSanctionedSerializablesServiceIntegrationTest.java b/geode-serialization/src/integrationTest/java/org/apache/geode/internal/serialization/SerializationSanctionedSerializablesServiceIntegrationTest.java
index f733ee7..5c54d94 100644
--- a/geode-serialization/src/integrationTest/java/org/apache/geode/internal/serialization/SerializationSanctionedSerializablesServiceIntegrationTest.java
+++ b/geode-serialization/src/integrationTest/java/org/apache/geode/internal/serialization/SerializationSanctionedSerializablesServiceIntegrationTest.java
@@ -17,6 +17,7 @@ package org.apache.geode.internal.serialization;
import org.junit.experimental.categories.Category;
import org.apache.geode.codeAnalysis.SanctionedSerializablesServiceIntegrationTestBase;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
import org.apache.geode.test.junit.categories.SanctionedSerializablesTest;
import org.apache.geode.test.junit.categories.SerializationTest;
diff --git a/geode-wan/src/main/resources/org/apache/geode/internal/cache/wan/sanctioned-geode-wan-serializables.txt b/geode-serialization/src/integrationTest/resources/org/apache/geode/codeAnalysis/excludedClasses.txt
old mode 100755
new mode 100644
similarity index 100%
copy from geode-wan/src/main/resources/org/apache/geode/internal/cache/wan/sanctioned-geode-wan-serializables.txt
copy to geode-serialization/src/integrationTest/resources/org/apache/geode/codeAnalysis/excludedClasses.txt
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/SerializationSanctionedSerializablesService.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/SerializationSanctionedSerializablesService.java
index 52827f2..5957db6 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/SerializationSanctionedSerializablesService.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/SerializationSanctionedSerializablesService.java
@@ -16,6 +16,8 @@ package org.apache.geode.internal.serialization;
import java.net.URL;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
+
public class SerializationSanctionedSerializablesService implements SanctionedSerializablesService {
@Override
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/SanctionedSerializables.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializables.java
similarity index 64%
rename from geode-serialization/src/main/java/org/apache/geode/internal/serialization/SanctionedSerializables.java
rename to geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializables.java
index 7b9a77f..a493c58 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/SanctionedSerializables.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializables.java
@@ -12,7 +12,7 @@
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
-package org.apache.geode.internal.serialization;
+package org.apache.geode.internal.serialization.filter;
import static java.util.Collections.emptyList;
@@ -20,20 +20,33 @@ import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
+import java.io.UncheckedIOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.HashSet;
import java.util.ServiceLoader;
+import java.util.Set;
+
+import org.apache.logging.log4j.Logger;
+
+import org.apache.geode.logging.internal.log4j.api.LogService;
public class SanctionedSerializables {
+ private static final Logger logger = LogService.getLogger();
+
+ private SanctionedSerializables() {
+ // do not instantiate
+ }
+
/**
* Loads all SanctionedSerializablesServices on the classpath.
*/
- public static Collection<SanctionedSerializablesService> loadSanctionedSerializablesServices() {
+ public static Set<SanctionedSerializablesService> loadSanctionedSerializablesServices() {
ServiceLoader<SanctionedSerializablesService> loader =
ServiceLoader.load(SanctionedSerializablesService.class);
- Collection<SanctionedSerializablesService> services = new ArrayList<>();
+ Set<SanctionedSerializablesService> services = new HashSet<>();
for (SanctionedSerializablesService service : loader) {
services.add(service);
}
@@ -62,4 +75,22 @@ public class SanctionedSerializables {
}
return result;
}
+
+ public static Set<String> loadSanctionedClassNames(
+ Iterable<SanctionedSerializablesService> services) {
+ Set<String> sanctionedClasses = new HashSet<>(650);
+ for (SanctionedSerializablesService service : services) {
+ try {
+ Collection<String> classNames = service.getSerializationAcceptlist();
+ logger.info("loaded {} sanctioned serializables from {}", classNames.size(),
+ service.getClass().getSimpleName());
+ sanctionedClasses.addAll(classNames);
+ } catch (IOException e) {
+ throw new UncheckedIOException(
+ "Unable to initialize serialization filter for " + service,
+ e);
+ }
+ }
+ return sanctionedClasses;
+ }
}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/SanctionedSerializablesService.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesService.java
similarity index 95%
rename from geode-serialization/src/main/java/org/apache/geode/internal/serialization/SanctionedSerializablesService.java
rename to geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesService.java
index ad40721..1d139ce 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/SanctionedSerializablesService.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesService.java
@@ -12,7 +12,7 @@
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
-package org.apache.geode.internal.serialization;
+package org.apache.geode.internal.serialization.filter;
import java.io.IOException;
import java.net.URL;
diff --git a/geode-serialization/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService b/geode-serialization/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
similarity index 100%
rename from geode-serialization/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService
rename to geode-serialization/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/SerializationDependenciesJUnitTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/SerializationDependenciesTest.java
similarity index 75%
rename from geode-serialization/src/test/java/org/apache/geode/internal/serialization/SerializationDependenciesJUnitTest.java
rename to geode-serialization/src/test/java/org/apache/geode/internal/serialization/SerializationDependenciesTest.java
index f10845b..199cb0f 100644
--- a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/SerializationDependenciesJUnitTest.java
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/SerializationDependenciesTest.java
@@ -18,7 +18,8 @@ import static com.tngtech.archunit.base.DescribedPredicate.not;
import static com.tngtech.archunit.core.domain.JavaClass.Predicates.resideInAPackage;
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes;
-import com.tngtech.archunit.core.importer.ImportOption;
+import com.tngtech.archunit.core.importer.ImportOption.DoNotIncludeArchives;
+import com.tngtech.archunit.core.importer.ImportOption.DoNotIncludeTests;
import com.tngtech.archunit.junit.AnalyzeClasses;
import com.tngtech.archunit.junit.ArchTest;
import com.tngtech.archunit.junit.ArchUnitRunner;
@@ -26,22 +27,22 @@ import com.tngtech.archunit.junit.CacheMode;
import com.tngtech.archunit.lang.ArchRule;
import org.junit.runner.RunWith;
-
@RunWith(ArchUnitRunner.class)
-@AnalyzeClasses(packages = "org.apache.geode.internal.serialization..",
+@AnalyzeClasses(
+ packages = "org.apache.geode.internal.serialization..",
cacheMode = CacheMode.PER_CLASS,
- importOptions = {ImportOption.DoNotIncludeArchives.class, ImportOption.DoNotIncludeTests.class})
-public class SerializationDependenciesJUnitTest {
+ importOptions = {DoNotIncludeArchives.class, DoNotIncludeTests.class})
+public class SerializationDependenciesTest {
@ArchTest
- public static final ArchRule serializationDoesntDependOnCoreProvisional = classes()
+ public static final ArchRule serializationDoesNotDependOnCore = classes()
.that()
.resideInAPackage("org.apache.geode.internal.serialization..")
-
.should()
.onlyDependOnClassesThat(
resideInAPackage("org.apache.geode.internal.serialization..")
.or(not(resideInAPackage("org.apache.geode..")))
+ .or(resideInAPackage("org.apache.geode.annotations.."))
+ .or(resideInAPackage("org.apache.geode.logging.."))
.or(resideInAPackage("org.apache.geode.test..")));
-
}
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesTest.java
new file mode 100644
index 0000000..33c4684
--- /dev/null
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesTest.java
@@ -0,0 +1,95 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.util.Arrays.asList;
+import static java.util.Collections.emptySet;
+import static org.apache.geode.internal.serialization.filter.SanctionedSerializables.loadSanctionedClassNames;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.catchThrowable;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.junit.Test;
+
+public class SanctionedSerializablesTest {
+
+ @Test
+ public void returnsAcceptListFromSanctionedSerializablesService() {
+ Collection<SanctionedSerializablesService> services = new HashSet<>();
+ services.add(serviceWithSanctionedSerializablesOf("foo", "bar"));
+
+ Set<String> result = loadSanctionedClassNames(services);
+
+ assertThat(result).containsExactlyInAnyOrder("foo", "bar");
+ }
+
+ @Test
+ public void returnsAcceptListsFromManySanctionedSerializablesServices() {
+ Collection<SanctionedSerializablesService> services = new HashSet<>();
+ services.add(serviceWithSanctionedSerializablesOf("foo", "bar"));
+ services.add(serviceWithSanctionedSerializablesOf("the", "fox"));
+ services.add(serviceWithSanctionedSerializablesOf("a", "bear"));
+
+ Set<String> result = loadSanctionedClassNames(services);
+
+ assertThat(result).containsExactlyInAnyOrder("foo", "bar", "the", "fox", "a", "bear");
+ }
+
+ @Test
+ public void nullThrowsNullPointerException() {
+ Throwable thrown = catchThrowable(() -> {
+ loadSanctionedClassNames(null);
+ });
+
+ assertThat(thrown).isInstanceOf(NullPointerException.class);
+ }
+
+ @Test
+ public void emptyServicesReturnsEmptySet() {
+ Set<String> result = loadSanctionedClassNames(emptySet());
+
+ assertThat(result).isEmpty();
+ }
+
+ @Test
+ public void servicesWithEmptyAcceptListsReturnsEmptySet() {
+ Collection<SanctionedSerializablesService> services = new HashSet<>();
+ services.add(serviceWithSanctionedSerializablesOf());
+ services.add(serviceWithSanctionedSerializablesOf());
+ services.add(serviceWithSanctionedSerializablesOf());
+
+ Set<String> result = loadSanctionedClassNames(services);
+
+ assertThat(result).isEmpty();
+ }
+
+ private static SanctionedSerializablesService serviceWithSanctionedSerializablesOf(
+ String... classNames) {
+ try {
+ SanctionedSerializablesService service = mock(SanctionedSerializablesService.class);
+ when(service.getSerializationAcceptlist()).thenReturn(asList(classNames));
+ return service;
+ } catch (IOException e) {
+ throw new UncheckedIOException(e);
+ }
+ }
+}
diff --git a/geode-serialization/src/test/resources/expected-pom.xml b/geode-serialization/src/test/resources/expected-pom.xml
index 3da2a5a..ae1f34e 100644
--- a/geode-serialization/src/test/resources/expected-pom.xml
+++ b/geode-serialization/src/test/resources/expected-pom.xml
@@ -52,11 +52,21 @@
<scope>runtime</scope>
</dependency>
<dependency>
+ <groupId>org.apache.geode</groupId>
+ <artifactId>geode-logging</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+ <dependency>
<groupId>it.unimi.dsi</groupId>
<artifactId>fastutil</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-lang3</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+ <dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<scope>runtime</scope>
diff --git a/geode-wan/src/integrationTest/java/org/apache/geode/internal/cache/wan/WANSanctionedSerializablesServiceIntegrationTest.java b/geode-wan/src/integrationTest/java/org/apache/geode/cache/wan/internal/WANSanctionedSerializablesServiceIntegrationTest.java
similarity index 92%
rename from geode-wan/src/integrationTest/java/org/apache/geode/internal/cache/wan/WANSanctionedSerializablesServiceIntegrationTest.java
rename to geode-wan/src/integrationTest/java/org/apache/geode/cache/wan/internal/WANSanctionedSerializablesServiceIntegrationTest.java
index 49749d4..a6bacf7 100644
--- a/geode-wan/src/integrationTest/java/org/apache/geode/internal/cache/wan/WANSanctionedSerializablesServiceIntegrationTest.java
+++ b/geode-wan/src/integrationTest/java/org/apache/geode/cache/wan/internal/WANSanctionedSerializablesServiceIntegrationTest.java
@@ -12,12 +12,12 @@
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
-package org.apache.geode.internal.cache.wan;
+package org.apache.geode.cache.wan.internal;
import org.junit.experimental.categories.Category;
import org.apache.geode.codeAnalysis.SanctionedSerializablesServiceIntegrationTestBase;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
import org.apache.geode.test.junit.categories.SanctionedSerializablesTest;
import org.apache.geode.test.junit.categories.SerializationTest;
diff --git a/geode-wan/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeWANSerializablesIntegrationTest.java b/geode-wan/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeWANSerializablesIntegrationTest.java
index 0f42cb5..cd02f06 100644
--- a/geode-wan/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeWANSerializablesIntegrationTest.java
+++ b/geode-wan/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeWANSerializablesIntegrationTest.java
@@ -18,7 +18,7 @@ import java.util.Optional;
import org.junit.experimental.categories.Category;
-import org.apache.geode.internal.cache.wan.WANSanctionedSerializablesService;
+import org.apache.geode.cache.wan.internal.WANSanctionedSerializablesService;
import org.apache.geode.test.junit.categories.SerializationTest;
import org.apache.geode.test.junit.categories.WanTest;
diff --git a/geode-wan/src/main/java/org/apache/geode/internal/cache/wan/WANSanctionedSerializablesService.java b/geode-wan/src/main/java/org/apache/geode/cache/wan/internal/WANSanctionedSerializablesService.java
similarity index 88%
rename from geode-wan/src/main/java/org/apache/geode/internal/cache/wan/WANSanctionedSerializablesService.java
rename to geode-wan/src/main/java/org/apache/geode/cache/wan/internal/WANSanctionedSerializablesService.java
index 0c92c02..6513569 100644
--- a/geode-wan/src/main/java/org/apache/geode/internal/cache/wan/WANSanctionedSerializablesService.java
+++ b/geode-wan/src/main/java/org/apache/geode/cache/wan/internal/WANSanctionedSerializablesService.java
@@ -12,11 +12,11 @@
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
-package org.apache.geode.internal.cache.wan;
+package org.apache.geode.cache.wan.internal;
import java.net.URL;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
public class WANSanctionedSerializablesService implements SanctionedSerializablesService {
diff --git a/geode-wan/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService b/geode-wan/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
similarity index 92%
rename from geode-wan/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService
rename to geode-wan/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
index c6090ca..6ad149d 100644
--- a/geode-wan/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService
+++ b/geode-wan/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
@@ -12,4 +12,4 @@
# or implied. See the License for the specific language governing permissions and limitations under
# the License.
#
-org.apache.geode.internal.cache.wan.WANSanctionedSerializablesService
+org.apache.geode.cache.wan.internal.WANSanctionedSerializablesService
diff --git a/geode-wan/src/main/resources/org/apache/geode/internal/cache/wan/sanctioned-geode-wan-serializables.txt b/geode-wan/src/main/resources/org/apache/geode/cache/wan/internal/sanctioned-geode-wan-serializables.txt
similarity index 100%
rename from geode-wan/src/main/resources/org/apache/geode/internal/cache/wan/sanctioned-geode-wan-serializables.txt
rename to geode-wan/src/main/resources/org/apache/geode/cache/wan/internal/sanctioned-geode-wan-serializables.txt
diff --git a/geode-web-api/src/integrationTest/java/org/apache/geode/rest/internal/WebApiSanctionedSerializablesServiceIntegrationTest.java b/geode-web-api/src/integrationTest/java/org/apache/geode/rest/internal/WebApiSanctionedSerializablesServiceIntegrationTest.java
index 8408c24..05ab52b 100644
--- a/geode-web-api/src/integrationTest/java/org/apache/geode/rest/internal/WebApiSanctionedSerializablesServiceIntegrationTest.java
+++ b/geode-web-api/src/integrationTest/java/org/apache/geode/rest/internal/WebApiSanctionedSerializablesServiceIntegrationTest.java
@@ -17,7 +17,7 @@ package org.apache.geode.rest.internal;
import org.junit.experimental.categories.Category;
import org.apache.geode.codeAnalysis.SanctionedSerializablesServiceIntegrationTestBase;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
import org.apache.geode.test.junit.categories.SanctionedSerializablesTest;
import org.apache.geode.test.junit.categories.SerializationTest;
diff --git a/geode-web-api/src/main/java/org/apache/geode/rest/internal/WebApiSanctionedSerializablesService.java b/geode-web-api/src/main/java/org/apache/geode/rest/internal/WebApiSanctionedSerializablesService.java
index 846a02e..9d24c0b 100644
--- a/geode-web-api/src/main/java/org/apache/geode/rest/internal/WebApiSanctionedSerializablesService.java
+++ b/geode-web-api/src/main/java/org/apache/geode/rest/internal/WebApiSanctionedSerializablesService.java
@@ -16,7 +16,7 @@ package org.apache.geode.rest.internal;
import java.net.URL;
-import org.apache.geode.internal.serialization.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
public class WebApiSanctionedSerializablesService implements SanctionedSerializablesService {
diff --git a/geode-web-api/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService b/geode-web-api/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
similarity index 100%
rename from geode-web-api/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.SanctionedSerializablesService
rename to geode-web-api/src/main/resources/META-INF/services/org.apache.geode.internal.serialization.filter.SanctionedSerializablesService
[geode] 01/06: GEODE-9817: Enable customized source set paths for ClassAnalysisRule (#7121)
Posted by kl...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
klund pushed a commit to branch support/1.12
in repository https://gitbox.apache.org/repos/asf/geode.git
commit 3a211774c34a33697de4bceca2baad2ff0229d82
Author: Kirk Lund <kl...@apache.org>
AuthorDate: Thu Nov 18 16:23:36 2021 -0800
GEODE-9817: Enable customized source set paths for ClassAnalysisRule (#7121)
Adds support for customizing source set paths of ClassAnalysisRule.
PROBLEM
Modules external to Geode must be structured the same as Geode
source code in order to use ClassAnalysisRule and the
Analyze*Serializables tests. This is necessary to better facilitate
pluggability of modules that need to provide sanctioned serializable
lists.
SOLUTION
Add source set path customization to ClassAnalysisRule, introduce
a new layer of Analyze*Serializables test base classes that can be
directly extended in order to customize source set paths in
ClassAnalysisRule. Also includes improvements to some iterating
of classes during analysis.
(cherry picked from commit 5d1e91932dff296632916a6ceccfb36039357acd)
---
...lyzeConnectorsSerializablesIntegrationTest.java | 2 +-
.../AnalyzeCoreSerializablesIntegrationTest.java | 3 +-
.../AnalyzeCQSerializablesIntegrationTest.java | 3 +-
.../AnalyzeDUnitSerializablesIntegrationTest.java | 4 +-
.../AnalyzeGfshSerializablesIntegrationTest.java | 3 +-
.../AnalyzeJUnitSerializablesIntegrationTest.java | 3 +-
....java => AnalyzeDataSerializablesTestBase.java} | 74 ++++++++++------------
...SerializablesWithClassAnalysisRuleTestBase.java | 27 ++++----
...Base.java => AnalyzeSerializablesTestBase.java} | 41 ++++++++----
...SerializablesWithClassAnalysisRuleTestBase.java | 24 ++++---
...nedSerializablesServiceIntegrationTestBase.java | 6 +-
.../geode/test/junit/rules/ClassAnalysisRule.java | 23 ++++---
.../AnalyzeLuceneSerializablesIntegrationTest.java | 3 +-
...lyzeManagementSerializablesIntegrationTest.java | 2 +-
...lyzeMembershipSerializablesIntegrationTest.java | 2 +-
...alyzeMemcachedSerializablesIntegrationTest.java | 2 +-
.../AnalyzePulseSerializablesIntegrationTest.java | 3 +-
.../AnalyzeRedisSerializablesIntegrationTest.java | 3 +-
...eSerializationSerializablesIntegrationTest.java | 2 +-
.../AnalyzeWANSerializablesIntegrationTest.java | 3 +-
.../AnalyzeWebApiSerializablesIntegrationTest.java | 3 +-
21 files changed, 134 insertions(+), 102 deletions(-)
diff --git a/geode-connectors/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeConnectorsSerializablesIntegrationTest.java b/geode-connectors/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeConnectorsSerializablesIntegrationTest.java
index a5fa5a1..db50c2f 100644
--- a/geode-connectors/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeConnectorsSerializablesIntegrationTest.java
+++ b/geode-connectors/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeConnectorsSerializablesIntegrationTest.java
@@ -23,7 +23,7 @@ import org.apache.geode.test.junit.categories.SerializationTest;
@Category(SerializationTest.class)
public class AnalyzeConnectorsSerializablesIntegrationTest
- extends AnalyzeSerializablesJUnitTestBase {
+ extends AnalyzeSerializablesWithClassAnalysisRuleTestBase {
@Override
protected String getModuleName() {
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeCoreSerializablesIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeCoreSerializablesIntegrationTest.java
index 6832442..d93d8d1 100755
--- a/geode-core/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeCoreSerializablesIntegrationTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeCoreSerializablesIntegrationTest.java
@@ -22,7 +22,8 @@ import org.apache.geode.internal.CoreSanctionedSerializablesService;
import org.apache.geode.test.junit.categories.SerializationTest;
@Category(SerializationTest.class)
-public class AnalyzeCoreSerializablesIntegrationTest extends AnalyzeSerializablesJUnitTestBase {
+public class AnalyzeCoreSerializablesIntegrationTest
+ extends AnalyzeSerializablesWithClassAnalysisRuleTestBase {
@Override
protected String getModuleName() {
diff --git a/geode-cq/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeCQSerializablesIntegrationTest.java b/geode-cq/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeCQSerializablesIntegrationTest.java
index 96c036a..3235c7b 100755
--- a/geode-cq/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeCQSerializablesIntegrationTest.java
+++ b/geode-cq/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeCQSerializablesIntegrationTest.java
@@ -23,7 +23,8 @@ import org.apache.geode.test.junit.categories.ClientSubscriptionTest;
import org.apache.geode.test.junit.categories.SerializationTest;
@Category({ClientSubscriptionTest.class, SerializationTest.class})
-public class AnalyzeCQSerializablesIntegrationTest extends AnalyzeSerializablesJUnitTestBase {
+public class AnalyzeCQSerializablesIntegrationTest
+ extends AnalyzeSerializablesWithClassAnalysisRuleTestBase {
@Override
protected String getModuleName() {
diff --git a/geode-dunit/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeDUnitSerializablesIntegrationTest.java b/geode-dunit/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeDUnitSerializablesIntegrationTest.java
index f188c06..601b57c 100644
--- a/geode-dunit/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeDUnitSerializablesIntegrationTest.java
+++ b/geode-dunit/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeDUnitSerializablesIntegrationTest.java
@@ -27,7 +27,9 @@ import org.apache.geode.test.dunit.internal.Master;
import org.apache.geode.test.junit.categories.SerializationTest;
@Category(SerializationTest.class)
-public class AnalyzeDUnitSerializablesIntegrationTest extends AnalyzeSerializablesJUnitTestBase {
+public class AnalyzeDUnitSerializablesIntegrationTest
+ extends AnalyzeSerializablesWithClassAnalysisRuleTestBase {
+
private static final Logger logger = LogService.getLogger();
private static final Set<Class<?>> IGNORE_CLASSES = new HashSet<>();
diff --git a/geode-gfsh/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeGfshSerializablesIntegrationTest.java b/geode-gfsh/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeGfshSerializablesIntegrationTest.java
index fb4e398..1de44bf 100755
--- a/geode-gfsh/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeGfshSerializablesIntegrationTest.java
+++ b/geode-gfsh/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeGfshSerializablesIntegrationTest.java
@@ -22,7 +22,8 @@ import org.apache.geode.management.internal.GfshSanctionedSerializablesService;
import org.apache.geode.test.junit.categories.SerializationTest;
@Category(SerializationTest.class)
-public class AnalyzeGfshSerializablesIntegrationTest extends AnalyzeSerializablesJUnitTestBase {
+public class AnalyzeGfshSerializablesIntegrationTest
+ extends AnalyzeSerializablesWithClassAnalysisRuleTestBase {
@Override
protected String getModuleName() {
diff --git a/geode-junit/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeJUnitSerializablesIntegrationTest.java b/geode-junit/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeJUnitSerializablesIntegrationTest.java
index 6e4aeab..cc225ff 100644
--- a/geode-junit/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeJUnitSerializablesIntegrationTest.java
+++ b/geode-junit/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeJUnitSerializablesIntegrationTest.java
@@ -28,7 +28,8 @@ import org.apache.geode.test.junit.categories.SerializationTest;
import org.apache.geode.test.junit.internal.JUnitSanctionedSerializablesService;
@Category(SerializationTest.class)
-public class AnalyzeJUnitSerializablesIntegrationTest extends AnalyzeSerializablesJUnitTestBase {
+public class AnalyzeJUnitSerializablesIntegrationTest
+ extends AnalyzeSerializablesWithClassAnalysisRuleTestBase {
private static final Set<Class<?>> IGNORE_CLASSES = new HashSet<>(asList(
PortfolioNoDS.class, PortfolioPdx.class));
diff --git a/geode-junit/src/main/java/org/apache/geode/codeAnalysis/AnalyzeDataSerializablesJUnitTestBase.java b/geode-junit/src/main/java/org/apache/geode/codeAnalysis/AnalyzeDataSerializablesTestBase.java
similarity index 88%
rename from geode-junit/src/main/java/org/apache/geode/codeAnalysis/AnalyzeDataSerializablesJUnitTestBase.java
rename to geode-junit/src/main/java/org/apache/geode/codeAnalysis/AnalyzeDataSerializablesTestBase.java
index 5baa0d3..8c4d60d 100644
--- a/geode-junit/src/main/java/org/apache/geode/codeAnalysis/AnalyzeDataSerializablesJUnitTestBase.java
+++ b/geode-junit/src/main/java/org/apache/geode/codeAnalysis/AnalyzeDataSerializablesTestBase.java
@@ -16,6 +16,7 @@ package org.apache.geode.codeAnalysis;
import static java.util.Collections.emptyList;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.catchThrowable;
import static org.assertj.core.api.Assertions.fail;
import static org.junit.Assert.assertTrue;
@@ -36,7 +37,6 @@ import java.util.List;
import java.util.Map;
import java.util.Optional;
-import org.junit.AfterClass;
import org.junit.Rule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
@@ -47,18 +47,17 @@ import org.apache.geode.codeAnalysis.decode.CompiledMethod;
import org.apache.geode.internal.serialization.BufferDataOutputStream;
import org.apache.geode.internal.serialization.Version;
import org.apache.geode.test.junit.categories.SerializationTest;
-import org.apache.geode.test.junit.rules.ClassAnalysisRule;
/**
* This abstract test class is the basis for all of our AnalyzeModuleNameSerializables tests.
* Subclasses must provide serialization/deserialization methods.
*
* <p>
- * Most tests should subclass {@link AnalyzeSerializablesJUnitTestBase} instead of this
- * class because it ties into geode-core serialization and saves a lot of work.
+ * Most tests should subclass {@link AnalyzeSerializablesWithClassAnalysisRuleTestBase} instead of
+ * this class because it ties into geode-core serialization and saves a lot of work.
*/
@Category({SerializationTest.class})
-public abstract class AnalyzeDataSerializablesJUnitTestBase {
+public abstract class AnalyzeDataSerializablesTestBase {
private static final Path MODULE_ROOT = Paths.get("..", "..", "..").toAbsolutePath().normalize();
private static final Path SOURCE_ROOT = MODULE_ROOT.resolve(Paths.get("src"));
@@ -100,14 +99,6 @@ public abstract class AnalyzeDataSerializablesJUnitTestBase {
@Rule
public TestName testName = new TestName();
- @Rule
- public ClassAnalysisRule classProvider = new ClassAnalysisRule(getModuleName());
-
- @AfterClass
- public static void afterClass() {
- ClassAnalysisRule.clearCache();
- }
-
/**
* implement this to return your module's name, such as "geode-core"
*/
@@ -147,8 +138,10 @@ public abstract class AnalyzeDataSerializablesJUnitTestBase {
}
}
+ protected abstract Map<String, CompiledClass> loadClasses();
+
public void findClasses() throws Exception {
- classes = classProvider.getClasses();
+ classes = loadClasses();
List<String> excludedClasses = loadExcludedClasses(getResourceAsFile(EXCLUDED_CLASSES_TXT));
List<String> openBugs = loadOpenBugs(getResourceAsFile(OPEN_BUGS_TXT));
@@ -209,9 +202,11 @@ public abstract class AnalyzeDataSerializablesJUnitTestBase {
final Object excludedInstance;
try {
excludedInstance = excludedClass.newInstance();
- } catch (InstantiationException | IllegalAccessException e) {
+ } catch (IllegalAccessException | InstantiationException | NullPointerException e) {
// okay - it's in the excludedClasses.txt file after all
- // IllegalAccessException means that the constructor is private.
+ // IllegalAccessException: thrown when non-private constructor does not exist
+ // InstantiationException: thrown when no-arg constructor does not exist
+ // NullPointerException: thrown by constructors that fetch RMI dependencies
continue;
}
serializeAndDeserializeObject(excludedInstance);
@@ -230,17 +225,33 @@ public abstract class AnalyzeDataSerializablesJUnitTestBase {
BufferDataOutputStream outputStream = new BufferDataOutputStream(Version.CURRENT);
try {
serializeObject(object, outputStream);
- } catch (IOException e) {
+ } catch (IOException | NullPointerException e) {
// some classes, such as BackupLock, are Serializable because the extend something
// like ReentrantLock but we never serialize them & it doesn't work to try to do so
System.out.println("Not Serializable: " + object.getClass().getName());
+ return;
+ } catch (Exception e) {
+ /*
+ * NOTE:
+ * this block catches Exception instead of CacheClosedException so that modules without
+ * dependency on geode-core can be tested with Analyze Serializables.
+ *
+ * ex: geode-membership does not depend on geode-core, so it cannot load CacheClosedException
+ */
+ if ("org.apache.geode.cache.CacheClosedException".equals(e.getClass().getName())) {
+ System.out
+ .println("I was unable to serialize " + object.getClass().getName() + " due to " + e);
+ e.printStackTrace();
+ return;
+ }
+ throw e;
}
- try {
- deserializeObject(outputStream);
- fail("I was able to deserialize " + object.getClass().getName());
- } catch (InvalidClassException e) {
- // expected
- }
+
+ Throwable thrown = catchThrowable(() -> deserializeObject(outputStream));
+
+ assertThat(thrown)
+ .withFailMessage("I was able to deserialize " + object.getClass().getName())
+ .isInstanceOf(InvalidClassException.class);
}
private String toBuildPathString(File file) {
@@ -338,18 +349,7 @@ public abstract class AnalyzeDataSerializablesJUnitTestBase {
}
File createEmptyFile(String fileName) throws IOException {
- final String workingDir = System.getProperty("user.dir");
- final String filePath;
- if (isIntelliJDir(workingDir)) {
- String buildDir = workingDir.replace(getModuleName(), "");
- buildDir =
- Paths.get(buildDir, "out", "production", "geode." + getModuleName() + ".integrationTest")
- .toString();
- filePath = buildDir + File.separator + fileName;
- } else {
- filePath = fileName;
- }
- File file = new File(filePath);
+ File file = new File(fileName);
if (file.exists()) {
assertThat(file.delete()).isTrue();
}
@@ -358,10 +358,6 @@ public abstract class AnalyzeDataSerializablesJUnitTestBase {
return file;
}
- private boolean isIntelliJDir(final String workingDir) {
- return !workingDir.contains("build");
- }
-
/**
* Use this method to get a resource stored in the test's resource directory
*/
diff --git a/geode-connectors/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeConnectorsSerializablesIntegrationTest.java b/geode-junit/src/main/java/org/apache/geode/codeAnalysis/AnalyzeDataSerializablesWithClassAnalysisRuleTestBase.java
similarity index 59%
copy from geode-connectors/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeConnectorsSerializablesIntegrationTest.java
copy to geode-junit/src/main/java/org/apache/geode/codeAnalysis/AnalyzeDataSerializablesWithClassAnalysisRuleTestBase.java
index a5fa5a1..3853d4c 100644
--- a/geode-connectors/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeConnectorsSerializablesIntegrationTest.java
+++ b/geode-junit/src/main/java/org/apache/geode/codeAnalysis/AnalyzeDataSerializablesWithClassAnalysisRuleTestBase.java
@@ -14,24 +14,27 @@
*/
package org.apache.geode.codeAnalysis;
-import java.util.Optional;
+import java.util.Map;
-import org.junit.experimental.categories.Category;
+import org.junit.AfterClass;
+import org.junit.Rule;
-import org.apache.geode.connectors.jdbc.internal.ConnectorsSanctionedSerializablesService;
-import org.apache.geode.test.junit.categories.SerializationTest;
+import org.apache.geode.codeAnalysis.decode.CompiledClass;
+import org.apache.geode.test.junit.rules.ClassAnalysisRule;
-@Category(SerializationTest.class)
-public class AnalyzeConnectorsSerializablesIntegrationTest
- extends AnalyzeSerializablesJUnitTestBase {
+public abstract class AnalyzeDataSerializablesWithClassAnalysisRuleTestBase
+ extends AnalyzeDataSerializablesTestBase {
- @Override
- protected String getModuleName() {
- return "geode-connectors";
+ @Rule
+ public ClassAnalysisRule classProvider = new ClassAnalysisRule(getModuleName());
+
+ @AfterClass
+ public static void afterClass() {
+ ClassAnalysisRule.clearCache();
}
@Override
- protected Optional<Class<?>> getModuleClass() {
- return Optional.of(ConnectorsSanctionedSerializablesService.class);
+ protected Map<String, CompiledClass> loadClasses() {
+ return classProvider.getClasses();
}
}
diff --git a/geode-junit/src/main/java/org/apache/geode/codeAnalysis/AnalyzeSerializablesJUnitTestBase.java b/geode-junit/src/main/java/org/apache/geode/codeAnalysis/AnalyzeSerializablesTestBase.java
similarity index 93%
rename from geode-junit/src/main/java/org/apache/geode/codeAnalysis/AnalyzeSerializablesJUnitTestBase.java
rename to geode-junit/src/main/java/org/apache/geode/codeAnalysis/AnalyzeSerializablesTestBase.java
index 0776030..63f8825 100644
--- a/geode-junit/src/main/java/org/apache/geode/codeAnalysis/AnalyzeSerializablesJUnitTestBase.java
+++ b/geode-junit/src/main/java/org/apache/geode/codeAnalysis/AnalyzeSerializablesTestBase.java
@@ -26,10 +26,10 @@ import java.io.Externalizable;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
-import java.io.InvalidClassException;
import java.io.Serializable;
import java.io.UncheckedIOException;
import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
import java.nio.file.Path;
import java.rmi.RemoteException;
@@ -42,8 +42,10 @@ import java.util.Properties;
import java.util.Set;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
+import org.junit.rules.ErrorCollector;
import org.apache.geode.CancelException;
import org.apache.geode.DataSerializable;
@@ -64,8 +66,8 @@ import org.apache.geode.unsafe.internal.sun.reflect.ReflectionFactory;
* InternalDataSerializer. It also performs initialization of the Geode TypeRegistry
*/
@Category(SerializationTest.class)
-public abstract class AnalyzeSerializablesJUnitTestBase
- extends AnalyzeDataSerializablesJUnitTestBase {
+public abstract class AnalyzeSerializablesTestBase
+ extends AnalyzeDataSerializablesTestBase {
private static final String ACTUAL_SERIALIZABLES_DAT = "actualSerializables.dat";
@@ -74,6 +76,9 @@ public abstract class AnalyzeSerializablesJUnitTestBase
protected final List<ClassAndVariableDetails> expectedSerializables = new ArrayList<>();
+ @Rule
+ public ErrorCollector errorCollector = new ErrorCollector();
+
@Before
public void setUp() throws Exception {
TypeRegistry.init();
@@ -202,12 +207,19 @@ public abstract class AnalyzeSerializablesJUnitTestBase
isThrowable ? sanctionedClass.getDeclaredConstructor(String.class)
: sanctionedClass.getDeclaredConstructor((Class<?>[]) null);
constructor.setAccessible(true);
- sanctionedInstance =
- isThrowable ? constructor.newInstance("test throwable") : constructor.newInstance();
+ if (isThrowable) {
+ sanctionedInstance = constructor.newInstance("test throwable");
+ } else {
+ sanctionedInstance = constructor.newInstance();
+ }
serializeAndDeserializeSanctionedObject(sanctionedInstance);
continue;
- } catch (NoSuchMethodException | InstantiationException | IllegalAccessException e) {
+ } catch (NoSuchMethodException | InstantiationException | IllegalAccessException
+ | NullPointerException | InvocationTargetException e) {
// fall through
+ } catch (Exception e) {
+ errorCollector.addError(e);
+ continue;
}
try {
Class<?> superClass = sanctionedClass;
@@ -339,22 +351,23 @@ public abstract class AnalyzeSerializablesJUnitTestBase
private void serializeAndDeserializeSanctionedObject(Object object) throws Exception {
BufferDataOutputStream outputStream = new BufferDataOutputStream(Version.CURRENT);
+
try {
serializeObject(object, outputStream);
} catch (RemoteException e) {
- fail(object.getClass().getName() +
- " is a java.rmi.server.RemoteObject which is not supported by AnalyzeSerializables", e);
- } catch (IOException e) {
- // some classes, such as BackupLock, are Serializable because the extend something
- // like ReentrantLock but we never serialize them & it doesn't work to try to do so
- throw new AssertionError("Not Serializable: " + object.getClass().getName(), e);
+ // java.rmi.server.RemoteObject which is not supported by AnalyzeSerializables
+ } catch (Exception e) {
+ errorCollector.addError(
+ new AssertionError("I was unable to serialize " + object.getClass().getName(), e));
}
+
try {
deserializeObject(outputStream);
} catch (CancelException e) {
// PDX classes fish for a PDXRegistry and find that there is no cache
- } catch (InvalidClassException e) {
- fail("I was unable to deserialize " + object.getClass().getName(), e);
+ } catch (Exception e) {
+ errorCollector.addError(
+ new AssertionError("I was unable to deserialize " + object.getClass().getName(), e));
}
}
diff --git a/geode-connectors/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeConnectorsSerializablesIntegrationTest.java b/geode-junit/src/main/java/org/apache/geode/codeAnalysis/AnalyzeSerializablesWithClassAnalysisRuleTestBase.java
similarity index 63%
copy from geode-connectors/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeConnectorsSerializablesIntegrationTest.java
copy to geode-junit/src/main/java/org/apache/geode/codeAnalysis/AnalyzeSerializablesWithClassAnalysisRuleTestBase.java
index a5fa5a1..158bd6b 100644
--- a/geode-connectors/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeConnectorsSerializablesIntegrationTest.java
+++ b/geode-junit/src/main/java/org/apache/geode/codeAnalysis/AnalyzeSerializablesWithClassAnalysisRuleTestBase.java
@@ -14,24 +14,30 @@
*/
package org.apache.geode.codeAnalysis;
-import java.util.Optional;
+import java.util.Map;
+import org.junit.AfterClass;
+import org.junit.Rule;
import org.junit.experimental.categories.Category;
-import org.apache.geode.connectors.jdbc.internal.ConnectorsSanctionedSerializablesService;
+import org.apache.geode.codeAnalysis.decode.CompiledClass;
import org.apache.geode.test.junit.categories.SerializationTest;
+import org.apache.geode.test.junit.rules.ClassAnalysisRule;
@Category(SerializationTest.class)
-public class AnalyzeConnectorsSerializablesIntegrationTest
- extends AnalyzeSerializablesJUnitTestBase {
+public abstract class AnalyzeSerializablesWithClassAnalysisRuleTestBase
+ extends AnalyzeSerializablesTestBase {
- @Override
- protected String getModuleName() {
- return "geode-connectors";
+ @Rule
+ public ClassAnalysisRule classProvider = new ClassAnalysisRule(getModuleName());
+
+ @AfterClass
+ public static void afterClass() {
+ ClassAnalysisRule.clearCache();
}
@Override
- protected Optional<Class<?>> getModuleClass() {
- return Optional.of(ConnectorsSanctionedSerializablesService.class);
+ protected Map<String, CompiledClass> loadClasses() {
+ return classProvider.getClasses();
}
}
diff --git a/geode-junit/src/main/java/org/apache/geode/codeAnalysis/SanctionedSerializablesServiceIntegrationTestBase.java b/geode-junit/src/main/java/org/apache/geode/codeAnalysis/SanctionedSerializablesServiceIntegrationTestBase.java
index 4a02107..2fd6672 100644
--- a/geode-junit/src/main/java/org/apache/geode/codeAnalysis/SanctionedSerializablesServiceIntegrationTestBase.java
+++ b/geode-junit/src/main/java/org/apache/geode/codeAnalysis/SanctionedSerializablesServiceIntegrationTestBase.java
@@ -38,7 +38,7 @@ public abstract class SanctionedSerializablesServiceIntegrationTestBase {
}
@Test
- public final void serviceIsLoaded() {
+ public void serviceIsLoaded() {
Collection<SanctionedSerializablesService> services = loadSanctionedSerializablesServices();
SanctionedSerializablesService service = getService();
@@ -56,7 +56,7 @@ public abstract class SanctionedSerializablesServiceIntegrationTestBase {
}
@Test
- public final void serviceResourceExists() {
+ public void serviceResourceExists() {
SanctionedSerializablesService service = getService();
URL url = service.getSanctionedSerializablesURL();
@@ -72,7 +72,7 @@ public abstract class SanctionedSerializablesServiceIntegrationTestBase {
}
@Test
- public final void serviceResourceIsLoaded() throws IOException {
+ public void serviceResourceIsLoaded() throws IOException {
SanctionedSerializablesService service = getService();
Collection<String> serializables = service.getSerializationAcceptlist();
diff --git a/geode-junit/src/main/java/org/apache/geode/test/junit/rules/ClassAnalysisRule.java b/geode-junit/src/main/java/org/apache/geode/test/junit/rules/ClassAnalysisRule.java
index 599edf1..3ee70e7 100644
--- a/geode-junit/src/main/java/org/apache/geode/test/junit/rules/ClassAnalysisRule.java
+++ b/geode-junit/src/main/java/org/apache/geode/test/junit/rules/ClassAnalysisRule.java
@@ -49,13 +49,19 @@ public class ClassAnalysisRule implements TestRule {
new AtomicReference<>(new HashMap<>());
private final String moduleName;
+ private final String sourceSet;
private final Map<String, CompiledClass> classes = new HashMap<>();
/**
* @param moduleName The name of the gradle module in which your test resides
*/
public ClassAnalysisRule(String moduleName) {
+ this(moduleName, "main");
+ }
+
+ public ClassAnalysisRule(String moduleName, String sourceSet) {
this.moduleName = moduleName;
+ this.sourceSet = sourceSet;
}
public Map<String, CompiledClass> getClasses() {
@@ -95,21 +101,18 @@ public class ClassAnalysisRule implements TestRule {
.map(x -> new File(x))
.collect(Collectors.toList());
+ // check for <module>/build/classes/java/**
String gradleBuildDirName =
- Paths.get(getModuleName(), "build", "classes", "java", "main").toString();
- // System.out.println("gradleBuildDirName is " + gradleBuildDirName);
- String ideaBuildDirName =
- Paths.get(getModuleName(), "out", "production", "classes").toString();
- // System.out.println("ideaBuildDirName is " + ideaBuildDirName);
- String ideaFQCNBuildDirName =
- Paths.get("out", "production", "geode." + getModuleName() + ".main").toString();
- // System.out.println("idea build path with full package names is " + ideaFQCNBuildDirName);
+ Paths.get(getModuleName(), "build", "classes", "java", sourceSet).toString();
+
+ // check for <module>/build/classes/test/**
+ String alternateBuildDirName =
+ Paths.get(getModuleName(), "build", "classes", sourceSet).toString();
String buildDir = null;
for (File entry : entries) {
if (entry.toString().endsWith(gradleBuildDirName)
- || entry.toString().endsWith(ideaBuildDirName)
- || entry.toString().endsWith(ideaFQCNBuildDirName)) {
+ || entry.toString().endsWith(alternateBuildDirName)) {
buildDir = entry.toString();
break;
}
diff --git a/geode-lucene/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeLuceneSerializablesIntegrationTest.java b/geode-lucene/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeLuceneSerializablesIntegrationTest.java
index d170cd0..3c77f28 100644
--- a/geode-lucene/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeLuceneSerializablesIntegrationTest.java
+++ b/geode-lucene/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeLuceneSerializablesIntegrationTest.java
@@ -23,7 +23,8 @@ import org.apache.geode.test.junit.categories.LuceneTest;
import org.apache.geode.test.junit.categories.SerializationTest;
@Category({LuceneTest.class, SerializationTest.class})
-public class AnalyzeLuceneSerializablesIntegrationTest extends AnalyzeSerializablesJUnitTestBase {
+public class AnalyzeLuceneSerializablesIntegrationTest
+ extends AnalyzeSerializablesWithClassAnalysisRuleTestBase {
@Override
protected String getModuleName() {
diff --git a/geode-management/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeManagementSerializablesIntegrationTest.java b/geode-management/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeManagementSerializablesIntegrationTest.java
index aab75d2..75f231f 100644
--- a/geode-management/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeManagementSerializablesIntegrationTest.java
+++ b/geode-management/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeManagementSerializablesIntegrationTest.java
@@ -23,7 +23,7 @@ import org.apache.geode.test.junit.categories.SerializationTest;
@Category(SerializationTest.class)
public class AnalyzeManagementSerializablesIntegrationTest
- extends AnalyzeSerializablesJUnitTestBase {
+ extends AnalyzeSerializablesWithClassAnalysisRuleTestBase {
@Override
protected String getModuleName() {
diff --git a/geode-membership/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeMembershipSerializablesIntegrationTest.java b/geode-membership/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeMembershipSerializablesIntegrationTest.java
index e473148..407ad6c 100644
--- a/geode-membership/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeMembershipSerializablesIntegrationTest.java
+++ b/geode-membership/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeMembershipSerializablesIntegrationTest.java
@@ -36,7 +36,7 @@ import org.apache.geode.test.junit.categories.SerializationTest;
*/
@Category({MembershipTest.class, SerializationTest.class})
public class AnalyzeMembershipSerializablesIntegrationTest
- extends AnalyzeDataSerializablesJUnitTestBase {
+ extends AnalyzeDataSerializablesWithClassAnalysisRuleTestBase {
private final DSFIDSerializer dsfidSerializer = new DSFIDSerializerFactory().create();
diff --git a/geode-memcached/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeMemcachedSerializablesIntegrationTest.java b/geode-memcached/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeMemcachedSerializablesIntegrationTest.java
index 8959d85..c0850e0 100644
--- a/geode-memcached/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeMemcachedSerializablesIntegrationTest.java
+++ b/geode-memcached/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeMemcachedSerializablesIntegrationTest.java
@@ -23,7 +23,7 @@ import org.apache.geode.test.junit.categories.SerializationTest;
@Category(SerializationTest.class)
public class AnalyzeMemcachedSerializablesIntegrationTest
- extends AnalyzeSerializablesJUnitTestBase {
+ extends AnalyzeSerializablesWithClassAnalysisRuleTestBase {
@Override
protected String getModuleName() {
diff --git a/geode-pulse/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzePulseSerializablesIntegrationTest.java b/geode-pulse/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzePulseSerializablesIntegrationTest.java
index fbf8d52..5efd089 100644
--- a/geode-pulse/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzePulseSerializablesIntegrationTest.java
+++ b/geode-pulse/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzePulseSerializablesIntegrationTest.java
@@ -21,7 +21,8 @@ import org.junit.experimental.categories.Category;
import org.apache.geode.test.junit.categories.SerializationTest;
@Category(SerializationTest.class)
-public class AnalyzePulseSerializablesIntegrationTest extends AnalyzeSerializablesJUnitTestBase {
+public class AnalyzePulseSerializablesIntegrationTest
+ extends AnalyzeSerializablesWithClassAnalysisRuleTestBase {
@Override
protected String getModuleName() {
diff --git a/geode-redis/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeRedisSerializablesIntegrationTest.java b/geode-redis/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeRedisSerializablesIntegrationTest.java
index 828b4a0..517b717 100755
--- a/geode-redis/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeRedisSerializablesIntegrationTest.java
+++ b/geode-redis/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeRedisSerializablesIntegrationTest.java
@@ -22,7 +22,8 @@ import org.apache.geode.redis.internal.RedisSanctionedSerializablesService;
import org.apache.geode.test.junit.categories.SerializationTest;
@Category(SerializationTest.class)
-public class AnalyzeRedisSerializablesIntegrationTest extends AnalyzeSerializablesJUnitTestBase {
+public class AnalyzeRedisSerializablesIntegrationTest
+ extends AnalyzeSerializablesWithClassAnalysisRuleTestBase {
@Override
protected String getModuleName() {
diff --git a/geode-serialization/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeSerializationSerializablesIntegrationTest.java b/geode-serialization/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeSerializationSerializablesIntegrationTest.java
index 4aa74ff..175278c 100644
--- a/geode-serialization/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeSerializationSerializablesIntegrationTest.java
+++ b/geode-serialization/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeSerializationSerializablesIntegrationTest.java
@@ -23,7 +23,7 @@ import org.apache.geode.test.junit.categories.SerializationTest;
@Category(SerializationTest.class)
public class AnalyzeSerializationSerializablesIntegrationTest
- extends AnalyzeSerializablesJUnitTestBase {
+ extends AnalyzeSerializablesWithClassAnalysisRuleTestBase {
@Override
protected String getModuleName() {
diff --git a/geode-wan/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeWANSerializablesIntegrationTest.java b/geode-wan/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeWANSerializablesIntegrationTest.java
index 1438f2f..0f42cb5 100644
--- a/geode-wan/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeWANSerializablesIntegrationTest.java
+++ b/geode-wan/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeWANSerializablesIntegrationTest.java
@@ -23,7 +23,8 @@ import org.apache.geode.test.junit.categories.SerializationTest;
import org.apache.geode.test.junit.categories.WanTest;
@Category({WanTest.class, SerializationTest.class})
-public class AnalyzeWANSerializablesIntegrationTest extends AnalyzeSerializablesJUnitTestBase {
+public class AnalyzeWANSerializablesIntegrationTest
+ extends AnalyzeSerializablesWithClassAnalysisRuleTestBase {
@Override
protected String getModuleName() {
diff --git a/geode-web-api/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeWebApiSerializablesIntegrationTest.java b/geode-web-api/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeWebApiSerializablesIntegrationTest.java
index 9ed629a..70f31fe 100644
--- a/geode-web-api/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeWebApiSerializablesIntegrationTest.java
+++ b/geode-web-api/src/integrationTest/java/org/apache/geode/codeAnalysis/AnalyzeWebApiSerializablesIntegrationTest.java
@@ -23,7 +23,8 @@ import org.apache.geode.test.junit.categories.RestAPITest;
import org.apache.geode.test.junit.categories.SerializationTest;
@Category({RestAPITest.class, SerializationTest.class})
-public class AnalyzeWebApiSerializablesIntegrationTest extends AnalyzeSerializablesJUnitTestBase {
+public class AnalyzeWebApiSerializablesIntegrationTest
+ extends AnalyzeSerializablesWithClassAnalysisRuleTestBase {
@Override
protected String getModuleName() {
[geode] 05/06: GEODE-9758: Add internal serial filter API (#7217)
Posted by kl...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
klund pushed a commit to branch support/1.12
in repository https://gitbox.apache.org/repos/asf/geode.git
commit ff15cca62da20727f5f6dc89ff0e5b586d00833c
Author: Kirk Lund <kl...@apache.org>
AuthorDate: Tue Jan 18 11:01:25 2022 -0800
GEODE-9758: Add internal serial filter API (#7217)
GEODE-9758: Add internal serial filter API #7217
Expand ObjectInputStreamFilterWrapper to be an internal API which
supports all of Geode's uses of Java's ObjectInputFilter.
Introduce a new system property, geode.enableGlobalSerialFilter, to
enable a process-wide filter with all serializable Geode classes on the
classpath and the value of serializable-object-filter accept-listed.
To enable the process-wide filter with GFSH start commands, add:
* --J=-Dgeode.enableGlobalSerialFilter=true
Functional Capabilities
The internal API lives in geode-serialization and works on OpenJDK
based JREs providing a facade for Java's ObjectInputFilter in Java 8
and Java 9 or greater using reflection. The API provides the following
capabilities:
* creating an ObjectInputFilter
* setting an ObjectInputFilter on an ObjectInputStream
* getting an ObjectInputFilter from a ObjectInputStream
* setting a process-wide ObjectInputFilter
* getting a process-wide ObjectInputFilter
Design Notes
The API defines the following primary interface types:
* factory interfaces for creating instances of types within the API
* filter interfaces to split out single ops from Java's
ObjectInputFilter
* configuration interfaces for handling system properties, logging,
and config validation
The concrete classes in the API receive parameters injected via a
constructor for any collaborators that are not specified by the
interfaces. This is intentional even when the instance is only used
once before de-referencing it. All collaborators that are defined in
the interface are passed in as parameters to the implementing
method; all others are passed in via the constructor and stored as
fields.
(cherry picked from commit 7978abf34707d11da45cff0b7cb7445f18d21438)
(cherry picked from commit f9742384edf23b8b2dd23c8d37e947a894836651)
---
...artLocatorGlobalSerialFilterAcceptanceTest.java | 138 ++++++++
...StartLocatorJmxSerialFilterAcceptanceTest.java} | 58 ++--
...tartServerGlobalSerialFilterAcceptanceTest.java | 150 +++++++++
.../StartServerJmxSerialFilterAcceptanceTest.java} | 55 ++--
geode-core/build.gradle | 14 +-
...ValidateSerializableObjectsDistributedTest.java | 320 +++++++++++++++++++
...catorLauncherJmxManagerLocalRegressionTest.java | 22 +-
...cherGlobalSerialFilterBlankIntegrationTest.java | 55 ++++
...herGlobalSerialFilterExistsIntegrationTest.java | 55 ++++
...rLauncherGlobalSerialFilterIntegrationTest.java | 52 +++
...alSerialFilterPropertyBlankIntegrationTest.java | 54 ++++
...alSerialFilterPropertyEmptyIntegrationTest.java | 54 ++++
...atorLauncherJmxSerialFilterIntegrationTest.java | 84 +++++
...mxSerialFilterPropertyBlankIntegrationTest.java | 88 ++++++
...mxSerialFilterPropertyEmptyIntegrationTest.java | 88 ++++++
...xSerialFilterPropertyExistsIntegrationTest.java | 90 ++++++
.../filter/LocatorLauncherWithJmxManager.java | 82 +++++
.../filter/SerialFilterAssertions.java | 64 ++++
...cherGlobalSerialFilterBlankIntegrationTest.java | 55 ++++
...herGlobalSerialFilterExistsIntegrationTest.java | 55 ++++
...rLauncherGlobalSerialFilterIntegrationTest.java | 51 +++
...alSerialFilterPropertyBlankIntegrationTest.java | 53 ++++
...alSerialFilterPropertyEmptyIntegrationTest.java | 53 ++++
...rverLauncherJmxSerialFilterIntegrationTest.java | 87 +++++
...mxSerialFilterPropertyBlankIntegrationTest.java | 88 ++++++
...mxSerialFilterPropertyEmptyIntegrationTest.java | 88 ++++++
...xSerialFilterPropertyExistsIntegrationTest.java | 90 ++++++
.../filter/ServerLauncherWithJmxManager.java | 77 +++++
...erConfiguresJmxSerialFilterIntegrationTest.java | 204 ------------
.../internal/ManagementAgentIntegrationTest.java | 6 +-
...erConfiguresJmxSerialFilterIntegrationTest.java | 201 ------------
.../apache/geode/distributed/LocatorLauncher.java | 12 +
.../apache/geode/distributed/ServerLauncher.java | 11 +
.../distributed/internal/DistributionConfig.java | 4 +-
.../DistributedSerializableObjectConfig.java | 51 +++
.../geode/internal/InternalDataSerializer.java | 41 ++-
.../internal/ObjectInputStreamFilterWrapper.java | 233 --------------
.../internal/JmxRmiOpenTypesSerialFilter.java | 148 ---------
.../geode/management/internal/ManagementAgent.java | 10 +-
.../internal/ManagementAgentFactory.java | 3 +-
.../internal/SystemManagementService.java | 9 +-
.../internal/DistributionConfigJUnitTest.java | 8 +
.../DistributedSerializableObjectConfigTest.java | 62 ++++
...lDataSerializerSerializationAcceptlistTest.java | 153 ++++++---
.../InternalDataSerializerShiroAcceptListTest.java | 34 +-
.../internal/JmxRmiOpenTypesSerialFilterTest.java | 351 ---------------------
geode-core/src/test/resources/expected-pom.xml | 10 +-
geode-http-service/build.gradle | 1 +
.../codeAnalysis/AnalyzeSerializablesTestBase.java | 6 +-
...nputFilterApiSetFilterBlankIntegrationTest.java | 63 ++++
...jectInputFilterApiSetFilterIntegrationTest.java | 60 ++++
...InputFilterApiSetFilterNullIntegrationTest.java | 61 ++++
...edSerializablesService.java => ApiPackage.java} | 28 +-
.../serialization/filter/FilterConfiguration.java | 12 +-
.../serialization/filter/FilterPattern.java | 13 +-
.../serialization/filter/GlobalSerialFilter.java | 12 +-
.../filter/GlobalSerialFilterConfiguration.java | 144 +++++++++
...=> GlobalSerialFilterConfigurationFactory.java} | 24 +-
...Service.java => GlobalSerialFilterFactory.java} | 21 +-
.../Java9ReflectiveObjectInputFilterApi.java | 64 ++++
.../filter/JmxSerialFilterConfiguration.java | 72 +++++
.../JmxSerialFilterConfigurationFactory.java | 13 +-
.../filter/NullObjectInputFilter.java | 10 +-
.../serialization/filter/ObjectInputFilter.java | 15 +-
.../serialization/filter/ObjectInputFilterApi.java | 85 +++++
.../filter/ObjectInputFilterApiFactory.java | 9 +-
.../filter/ObjectInputFilterFactory.java | 12 +-
.../filter/ObjectInputFilterUtils.java | 61 ++++
.../filter/OpenMBeanFilterPattern.java | 68 ++++
.../filter/ReflectiveFacadeGlobalSerialFilter.java | 71 +++++
...ReflectiveFacadeGlobalSerialFilterFactory.java} | 29 +-
.../filter/ReflectiveFacadeObjectInputFilter.java | 78 +++++
.../ReflectiveFacadeObjectInputFilterFactory.java | 61 ++++
.../filter/ReflectiveObjectInputFilterApi.java | 269 ++++++++++++++++
.../ReflectiveObjectInputFilterApiFactory.java | 45 +++
.../filter/SanctionedSerializables.java | 13 +-
.../SanctionedSerializablesFilterPattern.java | 111 +++++++
.../filter/SanctionedSerializablesService.java | 6 +
...sService.java => SerializableObjectConfig.java} | 22 +-
...ertyGlobalSerialFilterConfigurationFactory.java | 52 +++
...ropertyJmxSerialFilterConfigurationFactory.java | 55 ++++
...anctioned-geode-serialization-serializables.txt | 1 +
.../SerializationDependenciesTest.java | 2 +-
.../serialization/filter/ApiPackageTest.java | 61 ++++
.../GlobalSerialFilterConfigurationTest.java | 76 +++++
.../JmxSerialFilterConfigurationFactoryTest.java | 65 ++++
.../filter/JmxSerialFilterConfigurationTest.java | 155 +++++++++
.../filter/NullObjectInputFilterTest.java} | 24 +-
.../filter/ObjectInputFilterUtilsTest.java | 94 ++++++
.../filter/OpenMBeanFilterPatternTest.java | 142 +++++++++
...lectiveFacadeGlobalSerialFilterFactoryTest.java | 71 +++++
.../ReflectiveFacadeGlobalSerialFilterTest.java | 104 ++++++
...flectiveFacadeObjectInputFilterFactoryTest.java | 84 +++++
.../ReflectiveFacadeObjectInputFilterTest.java | 142 +++++++++
.../ReflectiveObjectInputFilterApiFactoryTest.java | 60 ++++
.../filter/ReflectiveObjectInputFilterApiTest.java | 223 +++++++++++++
.../SanctionedSerializablesFilterPatternTest.java | 206 ++++++++++++
.../filter/SerializableObjectConfigTest.java | 46 +++
...GlobalSerialFilterConfigurationFactoryTest.java | 75 +++++
...rtyJmxSerialFilterConfigurationFactoryTest.java | 90 ++++++
100 files changed, 5748 insertions(+), 1410 deletions(-)
diff --git a/geode-assembly/src/acceptanceTest/java/org/apache/geode/serialization/filter/StartLocatorGlobalSerialFilterAcceptanceTest.java b/geode-assembly/src/acceptanceTest/java/org/apache/geode/serialization/filter/StartLocatorGlobalSerialFilterAcceptanceTest.java
new file mode 100644
index 0000000..e4cc254
--- /dev/null
+++ b/geode-assembly/src/acceptanceTest/java/org/apache/geode/serialization/filter/StartLocatorGlobalSerialFilterAcceptanceTest.java
@@ -0,0 +1,138 @@
+/*
+ * 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.geode.serialization.filter;
+
+import static org.apache.geode.internal.AvailablePortHelper.getRandomAvailableTCPPorts;
+import static org.apache.geode.test.assertj.LogFileAssert.assertThat;
+import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
+
+import java.nio.file.Path;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.geode.test.junit.rules.RequiresGeodeHome;
+import org.apache.geode.test.junit.rules.gfsh.GfshRule;
+
+public class StartLocatorGlobalSerialFilterAcceptanceTest {
+
+ @Rule
+ public RequiresGeodeHome requiresGeodeHome = new RequiresGeodeHome();
+ @Rule
+ public GfshRule gfshRule = new GfshRule();
+
+ private Path locatorFolder;
+ private int locatorPort;
+ private int locatorJmxPort;
+ private Path locatorLogFile;
+
+ @Before
+ public void setUpFiles() {
+ locatorFolder = gfshRule.getTemporaryFolder().getRoot().toPath().toAbsolutePath();
+ locatorLogFile = locatorFolder.resolve("locator.log");
+ }
+
+ @Before
+ public void setUpPorts() {
+ int[] ports = getRandomAvailableTCPPorts(2);
+ locatorPort = ports[0];
+ locatorJmxPort = ports[1];
+ }
+
+ @Test
+ public void startDoesNotConfigureGlobalSerialFilter_byDefault() {
+ String startLocatorCommand = String.join(" ",
+ "start locator",
+ "--name=locator",
+ "--dir=" + locatorFolder,
+ "--port=" + locatorPort,
+ "--J=-Dgemfire.jmx-manager-port=" + locatorJmxPort);
+
+ gfshRule.execute(startLocatorCommand);
+
+ await().untilAsserted(() -> {
+ assertThat(locatorLogFile.toFile())
+ .as(locatorLogFile.toFile().getAbsolutePath())
+ .exists()
+ .doesNotContain("Global serial filter is now configured.")
+ .doesNotContain("jdk.serialFilter");
+ });
+ }
+
+ @Test
+ public void startDoesNotConfigureGlobalSerialFilter_whenJdkSerialFilterIsNotBlank() {
+ String startLocatorCommand = String.join(" ",
+ "start locator",
+ "--name=locator",
+ "--dir=" + locatorFolder,
+ "--port=" + locatorPort,
+ "--J=-Dgemfire.jmx-manager-port=" + locatorJmxPort,
+ "--J=-Djdk.serialFilter=*");
+
+ gfshRule.execute(startLocatorCommand);
+
+ await().untilAsserted(() -> {
+ assertThat(locatorLogFile.toFile())
+ .as(locatorLogFile.toFile().getAbsolutePath())
+ .exists()
+ .doesNotContain("Global serial filter is now configured.")
+ .contains("jdk.serialFilter");
+ });
+ }
+
+ @Test
+ public void startConfiguresGlobalSerialFilter_whenEnableGlobalSerialFilterIsTrue() {
+ String startLocatorCommand = String.join(" ",
+ "start locator",
+ "--name=locator",
+ "--dir=" + locatorFolder,
+ "--port=" + locatorPort,
+ "--J=-Dgemfire.jmx-manager-port=" + locatorJmxPort,
+ "--J=-Dgeode.enableGlobalSerialFilter=true");
+
+ gfshRule.execute(startLocatorCommand);
+
+ await().untilAsserted(() -> {
+ assertThat(locatorLogFile.toFile())
+ .as(locatorLogFile.toFile().getAbsolutePath())
+ .exists()
+ .contains("Global serial filter is now configured.")
+ .doesNotContain("jdk.serialFilter");
+ });
+ }
+
+ @Test
+ public void startDoesNotConfigureGlobalSerialFilter_whenEnableGlobalSerialFilterIsTrue_andJdkSerialFilterIsNotBlank() {
+ String startLocatorCommand = String.join(" ",
+ "start locator",
+ "--name=locator",
+ "--dir=" + locatorFolder,
+ "--port=" + locatorPort,
+ "--J=-Dgemfire.jmx-manager-port=" + locatorJmxPort,
+ "--J=-Dgeode.enableGlobalSerialFilter=true",
+ "--J=-Djdk.serialFilter=*");
+
+ gfshRule.execute(startLocatorCommand);
+
+ await().untilAsserted(() -> {
+ assertThat(locatorLogFile.toFile())
+ .as(locatorLogFile.toFile().getAbsolutePath())
+ .exists()
+ .doesNotContain("Global serial filter is now configured.")
+ .contains("jdk.serialFilter");
+ });
+ }
+}
diff --git a/geode-assembly/src/acceptanceTest/java/org/apache/geode/management/LocatorManagerConfiguresJmxSerialFilterAcceptanceTest.java b/geode-assembly/src/acceptanceTest/java/org/apache/geode/serialization/filter/StartLocatorJmxSerialFilterAcceptanceTest.java
similarity index 66%
rename from geode-assembly/src/acceptanceTest/java/org/apache/geode/management/LocatorManagerConfiguresJmxSerialFilterAcceptanceTest.java
rename to geode-assembly/src/acceptanceTest/java/org/apache/geode/serialization/filter/StartLocatorJmxSerialFilterAcceptanceTest.java
index de0b8c8..f6d50c2 100644
--- a/geode-assembly/src/acceptanceTest/java/org/apache/geode/management/LocatorManagerConfiguresJmxSerialFilterAcceptanceTest.java
+++ b/geode-assembly/src/acceptanceTest/java/org/apache/geode/serialization/filter/StartLocatorJmxSerialFilterAcceptanceTest.java
@@ -12,65 +12,61 @@
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
-package org.apache.geode.management;
+package org.apache.geode.serialization.filter;
+import static org.apache.commons.lang3.JavaVersion.JAVA_1_8;
+import static org.apache.commons.lang3.JavaVersion.JAVA_9;
import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast;
import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtMost;
import static org.apache.geode.internal.AvailablePortHelper.getRandomAvailableTCPPorts;
-import static org.apache.geode.management.internal.JmxRmiOpenTypesSerialFilter.PROPERTY_NAME;
+import static org.apache.geode.test.assertj.LogFileAssert.assertThat;
import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
import static org.assertj.core.api.Assumptions.assumeThat;
import java.nio.file.Path;
-import org.apache.commons.lang3.JavaVersion;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-import org.apache.geode.test.assertj.LogFileAssert;
import org.apache.geode.test.junit.rules.RequiresGeodeHome;
import org.apache.geode.test.junit.rules.gfsh.GfshRule;
-public class LocatorManagerConfiguresJmxSerialFilterAcceptanceTest {
+public class StartLocatorJmxSerialFilterAcceptanceTest {
- private static final String NAME = "the-locator";
-
- private Path workingDir;
- private int locatorPort;
- private int jmxPort;
- private Path locatorLogFile;
+ private static final String PROPERTY_NAME = "jmx.remote.rmi.server.serial.filter.pattern";
@Rule
public RequiresGeodeHome requiresGeodeHome = new RequiresGeodeHome();
@Rule
public GfshRule gfshRule = new GfshRule();
- @Before
- public void setUpOutputFiles() {
- TemporaryFolder temporaryFolder = gfshRule.getTemporaryFolder();
+ private Path locatorFolder;
+ private int locatorPort;
+ private int jmxPort;
+ private Path locatorLogFile;
- workingDir = temporaryFolder.getRoot().toPath().toAbsolutePath();
- locatorLogFile = workingDir.resolve(NAME + ".log");
+ @Before
+ public void setUpFiles() {
+ locatorFolder = gfshRule.getTemporaryFolder().getRoot().toPath().toAbsolutePath();
+ locatorLogFile = locatorFolder.resolve("locator.log");
}
@Before
- public void setUpRandomPorts() {
+ public void setUpPorts() {
int[] ports = getRandomAvailableTCPPorts(2);
-
locatorPort = ports[0];
jmxPort = ports[1];
}
@Test
- public void startingLocatorWithJmxManager_configuresSerialFilter_atLeastJava9() {
- assumeThat(isJavaVersionAtLeast(JavaVersion.JAVA_9)).isTrue();
+ public void startWithJmxManagerConfiguresJmxSerialFilter_onJava9orGreater() {
+ assumeThat(isJavaVersionAtLeast(JAVA_9)).isTrue();
String startLocatorCommand = String.join(" ",
"start locator",
- "--name=" + NAME,
- "--dir=" + workingDir,
+ "--name=locator",
+ "--dir=" + locatorFolder,
"--port=" + locatorPort,
"--J=-Dgemfire.enable-cluster-configuration=false",
"--J=-Dgemfire.http-service-port=0",
@@ -81,21 +77,21 @@ public class LocatorManagerConfiguresJmxSerialFilterAcceptanceTest {
gfshRule.execute(startLocatorCommand);
await().untilAsserted(() -> {
- LogFileAssert.assertThat(locatorLogFile.toFile())
+ assertThat(locatorLogFile.toFile())
.as(locatorLogFile.toFile().getAbsolutePath())
.exists()
- .contains("System property " + PROPERTY_NAME + " is now configured with");
+ .contains("System property '" + PROPERTY_NAME + "' is now configured with");
});
}
@Test
- public void startingLocatorWithJmxManager_configuresSerialFilter_atMostJava8() {
- assumeThat(isJavaVersionAtMost(JavaVersion.JAVA_1_8)).isTrue();
+ public void startWithJmxManagerDoesNotConfigureJmxSerialFilter_onJava8() {
+ assumeThat(isJavaVersionAtMost(JAVA_1_8)).isTrue();
String startLocatorCommand = String.join(" ",
"start locator",
- "--name=" + NAME,
- "--dir=" + workingDir,
+ "--name=locator",
+ "--dir=" + locatorFolder,
"--port=" + locatorPort,
"--J=-Dgemfire.enable-cluster-configuration=false",
"--J=-Dgemfire.http-service-port=0",
@@ -106,10 +102,10 @@ public class LocatorManagerConfiguresJmxSerialFilterAcceptanceTest {
gfshRule.execute(startLocatorCommand);
await().untilAsserted(() -> {
- LogFileAssert.assertThat(locatorLogFile.toFile())
+ assertThat(locatorLogFile.toFile())
.as(locatorLogFile.toFile().getAbsolutePath())
.exists()
- .doesNotContain("System property " + PROPERTY_NAME + " is now configured with");
+ .doesNotContain("System property '" + PROPERTY_NAME + "' is now configured with");
});
}
}
diff --git a/geode-assembly/src/acceptanceTest/java/org/apache/geode/serialization/filter/StartServerGlobalSerialFilterAcceptanceTest.java b/geode-assembly/src/acceptanceTest/java/org/apache/geode/serialization/filter/StartServerGlobalSerialFilterAcceptanceTest.java
new file mode 100644
index 0000000..06bd7e2
--- /dev/null
+++ b/geode-assembly/src/acceptanceTest/java/org/apache/geode/serialization/filter/StartServerGlobalSerialFilterAcceptanceTest.java
@@ -0,0 +1,150 @@
+/*
+ * 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.geode.serialization.filter;
+
+import static org.apache.geode.internal.AvailablePortHelper.getRandomAvailableTCPPort;
+import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
+
+import java.io.File;
+import java.nio.file.Path;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.geode.test.assertj.LogFileAssert;
+import org.apache.geode.test.junit.rules.RequiresGeodeHome;
+import org.apache.geode.test.junit.rules.gfsh.GfshRule;
+
+public class StartServerGlobalSerialFilterAcceptanceTest {
+
+ @Rule
+ public RequiresGeodeHome requiresGeodeHome = new RequiresGeodeHome();
+ @Rule
+ public GfshRule gfshRule = new GfshRule();
+
+ private File serverFolder;
+ private int jmxPort;
+
+ @Before
+ public void setServerFolder() {
+ serverFolder = gfshRule.getTemporaryFolder().getRoot();
+ }
+
+ @Before
+ public void setJmxPort() {
+ jmxPort = getRandomAvailableTCPPort();
+ }
+
+ @Test
+ public void startDoesNotConfigureGlobalSerialFilter_byDefault() {
+ String startServerCommand = String.join(" ",
+ "start server",
+ "--name=server",
+ "--dir=" + serverFolder.getAbsolutePath(),
+ "--disable-default-server",
+ "--J=-Dgemfire.enable-cluster-configuration=false",
+ "--J=-Dgemfire.http-service-port=0",
+ "--J=-Dgemfire.jmx-manager=true",
+ "--J=-Dgemfire.jmx-manager-port=" + jmxPort,
+ "--J=-Dgemfire.jmx-manager-start=true");
+
+ gfshRule.execute(startServerCommand);
+
+ Path serverLogFile = serverFolder.toPath().resolve("server.log");
+ await().untilAsserted(() -> {
+ LogFileAssert.assertThat(serverLogFile.toFile()).exists()
+ .doesNotContain("Global serial filter is now configured.")
+ .doesNotContain("jdk.serialFilter");
+ });
+ }
+
+ @Test
+ public void startDoesNotConfigureGlobalSerialFilter_whenJdkSerialFilterIsNotBlank() {
+ String startServerCommand = String.join(" ",
+ "start server",
+ "--name=server",
+ "--dir=" + serverFolder.getAbsolutePath(),
+ "--disable-default-server",
+ "--J=-Dgemfire.enable-cluster-configuration=false",
+ "--J=-Dgemfire.http-service-port=0",
+ "--J=-Dgemfire.jmx-manager=true",
+ "--J=-Dgemfire.jmx-manager-port=" + jmxPort,
+ "--J=-Dgemfire.jmx-manager-start=true",
+ "--J=-Djdk.serialFilter=*");
+
+ gfshRule.execute(startServerCommand);
+
+ Path serverLogFile = serverFolder.toPath().resolve("server.log");
+ await().untilAsserted(() -> {
+ LogFileAssert.assertThat(serverLogFile.toFile()).exists()
+ .doesNotContain("Global serial filter is now configured.")
+ .contains("jdk.serialFilter");
+ });
+ }
+
+ /**
+ * ServerLauncher is not currently wired up with EnabledGlobalSerialFilterConfigurationFactory
+ * like LocatorLauncher is.
+ */
+ @Test
+ public void startConfiguresGlobalSerialFilter_whenEnableGlobalSerialFilterIsTrue() {
+ String startServerCommand = String.join(" ",
+ "start server",
+ "--name=server",
+ "--dir=" + serverFolder.getAbsolutePath(),
+ "--disable-default-server",
+ "--J=-Dgemfire.enable-cluster-configuration=false",
+ "--J=-Dgemfire.http-service-port=0",
+ "--J=-Dgemfire.jmx-manager=true",
+ "--J=-Dgemfire.jmx-manager-port=" + jmxPort,
+ "--J=-Dgemfire.jmx-manager-start=true",
+ "--J=-Dgeode.enableGlobalSerialFilter=true");
+
+ gfshRule.execute(startServerCommand);
+
+ Path serverLogFile = serverFolder.toPath().resolve("server.log");
+ await().untilAsserted(() -> {
+ LogFileAssert.assertThat(serverLogFile.toFile()).exists()
+ .contains("Global serial filter is now configured.")
+ .doesNotContain("jdk.serialFilter");
+ });
+ }
+
+ @Test
+ public void startDoesNotConfigureGlobalSerialFilter_whenEnableGlobalSerialFilterIsTrue_andJdkSerialFilterIsNotBlank() {
+ String startServerCommand = String.join(" ",
+ "start server",
+ "--name=server",
+ "--dir=" + serverFolder.getAbsolutePath(),
+ "--disable-default-server",
+ "--J=-Dgemfire.enable-cluster-configuration=false",
+ "--J=-Dgemfire.http-service-port=0",
+ "--J=-Dgemfire.jmx-manager=true",
+ "--J=-Dgemfire.jmx-manager-port=" + jmxPort,
+ "--J=-Dgemfire.jmx-manager-start=true",
+ "--J=-Dgeode.enableGlobalSerialFilter=true",
+ "--J=-Djdk.serialFilter=*");
+
+ gfshRule.execute(startServerCommand);
+
+ Path serverLogFile = serverFolder.toPath().resolve("server.log");
+ await().untilAsserted(() -> {
+ LogFileAssert.assertThat(serverLogFile.toFile()).exists()
+ .doesNotContain("Global serial filter is now configured.")
+ .contains("jdk.serialFilter");
+ });
+ }
+}
diff --git a/geode-assembly/src/acceptanceTest/java/org/apache/geode/management/ServerManagerConfiguresJmxSerialFilterAcceptanceTest.java b/geode-assembly/src/acceptanceTest/java/org/apache/geode/serialization/filter/StartServerJmxSerialFilterAcceptanceTest.java
similarity index 66%
rename from geode-assembly/src/acceptanceTest/java/org/apache/geode/management/ServerManagerConfiguresJmxSerialFilterAcceptanceTest.java
rename to geode-assembly/src/acceptanceTest/java/org/apache/geode/serialization/filter/StartServerJmxSerialFilterAcceptanceTest.java
index 7754dec..bf03b22 100644
--- a/geode-assembly/src/acceptanceTest/java/org/apache/geode/management/ServerManagerConfiguresJmxSerialFilterAcceptanceTest.java
+++ b/geode-assembly/src/acceptanceTest/java/org/apache/geode/serialization/filter/StartServerJmxSerialFilterAcceptanceTest.java
@@ -12,61 +12,58 @@
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
-package org.apache.geode.management;
+package org.apache.geode.serialization.filter;
+import static org.apache.commons.lang3.JavaVersion.JAVA_1_8;
+import static org.apache.commons.lang3.JavaVersion.JAVA_9;
import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast;
import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtMost;
import static org.apache.geode.internal.AvailablePortHelper.getRandomAvailableTCPPort;
-import static org.apache.geode.management.internal.JmxRmiOpenTypesSerialFilter.PROPERTY_NAME;
+import static org.apache.geode.test.assertj.LogFileAssert.assertThat;
import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
import static org.assertj.core.api.Assumptions.assumeThat;
import java.nio.file.Path;
-import org.apache.commons.lang3.JavaVersion;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-import org.apache.geode.test.assertj.LogFileAssert;
import org.apache.geode.test.junit.rules.RequiresGeodeHome;
import org.apache.geode.test.junit.rules.gfsh.GfshRule;
-public class ServerManagerConfiguresJmxSerialFilterAcceptanceTest {
+public class StartServerJmxSerialFilterAcceptanceTest {
- private static final String NAME = "the-server";
-
- private Path workingDir;
- private int jmxPort;
- private Path serverLogFile;
+ private static final String PROPERTY_NAME = "jmx.remote.rmi.server.serial.filter.pattern";
@Rule
public RequiresGeodeHome requiresGeodeHome = new RequiresGeodeHome();
@Rule
public GfshRule gfshRule = new GfshRule();
- @Before
- public void setUpOutputFiles() {
- TemporaryFolder temporaryFolder = gfshRule.getTemporaryFolder();
+ private Path serverFolder;
+ private int jmxPort;
+ private Path serverLogFile;
- workingDir = temporaryFolder.getRoot().toPath().toAbsolutePath();
- serverLogFile = workingDir.resolve(NAME + ".log");
+ @Before
+ public void setUpFiles() {
+ serverFolder = gfshRule.getTemporaryFolder().getRoot().toPath().toAbsolutePath();
+ serverLogFile = serverFolder.resolve("server.log");
}
@Before
- public void setUpRandomPorts() {
+ public void setUpPorts() {
jmxPort = getRandomAvailableTCPPort();
}
@Test
- public void startingServerWithJmxManager_configuresSerialFilter_atLeastJava9() {
- assumeThat(isJavaVersionAtLeast(JavaVersion.JAVA_9)).isTrue();
+ public void startWithJmxManagerConfiguresJmxSerialFilter_onJava9orGreater() {
+ assumeThat(isJavaVersionAtLeast(JAVA_9)).isTrue();
String startServerCommand = String.join(" ",
"start server",
- "--name=" + NAME,
- "--dir=" + workingDir,
+ "--name=server",
+ "--dir=" + serverFolder,
"--disable-default-server",
"--J=-Dgemfire.enable-cluster-configuration=false",
"--J=-Dgemfire.http-service-port=0",
@@ -77,21 +74,21 @@ public class ServerManagerConfiguresJmxSerialFilterAcceptanceTest {
gfshRule.execute(startServerCommand);
await().untilAsserted(() -> {
- LogFileAssert.assertThat(serverLogFile.toFile())
+ assertThat(serverLogFile.toFile())
.as(serverLogFile.toFile().getAbsolutePath())
.exists()
- .contains("System property " + PROPERTY_NAME + " is now configured with");
+ .contains("System property '" + PROPERTY_NAME + "' is now configured with");
});
}
@Test
- public void startingServerWithJmxManager_configuresSerialFilter_atMostJava8() {
- assumeThat(isJavaVersionAtMost(JavaVersion.JAVA_1_8)).isTrue();
+ public void startWithJmxManagerDoesNotConfigureJmxSerialFilter_onJava8() {
+ assumeThat(isJavaVersionAtMost(JAVA_1_8)).isTrue();
String startServerCommand = String.join(" ",
"start server",
- "--name=" + NAME,
- "--dir=" + workingDir,
+ "--name=server",
+ "--dir=" + serverFolder,
"--disable-default-server",
"--J=-Dgemfire.enable-cluster-configuration=false",
"--J=-Dgemfire.http-service-port=0",
@@ -102,10 +99,10 @@ public class ServerManagerConfiguresJmxSerialFilterAcceptanceTest {
gfshRule.execute(startServerCommand);
await().untilAsserted(() -> {
- LogFileAssert.assertThat(serverLogFile.toFile())
+ assertThat(serverLogFile.toFile())
.as(serverLogFile.toFile().getAbsolutePath())
.exists()
- .doesNotContain("System property " + PROPERTY_NAME + " is now configured with");
+ .doesNotContain("System property '" + PROPERTY_NAME + "' is now configured with");
});
}
}
diff --git a/geode-core/build.gradle b/geode-core/build.gradle
index 2204263..84fc9fc 100755
--- a/geode-core/build.gradle
+++ b/geode-core/build.gradle
@@ -299,13 +299,13 @@ dependencies {
//RMIIO is used for uploading jar files and copying them between locator an servers
implementation('com.healthmarketscience.rmiio:rmiio')
- //Geode-common has annotations and other pieces used geode-core
- api(project(':geode-common'))
- implementation(project(':geode-logging'))
- implementation(project(':geode-membership'))
- implementation(project(':geode-unsafe'))
- implementation(project(':geode-serialization'))
- implementation(project(':geode-tcp-server'))
+ //Geode-common has annotations and other pieces used geode-core
+ api(project(':geode-common'))
+ implementation(project(':geode-logging'))
+ implementation(project(':geode-membership'))
+ implementation(project(':geode-unsafe'))
+ api(project(':geode-serialization'))
+ implementation(project(':geode-tcp-server'))
//geode-management currently has pieces of the public API
//copied into it, so it is an API dependency
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/cache/ValidateSerializableObjectsDistributedTest.java b/geode-core/src/distributedTest/java/org/apache/geode/cache/ValidateSerializableObjectsDistributedTest.java
new file mode 100644
index 0000000..6a90616
--- /dev/null
+++ b/geode-core/src/distributedTest/java/org/apache/geode/cache/ValidateSerializableObjectsDistributedTest.java
@@ -0,0 +1,320 @@
+/*
+ * 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.geode.cache;
+
+import static java.util.Arrays.asList;
+import static org.apache.geode.cache.RegionShortcut.REPLICATE;
+import static org.apache.geode.distributed.ConfigurationProperties.ENABLE_CLUSTER_CONFIGURATION;
+import static org.apache.geode.distributed.ConfigurationProperties.LOCATORS;
+import static org.apache.geode.distributed.ConfigurationProperties.VALIDATE_SERIALIZABLE_OBJECTS;
+import static org.apache.geode.test.dunit.DistributedTestUtils.getLocatorPort;
+import static org.apache.geode.test.dunit.IgnoredException.addIgnoredException;
+import static org.apache.geode.test.dunit.VM.getVM;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.catchThrowable;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InvalidClassException;
+import java.io.NotSerializableException;
+import java.io.Serializable;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.geode.InternalGemFireException;
+import org.apache.geode.SerializationException;
+import org.apache.geode.cache.util.CacheListenerAdapter;
+import org.apache.geode.distributed.ServerLauncher;
+import org.apache.geode.test.dunit.VM;
+import org.apache.geode.test.dunit.rules.DistributedReference;
+import org.apache.geode.test.dunit.rules.DistributedRule;
+import org.apache.geode.test.junit.rules.serializable.SerializableTemporaryFolder;
+
+@SuppressWarnings("serial")
+public class ValidateSerializableObjectsDistributedTest implements Serializable {
+
+ private VM server1;
+ private VM server2;
+
+ private File server1Dir;
+ private File server2Dir;
+ private int locatorPort;
+
+ @Rule
+ public DistributedRule distributedRule = new DistributedRule();
+ @Rule
+ public DistributedReference<ServerLauncher> server = new DistributedReference<>();
+ @Rule
+ public SerializableTemporaryFolder temporaryFolder = new SerializableTemporaryFolder();
+
+ @Before
+ public void setUp() throws IOException {
+ server1 = getVM(0);
+ server2 = getVM(1);
+
+ server1Dir = temporaryFolder.newFolder("server1");
+ server2Dir = temporaryFolder.newFolder("server2");
+
+ locatorPort = getLocatorPort();
+
+ server1.invoke(() -> {
+ server.set(startServer("server1", server1Dir));
+ });
+ server2.invoke(() -> {
+ server.set(startServer("server2", server2Dir));
+ });
+
+ asList(server1, server2).forEach(vm -> vm.invoke(() -> {
+ server.get().getCache()
+ .createRegionFactory(REPLICATE)
+ .addCacheListener(new CacheListenerAdapter<Object, Object>() {
+ @Override
+ public void afterCreate(EntryEvent<Object, Object> event) {
+ // cache listener afterCreate causes all creates to deserialize the value which causes
+ // the tests to pass if serialization filter is configured
+ assertThat(event.getNewValue()).isNotNull();
+ }
+ })
+ .create("region");
+ }));
+ }
+
+ @Test
+ public void stringIsAllowed() {
+ server1.invoke(() -> {
+ Region<Object, Object> region = server.get().getCache().getRegion("region");
+
+ Object key = "key";
+ Object value = "value";
+
+ // puts entry locally and propagates to server2
+ region.put(key, value);
+
+ // entry exists in server1
+ assertThat(region.containsKey(key)).isTrue();
+ assertThat(region.get(key)).isSameAs(value);
+ });
+
+ server2.invoke(() -> {
+ Region<Object, Object> region = server.get().getCache().getRegion("region");
+
+ Object key = "key";
+ Object value = "value";
+
+ // entry exists in server2
+ assertThat(region.containsKey(key)).isTrue();
+ assertThat(region.get(key)).isEqualTo(value);
+ });
+ }
+
+ @Test
+ public void primitiveIsAllowed() {
+ server1.invoke(() -> {
+ Region<Object, Object> region = server.get().getCache().getRegion("region");
+
+ Object key = 1;
+ Object value = 1;
+
+ // puts entry locally and propagates to server2
+ region.put(key, value);
+
+ // entry exists in server1
+ assertThat(region.containsKey(key)).isTrue();
+ assertThat(region.get(key)).isSameAs(value);
+ });
+
+ server2.invoke(() -> {
+ Region<Object, Object> region = server.get().getCache().getRegion("region");
+
+ Object key = 1;
+ Object value = 1;
+
+ // entry exists in server2
+ assertThat(region.containsKey(key)).isTrue();
+ assertThat(region.get(key)).isEqualTo(value);
+ });
+ }
+
+ @Test
+ public void nonSerializableThrowsNotSerializableException() {
+ server1.invoke(() -> {
+ Region<Object, Object> region = server.get().getCache().getRegion("region");
+
+ Object key = new Object();
+ Object value = new Object();
+
+ // put stores entry locally and then tries to propagate to server2
+ Throwable thrown = catchThrowable(() -> {
+ region.put(key, value);
+ });
+
+ // key and value fail to serialize non-serializable objects in server1
+ assertThat(thrown).hasCauseExactlyInstanceOf(NotSerializableException.class);
+
+ // entry exists in server1 despite serialization failure
+ assertThat(region.containsKey(key)).isTrue();
+ assertThat(region.get(key)).isSameAs(value);
+ });
+
+ server2.invoke(() -> {
+ Region<Object, Object> region = server.get().getCache().getRegion("region");
+
+ Object key = new Object();
+
+ // entry does NOT exist in server2 at all
+ assertThat(region.containsKey(key)).isFalse();
+ assertThat(region.get(key)).isNull();
+ });
+ }
+
+ @Test
+ public void nonAllowedValueFailsToDeserializeInOtherServer() {
+ addIgnoredException(InvalidClassException.class);
+ addIgnoredException(SerializationException.class);
+
+ server1.invoke(() -> {
+ Region<Object, Object> region = server.get().getCache().getRegion("region");
+
+ Object key = "key";
+ Object value = new SerializableClass();
+
+ // put stores entry locally and sends serialized key/value to server2
+ region.put(key, value);
+
+ // entry exists in server1
+ assertThat(region.get(key)).isInstanceOf(SerializableClass.class);
+ });
+
+ server2.invoke(() -> {
+ Region<Object, Object> region = server.get().getCache().getRegion("region");
+
+ Object key = "key";
+
+ // key exists in server2
+ assertThat(region.containsKey(key)).isTrue();
+
+ // get tries to fetch value from server1 if it's missing in server2
+ Throwable thrown = catchThrowable(() -> {
+ region.get(key);
+ });
+
+ // value fails to deserialize in server2
+ assertThat(thrown)
+ .isInstanceOf(SerializationException.class)
+ .hasCauseInstanceOf(InvalidClassException.class);
+ });
+ }
+
+ @Test
+ public void nonAllowedKeyFailsToDeserializeInOtherServer() {
+ addIgnoredException(InvalidClassException.class);
+ addIgnoredException(IOException.class);
+
+ server1.invoke(() -> {
+ Region<Object, Object> region = server.get().getCache().getRegion("region");
+
+ Object key = new SerializableClass();
+ Object value = "value";
+
+ // put stores entry locally and ails to serialize for propagation to server2
+ Throwable thrown = catchThrowable(() -> {
+ region.put(key, value);
+ });
+
+ // put fails to create entry locally because key is not serializable
+ assertThat(thrown)
+ .isInstanceOf(InternalGemFireException.class)
+ .hasCauseInstanceOf(IOException.class)
+ .hasRootCauseInstanceOf(InvalidClassException.class);
+
+ // entry exists in server1
+ assertThat(region.containsKey(key)).isTrue();
+ assertThat(region.get(key)).isEqualTo(value);
+ });
+
+ server2.invoke(() -> {
+ Region<Object, Object> region = server.get().getCache().getRegion("region");
+
+ Object key = new Object();
+
+ // entry does NOT exist in server2
+ assertThat(region.containsKey(key)).isFalse();
+ assertThat(region.get(key)).isNull();
+ });
+ }
+
+ @Test
+ public void nonAllowedKeyAndValueThrowsInsteadOfPutting() {
+ addIgnoredException(InvalidClassException.class);
+ addIgnoredException(IOException.class);
+
+ server1.invoke(() -> {
+ Region<Object, Object> region = server.get().getCache().getRegion("region");
+
+ Object key = new SerializableClass();
+ Object value = new SerializableClass();
+
+ // put stores entry locally tries sending to server/key to server2
+ Throwable thrown = catchThrowable(() -> {
+ region.put(key, value);
+ });
+
+ // value fails to propagate to server2
+ assertThat(thrown)
+ .isInstanceOf(InternalGemFireException.class)
+ .hasCauseInstanceOf(IOException.class)
+ .hasRootCauseInstanceOf(InvalidClassException.class);
+ });
+
+ server2.invoke(() -> {
+ Region<Object, Object> region = server.get().getCache().getRegion("region");
+
+ Object key = new SerializableClass();
+
+ // entry does NOT exist in server2
+ assertThat(region.containsKey(key)).isFalse();
+ assertThat(region.get(key)).isNull();
+ });
+ }
+
+ private ServerLauncher startServer(String serverName, File serverDir) {
+ ServerLauncher serverLauncher = new ServerLauncher.Builder()
+ .setDisableDefaultServer(true)
+ .setDeletePidFileOnStop(true)
+ .setMemberName(serverName)
+ .setWorkingDirectory(serverDir.getAbsolutePath())
+ .setServerPort(0)
+ .set(ENABLE_CLUSTER_CONFIGURATION, "false")
+ .set(LOCATORS, "localHost[" + locatorPort + "]")
+ .set(VALIDATE_SERIALIZABLE_OBJECTS, "true")
+ .build();
+
+ serverLauncher.start();
+
+ return serverLauncher;
+ }
+
+ /**
+ * Simple Java serializable class that is not accept listed using serializable-object-filter.
+ * Deserialization of instances of this type will be rejected when validate-serializable-objects
+ * is enabled.
+ */
+ public static class SerializableClass implements Serializable {
+ }
+}
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/distributed/LocatorLauncherJmxManagerLocalRegressionTest.java b/geode-core/src/integrationTest/java/org/apache/geode/distributed/LocatorLauncherJmxManagerLocalRegressionTest.java
index d304b91..430d8b1 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/distributed/LocatorLauncherJmxManagerLocalRegressionTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/distributed/LocatorLauncherJmxManagerLocalRegressionTest.java
@@ -35,7 +35,7 @@ import org.apache.geode.internal.process.ProcessType;
* Regression tests for stopping a JMX Manager process launched with {@link LocatorLauncher}.
*
* <p>
- * Confirms fix for <bold>Locator not stopping correctly if jmx-manager-port=0</bold>
+ * Confirms fix for <strong>Locator not stopping correctly if jmx-manager-port=0</strong>
*
* <p>
* Refactored from LocatorLauncherAssemblyIntegrationTest which used to be in geode-assembly.
@@ -104,6 +104,26 @@ public class LocatorLauncherJmxManagerLocalRegressionTest
assertThatThreadsStopped();
}
+ @Test
+ public void startsLocatorWithJmxManager() {
+ startLocator(newBuilder()
+ .setDeletePidFileOnStop(true)
+ .setMemberName(getUniqueName())
+ .setPort(defaultLocatorPort)
+ .setRedirectOutput(false)
+ .setWorkingDirectory(getWorkingDirectoryPath())
+ .set(ENABLE_CLUSTER_CONFIGURATION, "false")
+ .set(JMX_MANAGER, "true")
+ .set(JMX_MANAGER_START, "true")
+ .set(JMX_MANAGER_PORT, String.valueOf(jmxManagerPort))
+ .set(LOG_LEVEL, "config"));
+
+ stopLocator();
+
+ assertDeletionOf(getPidFile());
+ assertThatThreadsStopped();
+ }
+
private void assertThatThreadsStopped() {
await()
.atMost(AWAIT_MILLIS, MILLISECONDS)
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherGlobalSerialFilterBlankIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherGlobalSerialFilterBlankIntegrationTest.java
new file mode 100644
index 0000000..0b352c4
--- /dev/null
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherGlobalSerialFilterBlankIntegrationTest.java
@@ -0,0 +1,55 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.lang.String.valueOf;
+import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_START;
+import static org.apache.geode.distributed.ConfigurationProperties.LOG_FILE;
+import static org.apache.geode.internal.serialization.filter.SerialFilterAssertions.assertThatSerialFilterIsSameAs;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.junit.Test;
+
+import org.apache.geode.distributed.LocatorLauncher;
+
+public class LocatorLauncherGlobalSerialFilterBlankIntegrationTest
+ extends LocatorLauncherWithJmxManager {
+
+ @Test
+ public void startDoesNotConfigureGlobalSerialFilter_whenFilterIsBlank()
+ throws InvocationTargetException, IllegalAccessException {
+ Object existingGlobalSerialFilter = OBJECT_INPUT_FILTER_API.createFilter(" ");
+ OBJECT_INPUT_FILTER_API.setSerialFilter(existingGlobalSerialFilter);
+
+ locator.set(new LocatorLauncher.Builder()
+ .setMemberName(NAME)
+ .setPort(locatorPort)
+ .setWorkingDirectory(valueOf(workingDirectory))
+ .set(HTTP_SERVICE_PORT, "0")
+ .set(JMX_MANAGER, "true")
+ .set(JMX_MANAGER_PORT, valueOf(jmxPort))
+ .set(JMX_MANAGER_START, "true")
+ .set(LOG_FILE, valueOf(logFile))
+ .build())
+ .get()
+ .start();
+
+ assertThatSerialFilterIsSameAs(existingGlobalSerialFilter);
+ }
+}
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherGlobalSerialFilterExistsIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherGlobalSerialFilterExistsIntegrationTest.java
new file mode 100644
index 0000000..c948f59
--- /dev/null
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherGlobalSerialFilterExistsIntegrationTest.java
@@ -0,0 +1,55 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.lang.String.valueOf;
+import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_START;
+import static org.apache.geode.distributed.ConfigurationProperties.LOG_FILE;
+import static org.apache.geode.internal.serialization.filter.SerialFilterAssertions.assertThatSerialFilterIsSameAs;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.junit.Test;
+
+import org.apache.geode.distributed.LocatorLauncher;
+
+public class LocatorLauncherGlobalSerialFilterExistsIntegrationTest
+ extends LocatorLauncherWithJmxManager {
+
+ @Test
+ public void startDoesNotConfigureGlobalSerialFilter_whenFilterExists()
+ throws InvocationTargetException, IllegalAccessException {
+ Object existingGlobalSerialFilter = OBJECT_INPUT_FILTER_API.createFilter("!*");
+ OBJECT_INPUT_FILTER_API.setSerialFilter(existingGlobalSerialFilter);
+
+ locator.set(new LocatorLauncher.Builder()
+ .setMemberName(NAME)
+ .setPort(locatorPort)
+ .setWorkingDirectory(valueOf(workingDirectory))
+ .set(HTTP_SERVICE_PORT, "0")
+ .set(JMX_MANAGER, "true")
+ .set(JMX_MANAGER_PORT, valueOf(jmxPort))
+ .set(JMX_MANAGER_START, "true")
+ .set(LOG_FILE, valueOf(logFile))
+ .build())
+ .get()
+ .start();
+
+ assertThatSerialFilterIsSameAs(existingGlobalSerialFilter);
+ }
+}
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherGlobalSerialFilterIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherGlobalSerialFilterIntegrationTest.java
new file mode 100644
index 0000000..8be64f3
--- /dev/null
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherGlobalSerialFilterIntegrationTest.java
@@ -0,0 +1,52 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.lang.String.valueOf;
+import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_START;
+import static org.apache.geode.distributed.ConfigurationProperties.LOG_FILE;
+import static org.apache.geode.internal.serialization.filter.SerialFilterAssertions.assertThatSerialFilterIsNull;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.junit.Test;
+
+import org.apache.geode.distributed.LocatorLauncher;
+
+public class LocatorLauncherGlobalSerialFilterIntegrationTest
+ extends LocatorLauncherWithJmxManager {
+
+ @Test
+ public void startDoesNotConfigureGlobalSerialFilter_whenFilterDoesNotExist()
+ throws InvocationTargetException, IllegalAccessException {
+ locator.set(new LocatorLauncher.Builder()
+ .setMemberName(NAME)
+ .setPort(locatorPort)
+ .setWorkingDirectory(valueOf(workingDirectory))
+ .set(HTTP_SERVICE_PORT, "0")
+ .set(JMX_MANAGER, "true")
+ .set(JMX_MANAGER_PORT, valueOf(jmxPort))
+ .set(JMX_MANAGER_START, "true")
+ .set(LOG_FILE, valueOf(logFile))
+ .build())
+ .get()
+ .start();
+
+ assertThatSerialFilterIsNull();
+ }
+}
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherGlobalSerialFilterPropertyBlankIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherGlobalSerialFilterPropertyBlankIntegrationTest.java
new file mode 100644
index 0000000..ea021f4
--- /dev/null
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherGlobalSerialFilterPropertyBlankIntegrationTest.java
@@ -0,0 +1,54 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.lang.String.valueOf;
+import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_START;
+import static org.apache.geode.distributed.ConfigurationProperties.LOG_FILE;
+import static org.apache.geode.internal.serialization.filter.SerialFilterAssertions.assertThatSerialFilterIsNull;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.junit.Test;
+
+import org.apache.geode.distributed.LocatorLauncher;
+
+public class LocatorLauncherGlobalSerialFilterPropertyBlankIntegrationTest
+ extends LocatorLauncherWithJmxManager {
+
+ @Test
+ public void startDoesNotConfigureGlobalSerialFilter_whenPropertyIsBlank()
+ throws InvocationTargetException, IllegalAccessException {
+ System.setProperty(JDK_PROPERTY, " ");
+
+ locator.set(new LocatorLauncher.Builder()
+ .setMemberName(NAME)
+ .setPort(locatorPort)
+ .setWorkingDirectory(valueOf(workingDirectory))
+ .set(HTTP_SERVICE_PORT, "0")
+ .set(JMX_MANAGER, "true")
+ .set(JMX_MANAGER_PORT, valueOf(jmxPort))
+ .set(JMX_MANAGER_START, "true")
+ .set(LOG_FILE, valueOf(logFile))
+ .build())
+ .get()
+ .start();
+
+ assertThatSerialFilterIsNull();
+ }
+}
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherGlobalSerialFilterPropertyEmptyIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherGlobalSerialFilterPropertyEmptyIntegrationTest.java
new file mode 100644
index 0000000..52b46f6
--- /dev/null
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherGlobalSerialFilterPropertyEmptyIntegrationTest.java
@@ -0,0 +1,54 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.lang.String.valueOf;
+import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_START;
+import static org.apache.geode.distributed.ConfigurationProperties.LOG_FILE;
+import static org.apache.geode.internal.serialization.filter.SerialFilterAssertions.assertThatSerialFilterIsNull;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.junit.Test;
+
+import org.apache.geode.distributed.LocatorLauncher;
+
+public class LocatorLauncherGlobalSerialFilterPropertyEmptyIntegrationTest
+ extends LocatorLauncherWithJmxManager {
+
+ @Test
+ public void startDoesNotConfigureGlobalSerialFilter_whenPropertyIsEmpty()
+ throws InvocationTargetException, IllegalAccessException {
+ System.setProperty(JDK_PROPERTY, "");
+
+ locator.set(new LocatorLauncher.Builder()
+ .setMemberName(NAME)
+ .setPort(locatorPort)
+ .setWorkingDirectory(valueOf(workingDirectory))
+ .set(HTTP_SERVICE_PORT, "0")
+ .set(JMX_MANAGER, "true")
+ .set(JMX_MANAGER_PORT, valueOf(jmxPort))
+ .set(JMX_MANAGER_START, "true")
+ .set(LOG_FILE, valueOf(logFile))
+ .build())
+ .get()
+ .start();
+
+ assertThatSerialFilterIsNull();
+ }
+}
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherJmxSerialFilterIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherJmxSerialFilterIntegrationTest.java
new file mode 100644
index 0000000..66f7137
--- /dev/null
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherJmxSerialFilterIntegrationTest.java
@@ -0,0 +1,84 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.lang.String.valueOf;
+import static org.apache.commons.lang3.JavaVersion.JAVA_1_8;
+import static org.apache.commons.lang3.JavaVersion.JAVA_9;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtMost;
+import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_START;
+import static org.apache.geode.distributed.ConfigurationProperties.LOG_FILE;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assumptions.assumeThat;
+
+import org.junit.Test;
+
+import org.apache.geode.distributed.LocatorLauncher;
+
+public class LocatorLauncherJmxSerialFilterIntegrationTest
+ extends LocatorLauncherWithJmxManager {
+
+ @Test
+ public void startConfiguresJmxSerialFilter_onJava9orGreater() {
+ assumeThat(isJavaVersionAtLeast(JAVA_9)).isTrue();
+
+ locator.set(new LocatorLauncher.Builder()
+ .setMemberName(NAME)
+ .setPort(locatorPort)
+ .setWorkingDirectory(valueOf(workingDirectory))
+ .set(HTTP_SERVICE_PORT, "0")
+ .set(JMX_MANAGER, "true")
+ .set(JMX_MANAGER_PORT, valueOf(jmxPort))
+ .set(JMX_MANAGER_START, "true")
+ .set(LOG_FILE, valueOf(logFile))
+ .build())
+ .get()
+ .start();
+
+ assertThat(isJmxManagerStarted())
+ .isTrue();
+ assertThat(System.getProperty(JMX_PROPERTY))
+ .as(JMX_PROPERTY)
+ .isEqualTo(openMBeanFilterPattern);
+ }
+
+ @Test
+ public void startDoesNotConfigureJmxSerialFilter_onJava8() {
+ assumeThat(isJavaVersionAtMost(JAVA_1_8)).isTrue();
+
+ locator.set(new LocatorLauncher.Builder()
+ .setMemberName(NAME)
+ .setPort(locatorPort)
+ .setWorkingDirectory(valueOf(workingDirectory))
+ .set(HTTP_SERVICE_PORT, "0")
+ .set(JMX_MANAGER, "true")
+ .set(JMX_MANAGER_PORT, valueOf(jmxPort))
+ .set(JMX_MANAGER_START, "true")
+ .set(LOG_FILE, valueOf(logFile))
+ .build())
+ .get()
+ .start();
+
+ assertThat(isJmxManagerStarted())
+ .isTrue();
+ assertThat(System.getProperty(JMX_PROPERTY))
+ .as(JMX_PROPERTY)
+ .isNull();
+ }
+}
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherJmxSerialFilterPropertyBlankIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherJmxSerialFilterPropertyBlankIntegrationTest.java
new file mode 100644
index 0000000..bb6b01b
--- /dev/null
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherJmxSerialFilterPropertyBlankIntegrationTest.java
@@ -0,0 +1,88 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.lang.String.valueOf;
+import static org.apache.commons.lang3.JavaVersion.JAVA_1_8;
+import static org.apache.commons.lang3.JavaVersion.JAVA_9;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtMost;
+import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_START;
+import static org.apache.geode.distributed.ConfigurationProperties.LOG_FILE;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assumptions.assumeThat;
+
+import org.junit.Test;
+
+import org.apache.geode.distributed.LocatorLauncher;
+
+public class LocatorLauncherJmxSerialFilterPropertyBlankIntegrationTest
+ extends LocatorLauncherWithJmxManager {
+
+ @Test
+ public void startConfiguresJmxSerialFilter_whenPropertyIsBlank_onJava9orGreater() {
+ assumeThat(isJavaVersionAtLeast(JAVA_9)).isTrue();
+
+ System.setProperty(JMX_PROPERTY, " ");
+
+ locator.set(new LocatorLauncher.Builder()
+ .setMemberName(NAME)
+ .setPort(locatorPort)
+ .setWorkingDirectory(valueOf(workingDirectory))
+ .set(HTTP_SERVICE_PORT, "0")
+ .set(JMX_MANAGER, "true")
+ .set(JMX_MANAGER_PORT, valueOf(jmxPort))
+ .set(JMX_MANAGER_START, "true")
+ .set(LOG_FILE, valueOf(logFile))
+ .build())
+ .get()
+ .start();
+
+ assertThat(isJmxManagerStarted())
+ .isTrue();
+ assertThat(System.getProperty(JMX_PROPERTY))
+ .as(JMX_PROPERTY)
+ .isEqualTo(openMBeanFilterPattern);
+ }
+
+ @Test
+ public void startDoesNotConfigureJmxSerialFilter_whenPropertyIsBlank_onJava8() {
+ assumeThat(isJavaVersionAtMost(JAVA_1_8)).isTrue();
+
+ System.setProperty(JMX_PROPERTY, " ");
+
+ locator.set(new LocatorLauncher.Builder()
+ .setMemberName(NAME)
+ .setPort(locatorPort)
+ .setWorkingDirectory(valueOf(workingDirectory))
+ .set(HTTP_SERVICE_PORT, "0")
+ .set(JMX_MANAGER, "true")
+ .set(JMX_MANAGER_PORT, valueOf(jmxPort))
+ .set(JMX_MANAGER_START, "true")
+ .set(LOG_FILE, valueOf(logFile))
+ .build())
+ .get()
+ .start();
+
+ assertThat(isJmxManagerStarted())
+ .isTrue();
+ assertThat(System.getProperty(JMX_PROPERTY))
+ .as(JMX_PROPERTY)
+ .isEqualTo(" ");
+ }
+}
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherJmxSerialFilterPropertyEmptyIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherJmxSerialFilterPropertyEmptyIntegrationTest.java
new file mode 100644
index 0000000..d924f6c
--- /dev/null
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherJmxSerialFilterPropertyEmptyIntegrationTest.java
@@ -0,0 +1,88 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.lang.String.valueOf;
+import static org.apache.commons.lang3.JavaVersion.JAVA_1_8;
+import static org.apache.commons.lang3.JavaVersion.JAVA_9;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtMost;
+import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_START;
+import static org.apache.geode.distributed.ConfigurationProperties.LOG_FILE;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assumptions.assumeThat;
+
+import org.junit.Test;
+
+import org.apache.geode.distributed.LocatorLauncher;
+
+public class LocatorLauncherJmxSerialFilterPropertyEmptyIntegrationTest
+ extends LocatorLauncherWithJmxManager {
+
+ @Test
+ public void startConfiguresJmxSerialFilter_whenPropertyIsEmpty_onJava9orGreater() {
+ assumeThat(isJavaVersionAtLeast(JAVA_9)).isTrue();
+
+ System.setProperty(JMX_PROPERTY, "");
+
+ locator.set(new LocatorLauncher.Builder()
+ .setMemberName(NAME)
+ .setPort(locatorPort)
+ .setWorkingDirectory(valueOf(workingDirectory))
+ .set(HTTP_SERVICE_PORT, "0")
+ .set(JMX_MANAGER, "true")
+ .set(JMX_MANAGER_PORT, valueOf(jmxPort))
+ .set(JMX_MANAGER_START, "true")
+ .set(LOG_FILE, valueOf(logFile))
+ .build())
+ .get()
+ .start();
+
+ assertThat(isJmxManagerStarted())
+ .isTrue();
+ assertThat(System.getProperty(JMX_PROPERTY))
+ .as(JMX_PROPERTY)
+ .isEqualTo(openMBeanFilterPattern);
+ }
+
+ @Test
+ public void startDoesNotConfigureJmxSerialFilter_whenPropertyIsEmpty_onJava8() {
+ assumeThat(isJavaVersionAtMost(JAVA_1_8)).isTrue();
+
+ System.setProperty(JMX_PROPERTY, "");
+
+ locator.set(new LocatorLauncher.Builder()
+ .setMemberName(NAME)
+ .setPort(locatorPort)
+ .setWorkingDirectory(valueOf(workingDirectory))
+ .set(HTTP_SERVICE_PORT, "0")
+ .set(JMX_MANAGER, "true")
+ .set(JMX_MANAGER_PORT, valueOf(jmxPort))
+ .set(JMX_MANAGER_START, "true")
+ .set(LOG_FILE, valueOf(logFile))
+ .build())
+ .get()
+ .start();
+
+ assertThat(isJmxManagerStarted())
+ .isTrue();
+ assertThat(System.getProperty(JMX_PROPERTY))
+ .as(JMX_PROPERTY)
+ .isEqualTo("");
+ }
+}
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherJmxSerialFilterPropertyExistsIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherJmxSerialFilterPropertyExistsIntegrationTest.java
new file mode 100644
index 0000000..3de7ac2
--- /dev/null
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherJmxSerialFilterPropertyExistsIntegrationTest.java
@@ -0,0 +1,90 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.lang.String.valueOf;
+import static org.apache.commons.lang3.JavaVersion.JAVA_1_8;
+import static org.apache.commons.lang3.JavaVersion.JAVA_9;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtMost;
+import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_START;
+import static org.apache.geode.distributed.ConfigurationProperties.LOG_FILE;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assumptions.assumeThat;
+
+import org.junit.Test;
+
+import org.apache.geode.distributed.LocatorLauncher;
+
+public class LocatorLauncherJmxSerialFilterPropertyExistsIntegrationTest
+ extends LocatorLauncherWithJmxManager {
+
+ @Test
+ public void startDoesNotConfigureJmxSerialFilter_whenPropertyExists_onJava9orGreater() {
+ assumeThat(isJavaVersionAtLeast(JAVA_9)).isTrue();
+
+ String existingJmxSerialFilter = "!*";
+ System.setProperty(JMX_PROPERTY, existingJmxSerialFilter);
+
+ locator.set(new LocatorLauncher.Builder()
+ .setMemberName(NAME)
+ .setPort(locatorPort)
+ .setWorkingDirectory(valueOf(workingDirectory))
+ .set(HTTP_SERVICE_PORT, "0")
+ .set(JMX_MANAGER, "true")
+ .set(JMX_MANAGER_PORT, valueOf(jmxPort))
+ .set(JMX_MANAGER_START, "true")
+ .set(LOG_FILE, valueOf(logFile))
+ .build())
+ .get()
+ .start();
+
+ assertThat(isJmxManagerStarted())
+ .isTrue();
+ assertThat(System.getProperty(JMX_PROPERTY))
+ .as(JMX_PROPERTY)
+ .isEqualTo(existingJmxSerialFilter);
+ }
+
+ @Test
+ public void startDoesNotConfigureJmxSerialFilter_whenPropertyExists_onJava8() {
+ assumeThat(isJavaVersionAtMost(JAVA_1_8)).isTrue();
+
+ String existingJmxSerialFilter = "!*";
+ System.setProperty(JMX_PROPERTY, existingJmxSerialFilter);
+
+ locator.set(new LocatorLauncher.Builder()
+ .setMemberName(NAME)
+ .setPort(locatorPort)
+ .setWorkingDirectory(valueOf(workingDirectory))
+ .set(HTTP_SERVICE_PORT, "0")
+ .set(JMX_MANAGER, "true")
+ .set(JMX_MANAGER_PORT, valueOf(jmxPort))
+ .set(JMX_MANAGER_START, "true")
+ .set(LOG_FILE, valueOf(logFile))
+ .build())
+ .get()
+ .start();
+
+ assertThat(isJmxManagerStarted())
+ .isTrue();
+ assertThat(System.getProperty(JMX_PROPERTY))
+ .as(JMX_PROPERTY)
+ .isEqualTo(existingJmxSerialFilter);
+ }
+}
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherWithJmxManager.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherWithJmxManager.java
new file mode 100644
index 0000000..8bd96f5
--- /dev/null
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherWithJmxManager.java
@@ -0,0 +1,82 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static org.apache.geode.internal.AvailablePortHelper.getRandomAvailableTCPPorts;
+
+import java.nio.file.Path;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.contrib.java.lang.system.RestoreSystemProperties;
+import org.junit.rules.TemporaryFolder;
+
+import org.apache.geode.distributed.LocatorLauncher;
+import org.apache.geode.distributed.internal.InternalLocator;
+import org.apache.geode.internal.cache.InternalCache;
+import org.apache.geode.management.ManagementService;
+import org.apache.geode.management.internal.SystemManagementService;
+import org.apache.geode.test.junit.rules.CloseableReference;
+
+abstract class LocatorLauncherWithJmxManager {
+
+ static final String NAME = "locator";
+ static final String JDK_PROPERTY = "jdk.serialFilter";
+ static final String JMX_PROPERTY = "jmx.remote.rmi.server.serial.filter.pattern";
+
+ static final ObjectInputFilterApi OBJECT_INPUT_FILTER_API =
+ new ReflectiveObjectInputFilterApiFactory().createObjectInputFilterApi();
+
+ Path workingDirectory;
+ int locatorPort;
+ int jmxPort;
+ Path logFile;
+ String openMBeanFilterPattern;
+
+ @Rule
+ public CloseableReference<LocatorLauncher> locator = new CloseableReference<>();
+ @Rule
+ public RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties();
+ @Rule
+ public TemporaryFolder temporaryFolder = new TemporaryFolder();
+
+ @Before
+ public void setUpFiles() {
+ workingDirectory = temporaryFolder.getRoot().toPath().toAbsolutePath();
+ logFile = workingDirectory.resolve(NAME + ".log").toAbsolutePath();
+ }
+
+ @Before
+ public void setUpPorts() {
+ int[] ports = getRandomAvailableTCPPorts(2);
+ jmxPort = ports[0];
+ locatorPort = ports[1];
+ }
+
+ @Before
+ public void setUpFilterPattern() {
+ openMBeanFilterPattern = new OpenMBeanFilterPattern().pattern();
+ }
+
+ SystemManagementService getSystemManagementService() {
+ InternalLocator locator = (InternalLocator) this.locator.get().getLocator();
+ InternalCache cache = locator.getCache();
+ return (SystemManagementService) ManagementService.getManagementService(cache);
+ }
+
+ boolean isJmxManagerStarted() {
+ return getSystemManagementService().isManager();
+ }
+}
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/SerialFilterAssertions.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/SerialFilterAssertions.java
new file mode 100644
index 0000000..b6d552a
--- /dev/null
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/SerialFilterAssertions.java
@@ -0,0 +1,64 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.lang.reflect.InvocationTargetException;
+
+@SuppressWarnings({"unused", "WeakerAccess"})
+public class SerialFilterAssertions {
+
+ private static final ObjectInputFilterApi API = new ReflectiveObjectInputFilterApiFactory()
+ .createObjectInputFilterApi();
+
+ private SerialFilterAssertions() {
+ // do not instantiate
+ }
+
+ public static void assertThatSerialFilterIsNull()
+ throws InvocationTargetException, IllegalAccessException {
+ boolean exists = API.getSerialFilter() != null;
+ assertThat(exists)
+ .as("ObjectInputFilter$Config.getSerialFilter() is null")
+ .isFalse();
+ }
+
+ public static void assertThatSerialFilterIsNotNull()
+ throws InvocationTargetException, IllegalAccessException {
+ boolean exists = API.getSerialFilter() != null;
+ assertThat(exists)
+ .as("ObjectInputFilter$Config.getSerialFilter() is not null")
+ .isTrue();
+ }
+
+ public static void assertThatSerialFilterIsSameAs(Object objectInputFilter)
+ throws InvocationTargetException, IllegalAccessException {
+ Object currentFilter = API.getSerialFilter();
+ boolean sameIdentity = currentFilter == objectInputFilter;
+ assertThat(sameIdentity)
+ .as("ObjectInputFilter$Config.getSerialFilter() is same as parameter")
+ .isTrue();
+ }
+
+ public static void assertThatSerialFilterIsNotSameAs(Object objectInputFilter)
+ throws InvocationTargetException, IllegalAccessException {
+ Object currentFilter = API.getSerialFilter();
+ boolean sameIdentity = currentFilter == objectInputFilter;
+ assertThat(sameIdentity)
+ .as("ObjectInputFilter$Config.getSerialFilter() is same as parameter")
+ .isFalse();
+ }
+}
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherGlobalSerialFilterBlankIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherGlobalSerialFilterBlankIntegrationTest.java
new file mode 100644
index 0000000..5cbb8c2
--- /dev/null
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherGlobalSerialFilterBlankIntegrationTest.java
@@ -0,0 +1,55 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.lang.String.valueOf;
+import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_START;
+import static org.apache.geode.distributed.ConfigurationProperties.LOG_FILE;
+import static org.apache.geode.internal.serialization.filter.SerialFilterAssertions.assertThatSerialFilterIsSameAs;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.junit.Test;
+
+import org.apache.geode.distributed.ServerLauncher;
+
+public class ServerLauncherGlobalSerialFilterBlankIntegrationTest
+ extends ServerLauncherWithJmxManager {
+
+ @Test
+ public void startDoesNotConfigureGlobalSerialFilter_whenFilterIsBlank()
+ throws InvocationTargetException, IllegalAccessException {
+ Object existingGlobalSerialFilter = OBJECT_INPUT_FILTER_API.createFilter(" ");
+ OBJECT_INPUT_FILTER_API.setSerialFilter(existingGlobalSerialFilter);
+
+ server.set(new ServerLauncher.Builder()
+ .setMemberName(NAME)
+ .setDisableDefaultServer(true)
+ .setWorkingDirectory(valueOf(workingDirectory))
+ .set(HTTP_SERVICE_PORT, "0")
+ .set(JMX_MANAGER, "true")
+ .set(JMX_MANAGER_PORT, valueOf(jmxPort))
+ .set(JMX_MANAGER_START, "true")
+ .set(LOG_FILE, valueOf(logFile))
+ .build())
+ .get()
+ .start();
+
+ assertThatSerialFilterIsSameAs(existingGlobalSerialFilter);
+ }
+}
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherGlobalSerialFilterExistsIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherGlobalSerialFilterExistsIntegrationTest.java
new file mode 100644
index 0000000..b5560c6
--- /dev/null
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherGlobalSerialFilterExistsIntegrationTest.java
@@ -0,0 +1,55 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.lang.String.valueOf;
+import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_START;
+import static org.apache.geode.distributed.ConfigurationProperties.LOG_FILE;
+import static org.apache.geode.internal.serialization.filter.SerialFilterAssertions.assertThatSerialFilterIsSameAs;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.junit.Test;
+
+import org.apache.geode.distributed.ServerLauncher;
+
+public class ServerLauncherGlobalSerialFilterExistsIntegrationTest
+ extends ServerLauncherWithJmxManager {
+
+ @Test
+ public void startDoesNotConfigureGlobalSerialFilter_whenFilterExists()
+ throws InvocationTargetException, IllegalAccessException {
+ Object existingGlobalSerialFilter = OBJECT_INPUT_FILTER_API.createFilter("!*");
+ OBJECT_INPUT_FILTER_API.setSerialFilter(existingGlobalSerialFilter);
+
+ server.set(new ServerLauncher.Builder()
+ .setMemberName(NAME)
+ .setDisableDefaultServer(true)
+ .setWorkingDirectory(valueOf(workingDirectory))
+ .set(HTTP_SERVICE_PORT, "0")
+ .set(JMX_MANAGER, "true")
+ .set(JMX_MANAGER_PORT, valueOf(jmxPort))
+ .set(JMX_MANAGER_START, "true")
+ .set(LOG_FILE, valueOf(logFile))
+ .build())
+ .get()
+ .start();
+
+ assertThatSerialFilterIsSameAs(existingGlobalSerialFilter);
+ }
+}
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherGlobalSerialFilterIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherGlobalSerialFilterIntegrationTest.java
new file mode 100644
index 0000000..7c90152
--- /dev/null
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherGlobalSerialFilterIntegrationTest.java
@@ -0,0 +1,51 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.lang.String.valueOf;
+import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_START;
+import static org.apache.geode.distributed.ConfigurationProperties.LOG_FILE;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.Test;
+
+import org.apache.geode.distributed.ServerLauncher;
+
+public class ServerLauncherGlobalSerialFilterIntegrationTest
+ extends ServerLauncherWithJmxManager {
+
+ @Test
+ public void startDoesNotConfigureGlobalSerialFilter() {
+ server.set(new ServerLauncher.Builder()
+ .setMemberName(NAME)
+ .setDisableDefaultServer(true)
+ .setWorkingDirectory(valueOf(workingDirectory))
+ .set(HTTP_SERVICE_PORT, "0")
+ .set(JMX_MANAGER, "true")
+ .set(JMX_MANAGER_PORT, valueOf(jmxPort))
+ .set(JMX_MANAGER_START, "true")
+ .set(LOG_FILE, valueOf(logFile))
+ .build())
+ .get()
+ .start();
+
+ assertThat(System.getProperty(JDK_PROPERTY))
+ .as(JDK_PROPERTY)
+ .isNull();
+ }
+}
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherGlobalSerialFilterPropertyBlankIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherGlobalSerialFilterPropertyBlankIntegrationTest.java
new file mode 100644
index 0000000..6fb95df
--- /dev/null
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherGlobalSerialFilterPropertyBlankIntegrationTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.lang.String.valueOf;
+import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_START;
+import static org.apache.geode.distributed.ConfigurationProperties.LOG_FILE;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.Test;
+
+import org.apache.geode.distributed.ServerLauncher;
+
+public class ServerLauncherGlobalSerialFilterPropertyBlankIntegrationTest
+ extends ServerLauncherWithJmxManager {
+
+ @Test
+ public void startDoesNotConfigureGlobalSerialFilter_whenPropertyIsBlank() {
+ System.setProperty(JDK_PROPERTY, " ");
+
+ server.set(new ServerLauncher.Builder()
+ .setMemberName(NAME)
+ .setDisableDefaultServer(true)
+ .setWorkingDirectory(valueOf(workingDirectory))
+ .set(HTTP_SERVICE_PORT, "0")
+ .set(JMX_MANAGER, "true")
+ .set(JMX_MANAGER_PORT, valueOf(jmxPort))
+ .set(JMX_MANAGER_START, "true")
+ .set(LOG_FILE, valueOf(logFile))
+ .build())
+ .get()
+ .start();
+
+ assertThat(System.getProperty(JDK_PROPERTY))
+ .as(JDK_PROPERTY)
+ .isEqualTo(" ");
+ }
+}
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherGlobalSerialFilterPropertyEmptyIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherGlobalSerialFilterPropertyEmptyIntegrationTest.java
new file mode 100644
index 0000000..e34d400
--- /dev/null
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherGlobalSerialFilterPropertyEmptyIntegrationTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.lang.String.valueOf;
+import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_START;
+import static org.apache.geode.distributed.ConfigurationProperties.LOG_FILE;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.Test;
+
+import org.apache.geode.distributed.ServerLauncher;
+
+public class ServerLauncherGlobalSerialFilterPropertyEmptyIntegrationTest
+ extends ServerLauncherWithJmxManager {
+
+ @Test
+ public void startDoesNotConfigureGlobalSerialFilter_whenPropertyIsEmpty() {
+ System.setProperty(JDK_PROPERTY, "");
+
+ server.set(new ServerLauncher.Builder()
+ .setMemberName(NAME)
+ .setDisableDefaultServer(true)
+ .setWorkingDirectory(valueOf(workingDirectory))
+ .set(HTTP_SERVICE_PORT, "0")
+ .set(JMX_MANAGER, "true")
+ .set(JMX_MANAGER_PORT, valueOf(jmxPort))
+ .set(JMX_MANAGER_START, "true")
+ .set(LOG_FILE, valueOf(logFile))
+ .build())
+ .get()
+ .start();
+
+ assertThat(System.getProperty(JDK_PROPERTY))
+ .as(JDK_PROPERTY)
+ .isEmpty();
+ }
+}
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherJmxSerialFilterIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherJmxSerialFilterIntegrationTest.java
new file mode 100644
index 0000000..cf4c851
--- /dev/null
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherJmxSerialFilterIntegrationTest.java
@@ -0,0 +1,87 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.lang.String.valueOf;
+import static org.apache.commons.lang3.JavaVersion.JAVA_1_8;
+import static org.apache.commons.lang3.JavaVersion.JAVA_9;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtMost;
+import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_START;
+import static org.apache.geode.distributed.ConfigurationProperties.LOG_FILE;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assumptions.assumeThat;
+
+import org.junit.Test;
+
+import org.apache.geode.distributed.ServerLauncher;
+
+public class ServerLauncherJmxSerialFilterIntegrationTest
+ extends ServerLauncherWithJmxManager {
+
+ @Test
+ public void startConfiguresJmxSerialFilter_onJava9orGreater() {
+ assumeThat(isJavaVersionAtLeast(JAVA_9)).isTrue();
+
+ server.set(new ServerLauncher.Builder()
+ .setDisableDefaultServer(true)
+ .setMemberName(NAME)
+ .setWorkingDirectory(valueOf(workingDirectory))
+ .set(HTTP_SERVICE_PORT, "0")
+ .set(JMX_MANAGER, "true")
+ .set(JMX_MANAGER_PORT, valueOf(jmxPort))
+ .set(JMX_MANAGER_START, "true")
+ .set(LOG_FILE, valueOf(logFile))
+ .build())
+ .get()
+ .start();
+
+ assertThat(isJmxManagerStarted())
+ .isTrue();
+ assertThat(System.getProperty(JMX_PROPERTY))
+ .as(JMX_PROPERTY)
+ .isEqualTo(openMBeanFilterPattern);
+ }
+
+ /**
+ * The system property for the JmxSerialFilter was not added until Java 9.
+ */
+ @Test
+ public void startDoesNotConfigureJmxSerialFilter_onJava8() {
+ assumeThat(isJavaVersionAtMost(JAVA_1_8)).isTrue();
+
+ server.set(new ServerLauncher.Builder()
+ .setDisableDefaultServer(true)
+ .setMemberName(NAME)
+ .setWorkingDirectory(valueOf(workingDirectory))
+ .set(HTTP_SERVICE_PORT, "0")
+ .set(JMX_MANAGER, "true")
+ .set(JMX_MANAGER_PORT, valueOf(jmxPort))
+ .set(JMX_MANAGER_START, "true")
+ .set(LOG_FILE, valueOf(logFile))
+ .build())
+ .get()
+ .start();
+
+ assertThat(isJmxManagerStarted())
+ .isTrue();
+ assertThat(System.getProperty(JMX_PROPERTY))
+ .as(JMX_PROPERTY)
+ .isNull();
+ }
+}
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherJmxSerialFilterPropertyBlankIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherJmxSerialFilterPropertyBlankIntegrationTest.java
new file mode 100644
index 0000000..26aa5ed
--- /dev/null
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherJmxSerialFilterPropertyBlankIntegrationTest.java
@@ -0,0 +1,88 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.lang.String.valueOf;
+import static org.apache.commons.lang3.JavaVersion.JAVA_1_8;
+import static org.apache.commons.lang3.JavaVersion.JAVA_9;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtMost;
+import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_START;
+import static org.apache.geode.distributed.ConfigurationProperties.LOG_FILE;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assumptions.assumeThat;
+
+import org.junit.Test;
+
+import org.apache.geode.distributed.ServerLauncher;
+
+public class ServerLauncherJmxSerialFilterPropertyBlankIntegrationTest
+ extends ServerLauncherWithJmxManager {
+
+ @Test
+ public void startConfiguresJmxSerialFilter_whenPropertyIsBlank_onJava9orGreater() {
+ assumeThat(isJavaVersionAtLeast(JAVA_9)).isTrue();
+
+ System.setProperty(JMX_PROPERTY, " ");
+
+ server.set(new ServerLauncher.Builder()
+ .setDisableDefaultServer(true)
+ .setMemberName(NAME)
+ .setWorkingDirectory(valueOf(workingDirectory))
+ .set(HTTP_SERVICE_PORT, "0")
+ .set(JMX_MANAGER, "true")
+ .set(JMX_MANAGER_PORT, valueOf(jmxPort))
+ .set(JMX_MANAGER_START, "true")
+ .set(LOG_FILE, valueOf(logFile))
+ .build())
+ .get()
+ .start();
+
+ assertThat(isJmxManagerStarted())
+ .isTrue();
+ assertThat(System.getProperty(JMX_PROPERTY))
+ .as(JMX_PROPERTY)
+ .isEqualTo(openMBeanFilterPattern);
+ }
+
+ @Test
+ public void startDoesNotConfigureJmxSerialFilter_whenPropertyIsBlank_onJava8() {
+ assumeThat(isJavaVersionAtMost(JAVA_1_8)).isTrue();
+
+ System.setProperty(JMX_PROPERTY, " ");
+
+ server.set(new ServerLauncher.Builder()
+ .setDisableDefaultServer(true)
+ .setMemberName(NAME)
+ .setWorkingDirectory(valueOf(workingDirectory))
+ .set(HTTP_SERVICE_PORT, "0")
+ .set(JMX_MANAGER, "true")
+ .set(JMX_MANAGER_PORT, valueOf(jmxPort))
+ .set(JMX_MANAGER_START, "true")
+ .set(LOG_FILE, valueOf(logFile))
+ .build())
+ .get()
+ .start();
+
+ assertThat(isJmxManagerStarted())
+ .isTrue();
+ assertThat(System.getProperty(JMX_PROPERTY))
+ .as(JMX_PROPERTY)
+ .isEqualTo(" ");
+ }
+}
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherJmxSerialFilterPropertyEmptyIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherJmxSerialFilterPropertyEmptyIntegrationTest.java
new file mode 100644
index 0000000..68232a2
--- /dev/null
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherJmxSerialFilterPropertyEmptyIntegrationTest.java
@@ -0,0 +1,88 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.lang.String.valueOf;
+import static org.apache.commons.lang3.JavaVersion.JAVA_1_8;
+import static org.apache.commons.lang3.JavaVersion.JAVA_9;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtMost;
+import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_START;
+import static org.apache.geode.distributed.ConfigurationProperties.LOG_FILE;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assumptions.assumeThat;
+
+import org.junit.Test;
+
+import org.apache.geode.distributed.ServerLauncher;
+
+public class ServerLauncherJmxSerialFilterPropertyEmptyIntegrationTest
+ extends ServerLauncherWithJmxManager {
+
+ @Test
+ public void startConfiguresJmxSerialFilter_whenPropertyIsEmpty_onJava9orGreater() {
+ assumeThat(isJavaVersionAtLeast(JAVA_9)).isTrue();
+
+ System.setProperty(JMX_PROPERTY, "");
+
+ server.set(new ServerLauncher.Builder()
+ .setDisableDefaultServer(true)
+ .setMemberName(NAME)
+ .setWorkingDirectory(valueOf(workingDirectory))
+ .set(HTTP_SERVICE_PORT, "0")
+ .set(JMX_MANAGER, "true")
+ .set(JMX_MANAGER_PORT, valueOf(jmxPort))
+ .set(JMX_MANAGER_START, "true")
+ .set(LOG_FILE, valueOf(logFile))
+ .build())
+ .get()
+ .start();
+
+ assertThat(isJmxManagerStarted())
+ .isTrue();
+ assertThat(System.getProperty(JMX_PROPERTY))
+ .as(JMX_PROPERTY)
+ .isEqualTo(openMBeanFilterPattern);
+ }
+
+ @Test
+ public void startDoesNotConfigureJmxSerialFilter_whenPropertyIsEmpty_onJava8() {
+ assumeThat(isJavaVersionAtMost(JAVA_1_8)).isTrue();
+
+ System.setProperty(JMX_PROPERTY, "");
+
+ server.set(new ServerLauncher.Builder()
+ .setDisableDefaultServer(true)
+ .setMemberName(NAME)
+ .setWorkingDirectory(valueOf(workingDirectory))
+ .set(HTTP_SERVICE_PORT, "0")
+ .set(JMX_MANAGER, "true")
+ .set(JMX_MANAGER_PORT, valueOf(jmxPort))
+ .set(JMX_MANAGER_START, "true")
+ .set(LOG_FILE, valueOf(logFile))
+ .build())
+ .get()
+ .start();
+
+ assertThat(isJmxManagerStarted())
+ .isTrue();
+ assertThat(System.getProperty(JMX_PROPERTY))
+ .as(JMX_PROPERTY)
+ .isEqualTo("");
+ }
+}
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherJmxSerialFilterPropertyExistsIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherJmxSerialFilterPropertyExistsIntegrationTest.java
new file mode 100644
index 0000000..05e33ac
--- /dev/null
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherJmxSerialFilterPropertyExistsIntegrationTest.java
@@ -0,0 +1,90 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.lang.String.valueOf;
+import static org.apache.commons.lang3.JavaVersion.JAVA_1_8;
+import static org.apache.commons.lang3.JavaVersion.JAVA_9;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtMost;
+import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_PORT;
+import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_START;
+import static org.apache.geode.distributed.ConfigurationProperties.LOG_FILE;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assumptions.assumeThat;
+
+import org.junit.Test;
+
+import org.apache.geode.distributed.ServerLauncher;
+
+public class ServerLauncherJmxSerialFilterPropertyExistsIntegrationTest
+ extends ServerLauncherWithJmxManager {
+
+ @Test
+ public void startDoesNotConfigureJmxSerialFilter_whenPropertyExists_onJava9orGreater() {
+ assumeThat(isJavaVersionAtLeast(JAVA_9)).isTrue();
+
+ String existingJmxSerialFilter = "!*";
+ System.setProperty(JMX_PROPERTY, existingJmxSerialFilter);
+
+ server.set(new ServerLauncher.Builder()
+ .setDisableDefaultServer(true)
+ .setMemberName(NAME)
+ .setWorkingDirectory(valueOf(workingDirectory))
+ .set(HTTP_SERVICE_PORT, "0")
+ .set(JMX_MANAGER, "true")
+ .set(JMX_MANAGER_PORT, valueOf(jmxPort))
+ .set(JMX_MANAGER_START, "true")
+ .set(LOG_FILE, valueOf(logFile))
+ .build())
+ .get()
+ .start();
+
+ assertThat(isJmxManagerStarted())
+ .isTrue();
+ assertThat(System.getProperty(JMX_PROPERTY))
+ .as(JMX_PROPERTY)
+ .isEqualTo(existingJmxSerialFilter);
+ }
+
+ @Test
+ public void startDoesNotConfigureJmxSerialFilter_whenPropertyExists_onJava8() {
+ assumeThat(isJavaVersionAtMost(JAVA_1_8)).isTrue();
+
+ String existingJmxSerialFilter = "!*";
+ System.setProperty(JMX_PROPERTY, existingJmxSerialFilter);
+
+ server.set(new ServerLauncher.Builder()
+ .setDisableDefaultServer(true)
+ .setMemberName(NAME)
+ .setWorkingDirectory(valueOf(workingDirectory))
+ .set(HTTP_SERVICE_PORT, "0")
+ .set(JMX_MANAGER, "true")
+ .set(JMX_MANAGER_PORT, valueOf(jmxPort))
+ .set(JMX_MANAGER_START, "true")
+ .set(LOG_FILE, valueOf(logFile))
+ .build())
+ .get()
+ .start();
+
+ assertThat(isJmxManagerStarted())
+ .isTrue();
+ assertThat(System.getProperty(JMX_PROPERTY))
+ .as(JMX_PROPERTY)
+ .isEqualTo(existingJmxSerialFilter);
+ }
+}
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherWithJmxManager.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherWithJmxManager.java
new file mode 100644
index 0000000..eba157c
--- /dev/null
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherWithJmxManager.java
@@ -0,0 +1,77 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static org.apache.geode.internal.AvailablePortHelper.getRandomAvailableTCPPort;
+
+import java.nio.file.Path;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.contrib.java.lang.system.RestoreSystemProperties;
+import org.junit.rules.TemporaryFolder;
+
+import org.apache.geode.cache.Cache;
+import org.apache.geode.distributed.ServerLauncher;
+import org.apache.geode.management.ManagementService;
+import org.apache.geode.management.internal.SystemManagementService;
+import org.apache.geode.test.junit.rules.CloseableReference;
+
+abstract class ServerLauncherWithJmxManager {
+
+ static final String NAME = "server";
+ static final String JDK_PROPERTY = "jdk.serialFilter";
+ static final String JMX_PROPERTY = "jmx.remote.rmi.server.serial.filter.pattern";
+
+ static final ObjectInputFilterApi OBJECT_INPUT_FILTER_API =
+ new ReflectiveObjectInputFilterApiFactory().createObjectInputFilterApi();
+
+ Path workingDirectory;
+ int jmxPort;
+ Path logFile;
+ String openMBeanFilterPattern;
+
+ @Rule
+ public CloseableReference<ServerLauncher> server = new CloseableReference<>();
+ @Rule
+ public RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties();
+ @Rule
+ public TemporaryFolder temporaryFolder = new TemporaryFolder();
+
+ @Before
+ public void setUpFiles() {
+ workingDirectory = temporaryFolder.getRoot().toPath().toAbsolutePath();
+ logFile = workingDirectory.resolve(NAME + ".log").toAbsolutePath();
+ }
+
+ @Before
+ public void setUpPorts() {
+ jmxPort = getRandomAvailableTCPPort();
+ }
+
+ @Before
+ public void setUpFilterPattern() {
+ openMBeanFilterPattern = new OpenMBeanFilterPattern().pattern();
+ }
+
+ SystemManagementService getSystemManagementService() {
+ Cache cache = server.get().getCache();
+ return (SystemManagementService) ManagementService.getManagementService(cache);
+ }
+
+ boolean isJmxManagerStarted() {
+ return getSystemManagementService().isManager();
+ }
+}
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/management/internal/LocatorManagerConfiguresJmxSerialFilterIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/management/internal/LocatorManagerConfiguresJmxSerialFilterIntegrationTest.java
deleted file mode 100644
index 47f196f..0000000
--- a/geode-core/src/integrationTest/java/org/apache/geode/management/internal/LocatorManagerConfiguresJmxSerialFilterIntegrationTest.java
+++ /dev/null
@@ -1,204 +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.geode.management.internal;
-
-import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast;
-import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtMost;
-import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_PORT;
-import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER;
-import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_PORT;
-import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_START;
-import static org.apache.geode.distributed.ConfigurationProperties.LOG_FILE;
-import static org.apache.geode.internal.AvailablePortHelper.getRandomAvailableTCPPorts;
-import static org.apache.geode.management.internal.JmxRmiOpenTypesSerialFilter.PROPERTY_NAME;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assumptions.assumeThat;
-
-import java.io.File;
-
-import org.apache.commons.lang3.JavaVersion;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-
-import org.apache.geode.distributed.LocatorLauncher;
-import org.apache.geode.test.junit.rules.CloseableReference;
-
-public class LocatorManagerConfiguresJmxSerialFilterIntegrationTest {
-
- private static final String NAME = "locator";
-
- private File workingDirectory;
- private int locatorPort;
- private int jmxPort;
- private String expectedSerialFilter;
-
- @Rule
- public CloseableReference<LocatorLauncher> locator = new CloseableReference<>();
- @Rule
- public TemporaryFolder temporaryFolder = new TemporaryFolder();
-
- @Before
- public void setUp() throws Exception {
- workingDirectory = temporaryFolder.newFolder(NAME);
- int[] ports = getRandomAvailableTCPPorts(2);
- locatorPort = ports[0];
- jmxPort = ports[1];
- expectedSerialFilter = new JmxRmiOpenTypesSerialFilter().createSerialFilterPattern();
- }
-
- @After
- public void tearDown() {
- System.clearProperty(PROPERTY_NAME);
- }
-
- @Test
- public void startingLocatorWithJmxManager_configuresSerialFilter_atLeastJava9() {
- assumeThat(isJavaVersionAtLeast(JavaVersion.JAVA_9)).isTrue();
-
- locator.set(new LocatorLauncher.Builder()
- .setMemberName(NAME)
- .setPort(locatorPort)
- .setWorkingDirectory(workingDirectory.getAbsolutePath())
- .set(HTTP_SERVICE_PORT, "0")
- .set(JMX_MANAGER, "true")
- .set(JMX_MANAGER_PORT, String.valueOf(jmxPort))
- .set(JMX_MANAGER_START, "true")
- .set(LOG_FILE, new File(workingDirectory, NAME + ".log").getAbsolutePath())
- .build())
- .get()
- .start();
-
- String serialFilter = System.getProperty(PROPERTY_NAME);
- assertThat(serialFilter).isEqualTo(expectedSerialFilter);
- }
-
- @Test
- public void startingLocatorWithJmxManager_changesEmptySerialFilter_atLeastJava9() {
- assumeThat(isJavaVersionAtLeast(JavaVersion.JAVA_9)).isTrue();
-
- System.setProperty(PROPERTY_NAME, "");
-
- locator.set(new LocatorLauncher.Builder()
- .setMemberName(NAME)
- .setPort(locatorPort)
- .setWorkingDirectory(workingDirectory.getAbsolutePath())
- .set(HTTP_SERVICE_PORT, "0")
- .set(JMX_MANAGER, "true")
- .set(JMX_MANAGER_PORT, String.valueOf(jmxPort))
- .set(JMX_MANAGER_START, "true")
- .set(LOG_FILE, new File(workingDirectory, NAME + ".log").getAbsolutePath())
- .build())
- .get()
- .start();
-
- String serialFilter = System.getProperty(PROPERTY_NAME);
- assertThat(serialFilter).isEqualTo(expectedSerialFilter);
- }
-
- @Test
- public void startingLocatorWithJmxManager_skipsNonEmptySerialFilter_atLeastJava9() {
- assumeThat(isJavaVersionAtLeast(JavaVersion.JAVA_9)).isTrue();
-
- String existingSerialFilter = "!*";
- System.setProperty(PROPERTY_NAME, existingSerialFilter);
-
- locator.set(new LocatorLauncher.Builder()
- .setMemberName(NAME)
- .setPort(locatorPort)
- .setWorkingDirectory(workingDirectory.getAbsolutePath())
- .set(HTTP_SERVICE_PORT, "0")
- .set(JMX_MANAGER, "true")
- .set(JMX_MANAGER_PORT, String.valueOf(jmxPort))
- .set(JMX_MANAGER_START, "true")
- .set(LOG_FILE, new File(workingDirectory, NAME + ".log").getAbsolutePath())
- .build())
- .get()
- .start();
-
- String serialFilter = System.getProperty(PROPERTY_NAME);
- assertThat(serialFilter).isEqualTo(existingSerialFilter);
- }
-
- @Test
- public void startingLocatorWithJmxManager_skipsSerialFilter_atMostJava8() {
- assumeThat(isJavaVersionAtMost(JavaVersion.JAVA_1_8)).isTrue();
-
- locator.set(new LocatorLauncher.Builder()
- .setMemberName(NAME)
- .setPort(locatorPort)
- .setWorkingDirectory(workingDirectory.getAbsolutePath())
- .set(HTTP_SERVICE_PORT, "0")
- .set(JMX_MANAGER, "true")
- .set(JMX_MANAGER_PORT, String.valueOf(jmxPort))
- .set(JMX_MANAGER_START, "true")
- .set(LOG_FILE, new File(workingDirectory, NAME + ".log").getAbsolutePath())
- .build())
- .get()
- .start();
-
- String serialFilter = System.getProperty(PROPERTY_NAME);
- assertThat(serialFilter).isNull();
- }
-
- @Test
- public void startingLocatorWithJmxManager_skipsEmptySerialFilter_atMostJava8() {
- assumeThat(isJavaVersionAtMost(JavaVersion.JAVA_1_8)).isTrue();
-
- System.setProperty(PROPERTY_NAME, "");
-
- locator.set(new LocatorLauncher.Builder()
- .setMemberName(NAME)
- .setPort(locatorPort)
- .setWorkingDirectory(workingDirectory.getAbsolutePath())
- .set(HTTP_SERVICE_PORT, "0")
- .set(JMX_MANAGER, "true")
- .set(JMX_MANAGER_PORT, String.valueOf(jmxPort))
- .set(JMX_MANAGER_START, "true")
- .set(LOG_FILE, new File(workingDirectory, NAME + ".log").getAbsolutePath())
- .build())
- .get()
- .start();
-
- String serialFilter = System.getProperty(PROPERTY_NAME);
- assertThat(serialFilter).isEqualTo("");
- }
-
- @Test
- public void startingLocatorWithJmxManager_skipsNonEmptySerialFilter_atMostJava8() {
- assumeThat(isJavaVersionAtMost(JavaVersion.JAVA_1_8)).isTrue();
-
- String existingSerialFilter = "!*";
- System.setProperty(PROPERTY_NAME, existingSerialFilter);
-
- locator.set(new LocatorLauncher.Builder()
- .setMemberName(NAME)
- .setPort(locatorPort)
- .setWorkingDirectory(workingDirectory.getAbsolutePath())
- .set(HTTP_SERVICE_PORT, "0")
- .set(JMX_MANAGER, "true")
- .set(JMX_MANAGER_PORT, String.valueOf(jmxPort))
- .set(JMX_MANAGER_START, "true")
- .set(LOG_FILE, new File(workingDirectory, NAME + ".log").getAbsolutePath())
- .build())
- .get()
- .start();
-
- String serialFilter = System.getProperty(PROPERTY_NAME);
- assertThat(serialFilter).isEqualTo(existingSerialFilter);
- }
-}
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/management/internal/ManagementAgentIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/management/internal/ManagementAgentIntegrationTest.java
index 15815a5..257454d9 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/management/internal/ManagementAgentIntegrationTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/management/internal/ManagementAgentIntegrationTest.java
@@ -35,10 +35,10 @@ import org.junit.rules.TemporaryFolder;
import org.apache.geode.distributed.internal.DistributionConfig;
import org.apache.geode.internal.cache.InternalCache;
import org.apache.geode.internal.security.SecurityService;
+import org.apache.geode.internal.serialization.filter.FilterConfiguration;
public class ManagementAgentIntegrationTest {
- // private ManagementAgent managementAgent = spy(ManagementAgent.class);
@Rule
public TemporaryFolder temporaryFolder = new TemporaryFolder();
@@ -46,14 +46,14 @@ public class ManagementAgentIntegrationTest {
public void testSetMBeanServer() throws IOException {
DistributionConfig distributionConfig = mock(DistributionConfig.class);
InternalCache internalCache = mock(InternalCache.class);
- JmxRmiSerialFilter serialFilter = mock(JmxRmiSerialFilter.class);
+ FilterConfiguration filterConfiguration = mock(FilterConfiguration.class);
SecurityService securityService = mock(SecurityService.class);
when(internalCache.getSecurityService()).thenReturn(securityService);
when(securityService.isIntegratedSecurity()).thenReturn(false);
File tempFile = temporaryFolder.newFile("testFile");
when(distributionConfig.getJmxManagerAccessFile()).thenReturn(tempFile.getCanonicalPath());
ManagementAgent managementAgent =
- new ManagementAgent(distributionConfig, internalCache, serialFilter);
+ new ManagementAgent(distributionConfig, internalCache, filterConfiguration);
MBeanServer mBeanServer = mock(MBeanServer.class);
JMXConnectorServer jmxConnectorServerWithMBeanServer = new JMXConnectorServer(mBeanServer) {
@Override
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/management/internal/ServerManagerConfiguresJmxSerialFilterIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/management/internal/ServerManagerConfiguresJmxSerialFilterIntegrationTest.java
deleted file mode 100644
index f77438e..0000000
--- a/geode-core/src/integrationTest/java/org/apache/geode/management/internal/ServerManagerConfiguresJmxSerialFilterIntegrationTest.java
+++ /dev/null
@@ -1,201 +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.geode.management.internal;
-
-import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast;
-import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtMost;
-import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_PORT;
-import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER;
-import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_PORT;
-import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_START;
-import static org.apache.geode.distributed.ConfigurationProperties.LOG_FILE;
-import static org.apache.geode.internal.AvailablePortHelper.getRandomAvailableTCPPort;
-import static org.apache.geode.management.internal.JmxRmiOpenTypesSerialFilter.PROPERTY_NAME;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assumptions.assumeThat;
-
-import java.io.File;
-
-import org.apache.commons.lang3.JavaVersion;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-
-import org.apache.geode.distributed.ServerLauncher;
-import org.apache.geode.test.junit.rules.CloseableReference;
-
-public class ServerManagerConfiguresJmxSerialFilterIntegrationTest {
-
- private static final String NAME = "server";
-
- private File workingDirectory;
- private int jmxPort;
- private String expectedSerialFilter;
-
- @Rule
- public CloseableReference<ServerLauncher> server = new CloseableReference<>();
- @Rule
- public TemporaryFolder temporaryFolder = new TemporaryFolder();
-
- @Before
- public void setUp() throws Exception {
- workingDirectory = temporaryFolder.newFolder(NAME);
- jmxPort = getRandomAvailableTCPPort();
- expectedSerialFilter = new JmxRmiOpenTypesSerialFilter().createSerialFilterPattern();
- }
-
- @After
- public void tearDown() {
- System.clearProperty(PROPERTY_NAME);
- }
-
- @Test
- public void startingServerWithJmxManager_configuresSerialFilter_atLeastJava9() {
- assumeThat(isJavaVersionAtLeast(JavaVersion.JAVA_9)).isTrue();
-
- server.set(new ServerLauncher.Builder()
- .setMemberName(NAME)
- .setDisableDefaultServer(true)
- .setWorkingDirectory(workingDirectory.getAbsolutePath())
- .set(HTTP_SERVICE_PORT, "0")
- .set(JMX_MANAGER, "true")
- .set(JMX_MANAGER_PORT, String.valueOf(jmxPort))
- .set(JMX_MANAGER_START, "true")
- .set(LOG_FILE, new File(workingDirectory, NAME + ".log").getAbsolutePath())
- .build())
- .get()
- .start();
-
- String serialFilter = System.getProperty(PROPERTY_NAME);
- assertThat(serialFilter).isEqualTo(expectedSerialFilter);
- }
-
- @Test
- public void startingServerWithJmxManager_changesEmptySerialFilter_atLeastJava9() {
- assumeThat(isJavaVersionAtLeast(JavaVersion.JAVA_9)).isTrue();
-
- System.setProperty(PROPERTY_NAME, "");
-
- server.set(new ServerLauncher.Builder()
- .setMemberName(NAME)
- .setDisableDefaultServer(true)
- .setWorkingDirectory(workingDirectory.getAbsolutePath())
- .set(HTTP_SERVICE_PORT, "0")
- .set(JMX_MANAGER, "true")
- .set(JMX_MANAGER_PORT, String.valueOf(jmxPort))
- .set(JMX_MANAGER_START, "true")
- .set(LOG_FILE, new File(workingDirectory, NAME + ".log").getAbsolutePath())
- .build())
- .get()
- .start();
-
- String serialFilter = System.getProperty(PROPERTY_NAME);
- assertThat(serialFilter).isEqualTo(expectedSerialFilter);
- }
-
- @Test
- public void startingServerWithJmxManager_skipsNonEmptySerialFilter_atLeastJava9() {
- assumeThat(isJavaVersionAtLeast(JavaVersion.JAVA_9)).isTrue();
-
- String existingSerialFilter = "!*";
- System.setProperty(PROPERTY_NAME, existingSerialFilter);
-
- server.set(new ServerLauncher.Builder()
- .setMemberName(NAME)
- .setDisableDefaultServer(true)
- .setWorkingDirectory(workingDirectory.getAbsolutePath())
- .set(HTTP_SERVICE_PORT, "0")
- .set(JMX_MANAGER, "true")
- .set(JMX_MANAGER_PORT, String.valueOf(jmxPort))
- .set(JMX_MANAGER_START, "true")
- .set(LOG_FILE, new File(workingDirectory, NAME + ".log").getAbsolutePath())
- .build())
- .get()
- .start();
-
- String serialFilter = System.getProperty(PROPERTY_NAME);
- assertThat(serialFilter).isEqualTo(existingSerialFilter);
- }
-
- @Test
- public void startingServerWithJmxManager_skipsSerialFilter_atMostJava8() {
- assumeThat(isJavaVersionAtMost(JavaVersion.JAVA_1_8)).isTrue();
-
- server.set(new ServerLauncher.Builder()
- .setMemberName(NAME)
- .setDisableDefaultServer(true)
- .setWorkingDirectory(workingDirectory.getAbsolutePath())
- .set(HTTP_SERVICE_PORT, "0")
- .set(JMX_MANAGER, "true")
- .set(JMX_MANAGER_PORT, String.valueOf(jmxPort))
- .set(JMX_MANAGER_START, "true")
- .set(LOG_FILE, new File(workingDirectory, NAME + ".log").getAbsolutePath())
- .build())
- .get()
- .start();
-
- String serialFilter = System.getProperty(PROPERTY_NAME);
- assertThat(serialFilter).isNull();
- }
-
- @Test
- public void startingServerWithJmxManager_skipsEmptySerialFilter_atMostJava8() {
- assumeThat(isJavaVersionAtMost(JavaVersion.JAVA_1_8)).isTrue();
-
- System.setProperty(PROPERTY_NAME, "");
-
- server.set(new ServerLauncher.Builder()
- .setMemberName(NAME)
- .setDisableDefaultServer(true)
- .setWorkingDirectory(workingDirectory.getAbsolutePath())
- .set(HTTP_SERVICE_PORT, "0")
- .set(JMX_MANAGER, "true")
- .set(JMX_MANAGER_PORT, String.valueOf(jmxPort))
- .set(JMX_MANAGER_START, "true")
- .set(LOG_FILE, new File(workingDirectory, NAME + ".log").getAbsolutePath())
- .build())
- .get()
- .start();
-
- String serialFilter = System.getProperty(PROPERTY_NAME);
- assertThat(serialFilter).isEqualTo("");
- }
-
- @Test
- public void startingServerWithJmxManager_skipsNonEmptySerialFilter_atMostJava8() {
- assumeThat(isJavaVersionAtMost(JavaVersion.JAVA_1_8)).isTrue();
-
- String existingSerialFilter = "!*";
- System.setProperty(PROPERTY_NAME, existingSerialFilter);
-
- server.set(new ServerLauncher.Builder()
- .setMemberName(NAME)
- .setDisableDefaultServer(true)
- .setWorkingDirectory(workingDirectory.getAbsolutePath())
- .set(HTTP_SERVICE_PORT, "0")
- .set(JMX_MANAGER, "true")
- .set(JMX_MANAGER_PORT, String.valueOf(jmxPort))
- .set(JMX_MANAGER_START, "true")
- .set(LOG_FILE, new File(workingDirectory, NAME + ".log").getAbsolutePath())
- .build())
- .get()
- .start();
-
- String serialFilter = System.getProperty(PROPERTY_NAME);
- assertThat(serialFilter).isEqualTo(existingSerialFilter);
- }
-}
diff --git a/geode-core/src/main/java/org/apache/geode/distributed/LocatorLauncher.java b/geode-core/src/main/java/org/apache/geode/distributed/LocatorLauncher.java
index f5860c9..fc60f83 100644
--- a/geode-core/src/main/java/org/apache/geode/distributed/LocatorLauncher.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/LocatorLauncher.java
@@ -62,6 +62,7 @@ import org.apache.geode.cache.client.internal.locator.LocatorStatusResponse;
import org.apache.geode.distributed.internal.InternalLocator;
import org.apache.geode.distributed.internal.tcpserver.TcpClient;
import org.apache.geode.distributed.internal.tcpserver.TcpSocketCreator;
+import org.apache.geode.internal.DistributedSerializableObjectConfig;
import org.apache.geode.internal.DistributionLocator;
import org.apache.geode.internal.GemFireVersion;
import org.apache.geode.internal.InternalDataSerializer;
@@ -85,6 +86,7 @@ import org.apache.geode.internal.process.ProcessType;
import org.apache.geode.internal.process.ProcessUtils;
import org.apache.geode.internal.process.UnableToControlProcessException;
import org.apache.geode.internal.security.SecurableCommunicationChannel;
+import org.apache.geode.internal.serialization.filter.SystemPropertyGlobalSerialFilterConfigurationFactory;
import org.apache.geode.lang.AttachAPINotFoundException;
import org.apache.geode.logging.internal.log4j.api.LogService;
import org.apache.geode.management.internal.util.HostUtils;
@@ -700,6 +702,11 @@ public class LocatorLauncher extends AbstractLauncher<String> {
if (isStartable()) {
INSTANCE.compareAndSet(null, this);
+ boolean serializationFilterConfigured =
+ new SystemPropertyGlobalSerialFilterConfigurationFactory()
+ .create(new DistributedSerializableObjectConfig(getDistributedSystemProperties()))
+ .configure();
+
try {
this.process =
new FileControllableProcess(this.controlHandler, new File(getWorkingDirectory()),
@@ -714,6 +721,11 @@ public class LocatorLauncher extends AbstractLauncher<String> {
this.locator = InternalLocator.startLocator(getPort(), getLogFile(), null, null,
getBindAddress(), true, getDistributedSystemProperties(), getHostnameForClients(),
Paths.get(workingDirectory));
+
+ if (serializationFilterConfigured) {
+ log.info("Global serial filter is now configured.");
+ }
+
} finally {
ProcessLauncherContext.remove();
}
diff --git a/geode-core/src/main/java/org/apache/geode/distributed/ServerLauncher.java b/geode-core/src/main/java/org/apache/geode/distributed/ServerLauncher.java
index 7ffd134..9492402 100755
--- a/geode-core/src/main/java/org/apache/geode/distributed/ServerLauncher.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/ServerLauncher.java
@@ -71,6 +71,7 @@ import org.apache.geode.cache.partition.PartitionRegionHelper;
import org.apache.geode.cache.server.CacheServer;
import org.apache.geode.distributed.internal.DefaultServerLauncherCacheProvider;
import org.apache.geode.distributed.internal.InternalDistributedSystem;
+import org.apache.geode.internal.DistributedSerializableObjectConfig;
import org.apache.geode.internal.GemFireVersion;
import org.apache.geode.internal.cache.AbstractCacheServer;
import org.apache.geode.internal.cache.CacheConfig;
@@ -94,6 +95,7 @@ import org.apache.geode.internal.process.ProcessControllerParameters;
import org.apache.geode.internal.process.ProcessLauncherContext;
import org.apache.geode.internal.process.ProcessType;
import org.apache.geode.internal.process.UnableToControlProcessException;
+import org.apache.geode.internal.serialization.filter.SystemPropertyGlobalSerialFilterConfigurationFactory;
import org.apache.geode.lang.AttachAPINotFoundException;
import org.apache.geode.logging.internal.executors.LoggingThread;
import org.apache.geode.logging.internal.log4j.api.LogService;
@@ -789,6 +791,11 @@ public class ServerLauncher extends AbstractLauncher<String> {
if (isStartable()) {
INSTANCE.compareAndSet(null, this);
+ boolean serializationFilterConfigured =
+ new SystemPropertyGlobalSerialFilterConfigurationFactory()
+ .create(new DistributedSerializableObjectConfig(getDistributedSystemProperties()))
+ .configure();
+
try {
process = getControllableProcess();
@@ -808,6 +815,10 @@ public class ServerLauncher extends AbstractLauncher<String> {
final Properties gemfireProperties = getDistributedSystemProperties(getProperties());
cache = createCache(gemfireProperties);
+ if (serializationFilterConfigured) {
+ log.info("Global serial filter is now configured.");
+ }
+
// Set the resource manager options
if (criticalHeapPercentage != null) {
cache.getResourceManager().setCriticalHeapPercentage(getCriticalHeapPercentage());
diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionConfig.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionConfig.java
index 0074881..8a585d9 100644
--- a/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionConfig.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionConfig.java
@@ -208,6 +208,7 @@ import org.apache.geode.internal.Config;
import org.apache.geode.internal.ConfigSource;
import org.apache.geode.internal.logging.LogWriterImpl;
import org.apache.geode.internal.security.SecurableCommunicationChannel;
+import org.apache.geode.internal.serialization.filter.SerializableObjectConfig;
import org.apache.geode.internal.statistics.StatisticsConfig;
import org.apache.geode.internal.tcp.Connection;
import org.apache.geode.logging.internal.spi.LogConfig;
@@ -224,7 +225,8 @@ import org.apache.geode.util.internal.GeodeGlossary;
* @see Config
* @since GemFire 2.1
*/
-public interface DistributionConfig extends Config, LogConfig, StatisticsConfig {
+public interface DistributionConfig
+ extends Config, LogConfig, StatisticsConfig, SerializableObjectConfig {
/**
* The static String definition of the prefix used to defined ssl-* properties
diff --git a/geode-core/src/main/java/org/apache/geode/internal/DistributedSerializableObjectConfig.java b/geode-core/src/main/java/org/apache/geode/internal/DistributedSerializableObjectConfig.java
new file mode 100644
index 0000000..1a9aec0
--- /dev/null
+++ b/geode-core/src/main/java/org/apache/geode/internal/DistributedSerializableObjectConfig.java
@@ -0,0 +1,51 @@
+/*
+ * 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.geode.internal;
+
+import static java.util.Objects.requireNonNull;
+import static org.apache.geode.distributed.ConfigurationProperties.SERIALIZABLE_OBJECT_FILTER;
+import static org.apache.geode.distributed.ConfigurationProperties.VALIDATE_SERIALIZABLE_OBJECTS;
+
+import java.util.Properties;
+
+import org.apache.geode.internal.serialization.filter.SerializableObjectConfig;
+
+/**
+ * Simple implementation of {@code SerializableObjectConfig} for use when an instance of
+ * {@code DistributionConfig} is not available.
+ */
+public class DistributedSerializableObjectConfig implements SerializableObjectConfig {
+
+ private final Properties config;
+
+ public DistributedSerializableObjectConfig(Properties config) {
+ this.config = requireNonNull(config);
+ }
+
+ @Override
+ public boolean getValidateSerializableObjects() {
+ return "true".equalsIgnoreCase(config.getProperty(VALIDATE_SERIALIZABLE_OBJECTS));
+ }
+
+ @Override
+ public void setValidateSerializableObjects(boolean value) {
+ config.setProperty(VALIDATE_SERIALIZABLE_OBJECTS, Boolean.valueOf(value).toString());
+ }
+
+ @Override
+ public String getSerializableObjectFilter() {
+ return config.getProperty(SERIALIZABLE_OBJECT_FILTER);
+ }
+}
diff --git a/geode-core/src/main/java/org/apache/geode/internal/InternalDataSerializer.java b/geode-core/src/main/java/org/apache/geode/internal/InternalDataSerializer.java
index 66241ba..056dc09 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/InternalDataSerializer.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/InternalDataSerializer.java
@@ -14,6 +14,7 @@
*/
package org.apache.geode.internal;
+import static org.apache.geode.internal.serialization.filter.SanctionedSerializables.loadSanctionedClassNames;
import static org.apache.geode.internal.serialization.filter.SanctionedSerializables.loadSanctionedSerializablesServices;
import java.io.DataInput;
@@ -73,7 +74,6 @@ import org.apache.geode.CancelException;
import org.apache.geode.CanonicalInstantiator;
import org.apache.geode.DataSerializable;
import org.apache.geode.DataSerializer;
-import org.apache.geode.GemFireConfigException;
import org.apache.geode.GemFireIOException;
import org.apache.geode.GemFireRethrowable;
import org.apache.geode.Instantiator;
@@ -88,7 +88,6 @@ import org.apache.geode.cache.CacheClosedException;
import org.apache.geode.cache.execute.Function;
import org.apache.geode.distributed.internal.ClusterDistributionManager;
import org.apache.geode.distributed.internal.DMStats;
-import org.apache.geode.distributed.internal.DistributionConfig;
import org.apache.geode.distributed.internal.InternalDistributedSystem;
import org.apache.geode.distributed.internal.LonerDistributionManager;
import org.apache.geode.distributed.internal.SerialDistributionMessage;
@@ -103,7 +102,6 @@ import org.apache.geode.internal.cache.tier.sockets.ClientDataSerializerMessage;
import org.apache.geode.internal.cache.tier.sockets.ClientProxyMembershipID;
import org.apache.geode.internal.cache.tier.sockets.OldClientSupportService;
import org.apache.geode.internal.cache.tier.sockets.Part;
-import org.apache.geode.internal.lang.utils.ClassUtils;
import org.apache.geode.internal.logging.log4j.LogMarker;
import org.apache.geode.internal.serialization.BasicSerializable;
import org.apache.geode.internal.serialization.DSCODE;
@@ -119,7 +117,12 @@ import org.apache.geode.internal.serialization.SerializationVersions;
import org.apache.geode.internal.serialization.StaticSerialization;
import org.apache.geode.internal.serialization.Version;
import org.apache.geode.internal.serialization.VersionedDataStream;
+import org.apache.geode.internal.serialization.filter.NullObjectInputFilter;
+import org.apache.geode.internal.serialization.filter.ObjectInputFilter;
+import org.apache.geode.internal.serialization.filter.ObjectInputFilterFactory;
+import org.apache.geode.internal.serialization.filter.ReflectiveFacadeObjectInputFilterFactory;
import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
+import org.apache.geode.internal.serialization.filter.SerializableObjectConfig;
import org.apache.geode.internal.util.concurrent.CopyOnWriteHashMap;
import org.apache.geode.logging.internal.log4j.api.LogService;
import org.apache.geode.pdx.NonPortableClassException;
@@ -283,12 +286,12 @@ public abstract class InternalDataSerializer extends DataSerializer {
"org.apache.geode.cache.query.internal.cq.ServerCQImpl";
@Immutable
- private static final InputStreamFilter defaultSerializationFilter = new EmptyInputStreamFilter();
+ private static final ObjectInputFilter defaultSerializationFilter = new NullObjectInputFilter();
/**
* A deserialization filter for ObjectInputStreams
*/
@MakeNotStatic
- private static InputStreamFilter serializationFilter = defaultSerializationFilter;
+ private static ObjectInputFilter serializationFilter = defaultSerializationFilter;
/**
* support for old GemFire clients and WAN sites - needed to enable moving from GemFire to Geode
*/
@@ -397,35 +400,29 @@ public abstract class InternalDataSerializer extends DataSerializer {
* Initializes the optional serialization "accept list" if the user has requested it in the
* DistributionConfig
*
- * @param distributionConfig the DistributedSystem configuration
+ * @param config the DistributedSystem configuration
*/
- public static void initializeSerializationFilter(DistributionConfig distributionConfig) {
- initializeSerializationFilter(distributionConfig, loadSanctionedSerializablesServices());
+ public static void initializeSerializationFilter(SerializableObjectConfig config) {
+ initializeSerializationFilter(config, loadSanctionedSerializablesServices());
}
/**
* Initializes the optional serialization "accept list" if the user has requested it in the
* DistributionConfig
*
- * @param distributionConfig the DistributedSystem configuration
+ * @param config the DistributedSystem configuration
* @param services SanctionedSerializablesService that might have classes to acceptlist
*/
@VisibleForTesting
- public static void initializeSerializationFilter(DistributionConfig distributionConfig,
+ public static void initializeSerializationFilter(SerializableObjectConfig config,
Collection<SanctionedSerializablesService> services) {
logger.info("initializing InternalDataSerializer with {} services", services.size());
- if (distributionConfig.getValidateSerializableObjects()) {
- if (!ClassUtils.isClassAvailable("sun.misc.ObjectInputFilter")
- && !ClassUtils.isClassAvailable("java.io.ObjectInputFilter")) {
- throw new GemFireConfigException(
- "A serialization filter has been specified but this version of Java does not support serialization filters - ObjectInputFilter is not available");
- }
- serializationFilter =
- new ObjectInputStreamFilterWrapper(SANCTIONED_SERIALIZABLES_DEPENDENCIES_PATTERN
- + distributionConfig.getSerializableObjectFilter() + ";!*", services);
- } else {
- clearSerializationFilter();
- }
+
+ ObjectInputFilterFactory objectInputFilterFactory =
+ new ReflectiveFacadeObjectInputFilterFactory();
+
+ serializationFilter =
+ objectInputFilterFactory.create(config, loadSanctionedClassNames(services));
}
@VisibleForTesting
diff --git a/geode-core/src/main/java/org/apache/geode/internal/ObjectInputStreamFilterWrapper.java b/geode-core/src/main/java/org/apache/geode/internal/ObjectInputStreamFilterWrapper.java
deleted file mode 100644
index 25d5e35..0000000
--- a/geode-core/src/main/java/org/apache/geode/internal/ObjectInputStreamFilterWrapper.java
+++ /dev/null
@@ -1,233 +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.geode.internal;
-
-import java.io.IOException;
-import java.io.InvalidClassException;
-import java.io.ObjectInputStream;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.apache.logging.log4j.Logger;
-
-import org.apache.geode.GemFireConfigException;
-import org.apache.geode.InternalGemFireError;
-import org.apache.geode.InternalGemFireException;
-import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
-import org.apache.geode.logging.internal.log4j.api.LogService;
-
-
-/**
- * ObjectInputStreamFilterWrapper isolates InternalDataSerializer from the JDK's
- * ObjectInputFilter class, which is absent in builds of java8 prior to 121 and
- * is sun.misc.ObjectInputFilter in later builds but is java.io.ObjectInputFilter
- * in java9.
- * <p>
- * This class uses reflection and dynamic proxies to find the class and create a
- * serialization filter. Once java8 is retired and no longer supported by Geode the
- * use of reflection should be removed ObjectInputFilter can be directly used by
- * InternalDataSerializer.
- */
-public class ObjectInputStreamFilterWrapper implements InputStreamFilter {
- private static final Logger logger = LogService.getLogger();
-
- private boolean usingJava8;
- private Object serializationFilter;
-
- private Class configClass; // ObjectInputFilter$Config
- private Method setObjectInputFilterMethod; // method on ObjectInputFilter$Config or
- // ObjectInputStream
- private Method createFilterMethod; // method on ObjectInputFilter$Config
-
- private Class filterClass; // ObjectInputFilter
- private Object ALLOWED; // field on ObjectInputFilter
- private Object REJECTED; // field on ObjectInputFilter
- private Method checkInputMethod; // method on ObjectInputFilter
-
- private Class filterInfoClass; // ObjectInputFilter$FilterInfo
- private Method serialClassMethod; // method on ObjectInputFilter$FilterInfo
-
- public ObjectInputStreamFilterWrapper(String serializationFilterSpec,
- Collection<SanctionedSerializablesService> services) {
-
- Set<String> sanctionedClasses = new HashSet<>(500);
- for (SanctionedSerializablesService service : services) {
- try {
- Collection<String> classNames = service.getSerializationAcceptlist();
- logger.info("loaded {} sanctioned serializables from {}", classNames.size(),
- service.getClass().getSimpleName());
- sanctionedClasses.addAll(classNames);
- } catch (IOException e) {
- throw new InternalGemFireException("error initializing serialization filter for " + service,
- e);
- }
- }
-
- logger.info("setting a serialization filter containing {}", serializationFilterSpec);
-
- // try java8 - this will not throw an exception if ObjectInputFilter can't be found
- if (createJava8Filter(serializationFilterSpec, sanctionedClasses)) {
- return;
- }
-
- // try java9 - this throws an exception if it fails to create the filter
- createJava9Filter(serializationFilterSpec, sanctionedClasses);
- }
-
- @Override
- public void setFilterOn(ObjectInputStream objectInputStream) {
- try {
- if (usingJava8) {
- setObjectInputFilterMethod.invoke(configClass, objectInputStream, serializationFilter);
- } else {
- setObjectInputFilterMethod.invoke(objectInputStream, serializationFilter);
- }
- } catch (IllegalAccessException | InvocationTargetException e) {
- throw new InternalGemFireError("Unable to filter serialization", e);
- }
- }
-
- /**
- * java8 has sun.misc.ObjectInputFilter and uses ObjectInputFilter$Config.setObjectInputFilter()
- */
- private boolean createJava8Filter(String serializationFilterSpec,
- Collection<String> sanctionedClasses) {
- ClassPathLoader classPathLoader = ClassPathLoader.getLatest();
- try {
-
- filterInfoClass = classPathLoader.forName("sun.misc.ObjectInputFilter$FilterInfo");
- serialClassMethod = filterInfoClass.getDeclaredMethod("serialClass");
-
- filterClass = classPathLoader.forName("sun.misc.ObjectInputFilter");
- checkInputMethod = filterClass.getDeclaredMethod("checkInput", filterInfoClass);
-
- Class statusClass = classPathLoader.forName("sun.misc.ObjectInputFilter$Status");
- ALLOWED = statusClass.getEnumConstants()[1];
- REJECTED = statusClass.getEnumConstants()[2];
- if (!ALLOWED.toString().equals("ALLOWED") || !REJECTED.toString().equals("REJECTED")) {
- throw new GemFireConfigException(
- "ObjectInputFilter$Status enumeration in this JDK is not as expected");
- }
-
- configClass = classPathLoader.forName("sun.misc.ObjectInputFilter$Config");
- setObjectInputFilterMethod = configClass.getDeclaredMethod("setObjectInputFilter",
- ObjectInputStream.class, filterClass);
- createFilterMethod = configClass.getDeclaredMethod("createFilter", String.class);
-
- serializationFilter = createSerializationFilter(serializationFilterSpec, sanctionedClasses);
- usingJava8 = true;
-
- } catch (ClassNotFoundException | InvocationTargetException | IllegalAccessException
- | NoSuchMethodException e) {
- if (filterInfoClass != null) {
- throw new GemFireConfigException(
- "A serialization filter has been specified but Geode was unable to configure a filter",
- e);
- }
- return false;
- }
-
- return true;
- }
-
- /** java9 has java.io.ObjectInputFilter and uses ObjectInputStream.setObjectInputFilter() */
- private void createJava9Filter(String serializationFilterSpec,
- Collection<String> sanctionedClasses) {
- try {
- ClassPathLoader classPathLoader = ClassPathLoader.getLatest();
-
- filterInfoClass = classPathLoader.forName("java.io.ObjectInputFilter$FilterInfo");
- serialClassMethod = filterInfoClass.getDeclaredMethod("serialClass");
-
-
- filterClass = classPathLoader.forName("java.io.ObjectInputFilter");
- checkInputMethod = filterClass.getDeclaredMethod("checkInput", filterInfoClass);
-
- Class statusClass = classPathLoader.forName("java.io.ObjectInputFilter$Status");
- ALLOWED = statusClass.getEnumConstants()[1];
- REJECTED = statusClass.getEnumConstants()[2];
- if (!ALLOWED.toString().equals("ALLOWED") || !REJECTED.toString().equals("REJECTED")) {
- throw new GemFireConfigException(
- "ObjectInputFilter$Status enumeration in this JDK is not as expected");
- }
-
- configClass = classPathLoader.forName("java.io.ObjectInputFilter$Config");
- setObjectInputFilterMethod =
- ObjectInputStream.class.getDeclaredMethod("setObjectInputFilter", filterClass);
- createFilterMethod = configClass.getDeclaredMethod("createFilter", String.class);
-
- serializationFilter = createSerializationFilter(serializationFilterSpec, sanctionedClasses);
-
- } catch (ClassNotFoundException | InvocationTargetException | IllegalAccessException
- | NoSuchMethodException e) {
- throw new GemFireConfigException(
- "A serialization filter has been specified but Geode was unable to configure a filter",
- e);
- }
- }
-
-
- private Object createSerializationFilter(String serializationFilterSpec,
- Collection<String> sanctionedClasses)
- throws InvocationTargetException, IllegalAccessException {
-
- /*
- * create a user filter with the serialization acceptlist/denylist. This will be wrapped
- * by a filter that accept-lists sanctioned classes
- */
- Object userFilter = createFilterMethod.invoke(null, serializationFilterSpec);
-
- InvocationHandler handler = (proxy, method, args) -> {
- switch (method.getName()) {
- case "checkInput":
- Object filterInfo = args[0];
- Class<?> serialClass = (Class<?>) serialClassMethod.invoke(filterInfo);
- if (serialClass == null) { // no class to check, so nothing to accept-list
- return checkInputMethod.invoke(userFilter, filterInfo);
- }
- String className = serialClass.getName();
- if (serialClass.isArray()) {
- className = serialClass.getComponentType().getName();
- }
- if (sanctionedClasses.contains(className)) {
- return ALLOWED;
- }
- Object status = checkInputMethod.invoke(userFilter, filterInfo);
- if (status == REJECTED) {
- logger.fatal("Serialization filter is rejecting class {}", className,
- new InvalidClassException(className));
- }
- return status;
- case "toString":
- return userFilter.toString();
- default:
- throw new UnsupportedOperationException(
- "ObjectInputFilter." + method.getName() + " is not implemented");
- }
- };
-
- ClassPathLoader classPathLoader = ClassPathLoader.getLatest();
- return Proxy.newProxyInstance(classPathLoader.asClassLoader(), new Class[] {filterClass},
- handler);
-
- }
-
-
-}
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/JmxRmiOpenTypesSerialFilter.java b/geode-core/src/main/java/org/apache/geode/management/internal/JmxRmiOpenTypesSerialFilter.java
deleted file mode 100644
index 803bc03..0000000
--- a/geode-core/src/main/java/org/apache/geode/management/internal/JmxRmiOpenTypesSerialFilter.java
+++ /dev/null
@@ -1,148 +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.geode.management.internal;
-
-import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.rmi.MarshalledObject;
-import java.util.function.Consumer;
-import java.util.function.Supplier;
-
-import javax.management.ObjectName;
-import javax.management.openmbean.ArrayType;
-import javax.management.openmbean.CompositeData;
-import javax.management.openmbean.CompositeType;
-import javax.management.openmbean.OpenType;
-import javax.management.openmbean.SimpleType;
-import javax.management.openmbean.TabularData;
-import javax.management.openmbean.TabularType;
-
-import org.apache.commons.lang3.JavaVersion;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.logging.log4j.Logger;
-
-import org.apache.geode.annotations.VisibleForTesting;
-import org.apache.geode.logging.internal.log4j.api.LogService;
-
-/**
- * Configure the “jmx.remote.rmi.server.serial.filter.pattern” system property if Java version is
- * greater than Java 8. The serial pattern will be configured to accept only standard JMX
- * open-types. If the system property already has a non-null value, then leave it as is.
- */
-public class JmxRmiOpenTypesSerialFilter implements JmxRmiSerialFilter {
-
- private static final Logger logger = LogService.getLogger();
-
- @VisibleForTesting
- public static final String PROPERTY_NAME = "jmx.remote.rmi.server.serial.filter.pattern";
-
- private final Consumer<String> infoLogger;
- private final Supplier<Boolean> supportsSerialFilter;
-
- JmxRmiOpenTypesSerialFilter() {
- this(logger::info, () -> isJavaVersionAtLeast(JavaVersion.JAVA_9));
- }
-
- @VisibleForTesting
- JmxRmiOpenTypesSerialFilter(Consumer<String> infoLogger, Supplier<Boolean> supportsSerialFilter) {
- this.infoLogger = infoLogger;
- this.supportsSerialFilter = supportsSerialFilter;
- }
-
- @Override
- public void configureSerialFilter() {
- if (supportsDedicatedSerialFilter()) {
- setPropertyValueUnlessExists(createSerialFilterPattern());
- }
- }
-
- @VisibleForTesting
- boolean supportsDedicatedSerialFilter() {
- return supportsSerialFilter.get();
- }
-
- /**
- * Sets the value of the system property {@code jmx.remote.rmi.server.serial.filter.pattern}
- * unless it exists with a value that is not null or empty ("").
- */
- @VisibleForTesting
- void setPropertyValueUnlessExists(String value) {
- String existingValue = System.getProperty(PROPERTY_NAME);
- if (StringUtils.isNotEmpty(existingValue)) {
- infoLogger.accept("System property " + PROPERTY_NAME + " is already configured.");
- return;
- }
-
- System.setProperty(PROPERTY_NAME, value);
- infoLogger.accept("System property " + PROPERTY_NAME + " is now configured with '"
- + value + "'.");
- }
-
- /**
- * Returns a serial filter pattern that accepts all open MBean data types and rejects everything
- * not included in the pattern.
- */
- @VisibleForTesting
- String createSerialFilterPattern() {
- // note: java.util.* may also be needed
- return new StringBuilder()
- // accept all open MBean data types
- .append(Boolean.class.getName())
- .append(';')
- .append(Byte.class.getName())
- .append(';')
- .append(Character.class.getName())
- .append(';')
- .append(Short.class.getName())
- .append(';')
- .append(Integer.class.getName())
- .append(';')
- .append(Long.class.getName())
- .append(';')
- .append(Float.class.getName())
- .append(';')
- .append(Double.class.getName())
- .append(';')
- .append(String.class.getName())
- .append(';')
- .append(BigInteger.class.getName())
- .append(';')
- .append(BigDecimal.class.getName())
- .append(';')
- .append(ObjectName.class.getName())
- .append(';')
- .append(OpenType.class.getName())
- .append(';')
- .append(CompositeData.class.getName())
- .append(';')
- .append(TabularData.class.getName())
- .append(';')
- .append(SimpleType.class.getName())
- .append(';')
- .append(CompositeType.class.getName())
- .append(';')
- .append(TabularType.class.getName())
- .append(';')
- .append(ArrayType.class.getName())
- .append(';')
- .append(MarshalledObject.class.getName())
- .append(';')
- // reject all other classes
- .append("!*")
- .toString();
- }
-}
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/ManagementAgent.java b/geode-core/src/main/java/org/apache/geode/management/internal/ManagementAgent.java
index 9c36e49..8f94b86 100755
--- a/geode-core/src/main/java/org/apache/geode/management/internal/ManagementAgent.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/ManagementAgent.java
@@ -64,6 +64,7 @@ import org.apache.geode.internal.net.SocketCreatorFactory;
import org.apache.geode.internal.security.SecurableCommunicationChannel;
import org.apache.geode.internal.security.SecurityService;
import org.apache.geode.internal.security.shiro.JMXShiroAuthenticator;
+import org.apache.geode.internal.serialization.filter.FilterConfiguration;
import org.apache.geode.internal.tcp.TCPConduit;
import org.apache.geode.logging.internal.log4j.api.LogService;
import org.apache.geode.management.ManagementException;
@@ -106,7 +107,7 @@ public class ManagementAgent {
private int port;
private RemoteStreamExporter remoteStreamExporter = null;
- private final JmxRmiSerialFilter serialFilter;
+ private final FilterConfiguration filterConfiguration;
/**
* This system property is set to true when the embedded HTTP server is started so that the
@@ -119,20 +120,19 @@ public class ManagementAgent {
private static final String PULSE_USESSL_LOCATOR = "pulse.useSSL.locator";
public ManagementAgent(DistributionConfig config, InternalCache cache,
- JmxRmiSerialFilter serialFilter) {
+ FilterConfiguration filterConfiguration) {
this.config = config;
this.cache = cache;
this.securityService = cache.getSecurityService();
- this.serialFilter = serialFilter;
+ this.filterConfiguration = filterConfiguration;
}
public synchronized boolean isRunning() {
return this.running;
}
-
public synchronized void startAgent() {
- serialFilter.configureSerialFilter();
+ filterConfiguration.configure();
loadWebApplications();
if (!this.running && this.config.getJmxManagerPort() != 0) {
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/ManagementAgentFactory.java b/geode-core/src/main/java/org/apache/geode/management/internal/ManagementAgentFactory.java
index bff205e..31c3652 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/ManagementAgentFactory.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/ManagementAgentFactory.java
@@ -16,10 +16,11 @@ package org.apache.geode.management.internal;
import org.apache.geode.distributed.internal.DistributionConfig;
import org.apache.geode.internal.cache.InternalCache;
+import org.apache.geode.internal.serialization.filter.FilterConfiguration;
@FunctionalInterface
interface ManagementAgentFactory {
ManagementAgent create(DistributionConfig config, InternalCache cache,
- JmxRmiSerialFilter serialFilter);
+ FilterConfiguration filterConfiguration);
}
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/SystemManagementService.java b/geode-core/src/main/java/org/apache/geode/management/internal/SystemManagementService.java
index a5bf2f4..2479b8f 100755
--- a/geode-core/src/main/java/org/apache/geode/management/internal/SystemManagementService.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/SystemManagementService.java
@@ -45,6 +45,8 @@ import org.apache.geode.distributed.internal.ResourceEvent;
import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
import org.apache.geode.internal.cache.InternalCache;
import org.apache.geode.internal.cache.InternalCacheForClientAccess;
+import org.apache.geode.internal.serialization.filter.FilterConfiguration;
+import org.apache.geode.internal.serialization.filter.SystemPropertyJmxSerialFilterConfigurationFactory;
import org.apache.geode.internal.statistics.StatisticsClock;
import org.apache.geode.logging.internal.executors.LoggingExecutors;
import org.apache.geode.logging.internal.log4j.api.LogService;
@@ -178,9 +180,12 @@ public class SystemManagementService extends BaseManagementService {
repo = new ManagementResourceRepo();
notificationHub = notificationHubFactory.apply(repo);
+
if (system.getConfig().getJmxManager()) {
- agent = managementAgentFactory.create(system.getConfig(), cache,
- new JmxRmiOpenTypesSerialFilter());
+ FilterConfiguration filterConfiguration =
+ new SystemPropertyJmxSerialFilterConfigurationFactory().create();
+
+ agent = managementAgentFactory.create(system.getConfig(), cache, filterConfiguration);
} else {
agent = null;
}
diff --git a/geode-core/src/test/java/org/apache/geode/distributed/internal/DistributionConfigJUnitTest.java b/geode-core/src/test/java/org/apache/geode/distributed/internal/DistributionConfigJUnitTest.java
index 64d0022..e6d4db9 100644
--- a/geode-core/src/test/java/org/apache/geode/distributed/internal/DistributionConfigJUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/distributed/internal/DistributionConfigJUnitTest.java
@@ -62,6 +62,7 @@ import org.junit.experimental.categories.Category;
import org.apache.geode.UnmodifiableException;
import org.apache.geode.internal.ConfigSource;
+import org.apache.geode.internal.serialization.filter.SerializableObjectConfig;
import org.apache.geode.security.TestPostProcessor;
import org.apache.geode.security.TestSecurityManager;
import org.apache.geode.test.junit.categories.MembershipTest;
@@ -468,4 +469,11 @@ public class DistributionConfigJUnitTest {
DistributionConfig config = new DistributionConfigImpl(props);
assertThat(config.getSecurityAuthTokenEnabledComponents()).containsExactly("MANAGEMENT");
}
+
+ @Test
+ public void isASerializableObjectConfig() {
+ DistributionConfig config = new DistributionConfigImpl(new Properties());
+
+ assertThat(config).isInstanceOf(SerializableObjectConfig.class);
+ }
}
diff --git a/geode-core/src/test/java/org/apache/geode/internal/DistributedSerializableObjectConfigTest.java b/geode-core/src/test/java/org/apache/geode/internal/DistributedSerializableObjectConfigTest.java
new file mode 100644
index 0000000..d528904
--- /dev/null
+++ b/geode-core/src/test/java/org/apache/geode/internal/DistributedSerializableObjectConfigTest.java
@@ -0,0 +1,62 @@
+/*
+ * 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.geode.internal;
+
+import static org.apache.geode.distributed.ConfigurationProperties.SERIALIZABLE_OBJECT_FILTER;
+import static org.apache.geode.distributed.ConfigurationProperties.VALIDATE_SERIALIZABLE_OBJECTS;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import java.util.Properties;
+
+import org.junit.Test;
+
+import org.apache.geode.internal.serialization.filter.SerializableObjectConfig;
+
+public class DistributedSerializableObjectConfigTest {
+
+ @Test
+ public void getValidateSerializableObjects_returnsTrue_whenPropertyIsTrue() {
+ Properties properties = spy(new Properties());
+ SerializableObjectConfig config = new DistributedSerializableObjectConfig(properties);
+ when(properties.getProperty(VALIDATE_SERIALIZABLE_OBJECTS)).thenReturn("true");
+
+ boolean result = config.getValidateSerializableObjects();
+
+ assertThat(result).isTrue();
+ }
+
+ @Test
+ public void setValidateSerializableObjects_setsPropertyValue() {
+ Properties properties = spy(new Properties());
+ SerializableObjectConfig config = new DistributedSerializableObjectConfig(properties);
+
+ config.setValidateSerializableObjects(true);
+
+ assertThat(properties.getProperty(VALIDATE_SERIALIZABLE_OBJECTS)).isEqualTo("true");
+ }
+
+ @Test
+ public void getSerializableObjectFilter_returnsPropertyValue() {
+ Properties properties = spy(new Properties());
+ SerializableObjectConfig config = new DistributedSerializableObjectConfig(properties);
+ when(properties.getProperty(SERIALIZABLE_OBJECT_FILTER)).thenReturn("!*");
+
+ String result = config.getSerializableObjectFilter();
+
+ assertThat(result).isEqualTo("!*");
+ }
+}
diff --git a/geode-core/src/test/java/org/apache/geode/internal/InternalDataSerializerSerializationAcceptlistTest.java b/geode-core/src/test/java/org/apache/geode/internal/InternalDataSerializerSerializationAcceptlistTest.java
index 6242203..2c03f6b 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/InternalDataSerializerSerializationAcceptlistTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/InternalDataSerializerSerializationAcceptlistTest.java
@@ -17,27 +17,29 @@ package org.apache.geode.internal;
import static java.util.Collections.emptySet;
import static org.apache.geode.distributed.internal.DistributionConfig.SERIALIZABLE_OBJECT_FILTER_NAME;
import static org.apache.geode.distributed.internal.DistributionConfig.VALIDATE_SERIALIZABLE_OBJECTS_NAME;
-import static org.apache.geode.internal.lang.utils.ClassUtils.isClassAvailable;
+import static org.apache.geode.internal.InternalDataSerializer.initializeSerializationFilter;
+import static org.apache.geode.internal.serialization.filter.ObjectInputFilterUtils.supportsObjectInputFilter;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.catchThrowable;
-import static org.junit.Assume.assumeTrue;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.io.InvalidClassException;
import java.io.Serializable;
import java.util.Properties;
import org.junit.After;
import org.junit.Before;
+import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.apache.geode.DataSerializer;
-import org.apache.geode.distributed.internal.DistributionConfig;
import org.apache.geode.distributed.internal.DistributionConfigImpl;
import org.apache.geode.internal.serialization.Version;
+import org.apache.geode.internal.serialization.filter.SerializableObjectConfig;
import org.apache.geode.test.junit.categories.SerializationTest;
@Category(SerializationTest.class)
@@ -47,20 +49,20 @@ public class InternalDataSerializerSerializationAcceptlistTest {
private Object testSerializable;
private Properties properties;
+ @BeforeClass
+ public static void hasObjectInputFilter() {
+ assertThat(supportsObjectInputFilter())
+ .as("java.io.ObjectInputFilter or sun.misc.ObjectInputFilter is available")
+ .isTrue();
+ }
+
@Before
public void setUp() {
- assumeTrue("ObjectInputFilter is present in this JVM (post- 8.111)",
- hasObjectInputFilter());
outputStream = new HeapDataOutputStream(Version.CURRENT);
testSerializable = new TestSerializable();
properties = new Properties();
}
- private boolean hasObjectInputFilter() {
- return isClassAvailable("sun.misc.ObjectInputFilter")
- || isClassAvailable("java.io.ObjectInputFilter");
- }
-
@After
public void clearSerializationFilter() {
InternalDataSerializer.clearSerializationFilter();
@@ -68,23 +70,37 @@ public class InternalDataSerializerSerializationAcceptlistTest {
@Test
public void distributionConfigDefaults() {
- DistributionConfig distributionConfig = new DistributionConfigImpl(new Properties());
+ SerializableObjectConfig config = new DistributionConfigImpl(new Properties());
- assertThat(distributionConfig.getValidateSerializableObjects()).isFalse();
- assertThat(distributionConfig.getSerializableObjectFilter()).isEqualTo("!*");
+ assertThat(config.getValidateSerializableObjects()).isFalse();
+ assertThat(config.getSerializableObjectFilter()).isEqualTo("!*");
}
@Test
- public void canSerializeWhenFilterIsDisabled() throws Exception {
- trySerializingTestObject(new Properties());
+ public void canSerializeWhenFilterIsDisabled() throws ClassNotFoundException, IOException {
+ initializeSerializationFilter(emptyConfig(), emptySet());
+ DataSerializer.writeObject(testSerializable, outputStream);
+
+ Object deserializedObject;
+ try (InputStream in = new ByteArrayInputStream(outputStream.toByteArray());
+ DataInputStream dataInputStream = new DataInputStream(in)) {
+ deserializedObject = DataSerializer.readObject(dataInputStream);
+ }
+
+ assertThat(deserializedObject).isInstanceOf(testSerializable.getClass());
}
@Test
- public void notAcceptlistedWithFilterCannotSerialize() {
+ public void notAcceptlistedWithFilterCannotSerialize() throws IOException {
properties.setProperty(VALIDATE_SERIALIZABLE_OBJECTS_NAME, "true");
+ initializeSerializationFilter(config(properties), emptySet());
+ DataSerializer.writeObject(testSerializable, outputStream);
Throwable thrown = catchThrowable(() -> {
- trySerializingTestObject(properties);
+ try (InputStream in = new ByteArrayInputStream(outputStream.toByteArray());
+ DataInputStream dataInputStream = new DataInputStream(in)) {
+ DataSerializer.readObject(dataInputStream);
+ }
});
assertThat(thrown).isInstanceOf(InvalidClassException.class);
@@ -94,51 +110,100 @@ public class InternalDataSerializerSerializationAcceptlistTest {
public void acceptlistedWithFilterCanSerialize() throws Exception {
properties.setProperty(VALIDATE_SERIALIZABLE_OBJECTS_NAME, "true");
properties.setProperty(SERIALIZABLE_OBJECT_FILTER_NAME, TestSerializable.class.getName());
+ initializeSerializationFilter(config(properties), emptySet());
+ DataSerializer.writeObject(testSerializable, outputStream);
+
+ Object deserializedObject;
+ try (InputStream in = new ByteArrayInputStream(outputStream.toByteArray());
+ DataInputStream dataInputStream = new DataInputStream(in)) {
+ deserializedObject = DataSerializer.readObject(dataInputStream);
+ }
- trySerializingTestObject(properties);
+ assertThat(deserializedObject).isInstanceOf(testSerializable.getClass());
}
@Test
- public void acceptlistedWithNonMatchingFilterCannotSerialize() {
+ public void acceptlistedWithNonMatchingFilterCannotSerialize() throws IOException {
+ properties.setProperty(VALIDATE_SERIALIZABLE_OBJECTS_NAME, "true");
+ properties.setProperty(SERIALIZABLE_OBJECT_FILTER_NAME, "RabidMonkeyTurnip");
+ initializeSerializationFilter(config(properties), emptySet());
+ DataSerializer.writeObject(testSerializable, outputStream);
+
Throwable thrown = catchThrowable(() -> {
- trySerializingWithFilter("RabidMonkeyTurnip");
+ try (InputStream in = new ByteArrayInputStream(outputStream.toByteArray());
+ DataInputStream dataInputStream = new DataInputStream(in)) {
+ DataSerializer.readObject(dataInputStream);
+ }
});
assertThat(thrown).isInstanceOf(InvalidClassException.class);
}
@Test
- public void acceptlistedWithPartialMatchingFilterCannotSerialize() {
+ public void acceptlistedWithPartialMatchingFilterCannotSerialize() throws IOException {
+ // Not fully qualified class name
+ properties.setProperty(VALIDATE_SERIALIZABLE_OBJECTS_NAME, "true");
+ properties.setProperty(SERIALIZABLE_OBJECT_FILTER_NAME, "TestSerializable");
+ initializeSerializationFilter(config(properties), emptySet());
+ DataSerializer.writeObject(testSerializable, outputStream);
+
Throwable thrown = catchThrowable(() -> {
- trySerializingWithFilter("TestSerializable"); // Not fully qualified class name
+ try (InputStream in = new ByteArrayInputStream(outputStream.toByteArray());
+ DataInputStream dataInputStream = new DataInputStream(in)) {
+ DataSerializer.readObject(dataInputStream);
+ }
});
assertThat(thrown).isInstanceOf(InvalidClassException.class);
}
@Test
- public void acceptlistedWithEmptyFilterCannotSerialize() {
+ public void acceptlistedWithEmptyFilterCannotSerialize() throws IOException {
+ properties.setProperty(VALIDATE_SERIALIZABLE_OBJECTS_NAME, "true");
+ properties.setProperty(SERIALIZABLE_OBJECT_FILTER_NAME, "");
+ initializeSerializationFilter(config(properties), emptySet());
+ DataSerializer.writeObject(testSerializable, outputStream);
+
Throwable thrown = catchThrowable(() -> {
- trySerializingWithFilter("");
+ try (InputStream in = new ByteArrayInputStream(outputStream.toByteArray());
+ DataInputStream dataInputStream = new DataInputStream(in)) {
+ DataSerializer.readObject(dataInputStream);
+ }
});
assertThat(thrown).isInstanceOf(InvalidClassException.class);
}
@Test
- public void acceptlistedWithIncorrectPathFilterCannotSerialize() {
+ public void acceptlistedWithIncorrectPathFilterCannotSerialize() throws IOException {
+ properties.setProperty(VALIDATE_SERIALIZABLE_OBJECTS_NAME, "true");
+ properties.setProperty(SERIALIZABLE_OBJECT_FILTER_NAME,
+ "org.apache.commons.InternalDataSerializerSerializationAcceptlistTest$TestSerializable");
+ initializeSerializationFilter(config(properties), emptySet());
+ DataSerializer.writeObject(testSerializable, outputStream);
+
Throwable thrown = catchThrowable(() -> {
- trySerializingWithFilter(
- "org.apache.commons.InternalDataSerializerSerializationAcceptlistTest$TestSerializable");
+ try (InputStream in = new ByteArrayInputStream(outputStream.toByteArray());
+ DataInputStream dataInputStream = new DataInputStream(in)) {
+ DataSerializer.readObject(dataInputStream);
+ }
});
assertThat(thrown).isInstanceOf(InvalidClassException.class);
}
@Test
- public void acceptlistedWithWildcardPathFilterCannotSerialize() {
+ public void acceptlistedWithWildcardPathFilterCannotSerialize() throws IOException {
+ properties.setProperty(VALIDATE_SERIALIZABLE_OBJECTS_NAME, "true");
+ properties.setProperty(SERIALIZABLE_OBJECT_FILTER_NAME, "org.apache.*");
+ initializeSerializationFilter(config(properties), emptySet());
+ DataSerializer.writeObject(testSerializable, outputStream);
+
Throwable thrown = catchThrowable(() -> {
- trySerializingWithFilter("org.apache.*");
+ try (InputStream in = new ByteArrayInputStream(outputStream.toByteArray());
+ DataInputStream dataInputStream = new DataInputStream(in)) {
+ DataSerializer.readObject(dataInputStream);
+ }
});
assertThat(thrown).isInstanceOf(InvalidClassException.class);
@@ -146,26 +211,26 @@ public class InternalDataSerializerSerializationAcceptlistTest {
@Test
public void acceptlistedWithWildcardSubpathFilterCanSerialize() throws Exception {
- trySerializingWithFilter("org.apache.**");
- }
-
- private void trySerializingWithFilter(String filter) throws Exception {
properties.setProperty(VALIDATE_SERIALIZABLE_OBJECTS_NAME, "true");
- properties.setProperty(SERIALIZABLE_OBJECT_FILTER_NAME, filter);
+ properties.setProperty(SERIALIZABLE_OBJECT_FILTER_NAME, "org.apache.**");
+ initializeSerializationFilter(config(properties), emptySet());
+ DataSerializer.writeObject(testSerializable, outputStream);
- trySerializingTestObject(properties);
- }
+ Object deserializedObject;
+ try (InputStream in = new ByteArrayInputStream(outputStream.toByteArray());
+ DataInputStream dataInputStream = new DataInputStream(in)) {
+ deserializedObject = DataSerializer.readObject(dataInputStream);
+ }
- private void trySerializingTestObject(Properties properties)
- throws IOException, ClassNotFoundException {
- DistributionConfig distributionConfig = new DistributionConfigImpl(properties);
- InternalDataSerializer.initializeSerializationFilter(distributionConfig, emptySet());
+ assertThat(deserializedObject).isInstanceOf(testSerializable.getClass());
+ }
- DataSerializer.writeObject(testSerializable, outputStream);
+ private static SerializableObjectConfig emptyConfig() {
+ return config(new Properties());
+ }
- // if this throws, we're good!
- DataSerializer
- .readObject(new DataInputStream(new ByteArrayInputStream(outputStream.toByteArray())));
+ private static SerializableObjectConfig config(Properties properties) {
+ return new DistributedSerializableObjectConfig(properties);
}
@SuppressWarnings("serial")
diff --git a/geode-core/src/test/java/org/apache/geode/internal/InternalDataSerializerShiroAcceptListTest.java b/geode-core/src/test/java/org/apache/geode/internal/InternalDataSerializerShiroAcceptListTest.java
index d368a10b..723bd1b 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/InternalDataSerializerShiroAcceptListTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/InternalDataSerializerShiroAcceptListTest.java
@@ -16,9 +16,9 @@ package org.apache.geode.internal;
import static java.util.Collections.emptySet;
import static org.apache.geode.distributed.internal.DistributionConfig.VALIDATE_SERIALIZABLE_OBJECTS_NAME;
-import static org.apache.geode.internal.lang.utils.ClassUtils.isClassAvailable;
import static org.apache.geode.internal.serialization.Version.CURRENT;
-import static org.junit.Assume.assumeTrue;
+import static org.apache.geode.internal.serialization.filter.ObjectInputFilterUtils.supportsObjectInputFilter;
+import static org.assertj.core.api.Assertions.assertThat;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
@@ -44,8 +44,7 @@ import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.apache.geode.DataSerializer;
-import org.apache.geode.distributed.internal.DistributionConfig;
-import org.apache.geode.distributed.internal.DistributionConfigImpl;
+import org.apache.geode.internal.serialization.filter.SerializableObjectConfig;
import org.apache.geode.test.junit.categories.SecurityTest;
import org.apache.geode.test.junit.categories.SerializationTest;
@@ -54,9 +53,9 @@ public class InternalDataSerializerShiroAcceptListTest {
@BeforeClass
public static void hasObjectInputFilter() {
- assumeTrue("ObjectInputFilter is present in this JVM",
- isClassAvailable("sun.misc.ObjectInputFilter") ||
- isClassAvailable("java.io.ObjectInputFilter"));
+ assertThat(supportsObjectInputFilter())
+ .as("java.io.ObjectInputFilter or sun.misc.ObjectInputFilter is available")
+ .isTrue();
}
@After
@@ -138,17 +137,9 @@ public class InternalDataSerializerShiroAcceptListTest {
propertiesWithoutFilter());
}
- private static Properties propertiesWithoutFilter() {
- Properties properties = new Properties();
- properties.setProperty(VALIDATE_SERIALIZABLE_OBJECTS_NAME, "true");
-
- return properties;
- }
-
private static void trySerializingObject(Object object, Properties properties)
throws IOException, ClassNotFoundException {
- DistributionConfig distributionConfig = new DistributionConfigImpl(properties);
- InternalDataSerializer.initializeSerializationFilter(distributionConfig, emptySet());
+ InternalDataSerializer.initializeSerializationFilter(config(properties), emptySet());
HeapDataOutputStream outputStream = new HeapDataOutputStream(CURRENT);
DataSerializer.writeObject(object, outputStream);
@@ -158,4 +149,15 @@ public class InternalDataSerializerShiroAcceptListTest {
DataSerializer.readObject(dis);
}
}
+
+ private static SerializableObjectConfig config(Properties properties) {
+ return new DistributedSerializableObjectConfig(properties);
+ }
+
+ private static Properties propertiesWithoutFilter() {
+ Properties properties = new Properties();
+ properties.setProperty(VALIDATE_SERIALIZABLE_OBJECTS_NAME, "true");
+
+ return properties;
+ }
}
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/JmxRmiOpenTypesSerialFilterTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/JmxRmiOpenTypesSerialFilterTest.java
deleted file mode 100644
index c8f8ea9..0000000
--- a/geode-core/src/test/java/org/apache/geode/management/internal/JmxRmiOpenTypesSerialFilterTest.java
+++ /dev/null
@@ -1,351 +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.geode.management.internal;
-
-import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast;
-import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtMost;
-import static org.apache.geode.util.internal.UncheckedUtils.uncheckedCast;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assumptions.assumeThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.rmi.MarshalledObject;
-import java.util.function.Consumer;
-
-import javax.management.ObjectName;
-import javax.management.openmbean.ArrayType;
-import javax.management.openmbean.CompositeData;
-import javax.management.openmbean.CompositeType;
-import javax.management.openmbean.SimpleType;
-import javax.management.openmbean.TabularData;
-import javax.management.openmbean.TabularType;
-
-import org.apache.commons.lang3.JavaVersion;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.contrib.java.lang.system.RestoreSystemProperties;
-
-public class JmxRmiOpenTypesSerialFilterTest {
-
- private Consumer<String> infoLogger;
-
- @Rule
- public RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties();
-
- @Before
- public void setUp() {
- infoLogger = uncheckedCast(mock(Consumer.class));
- }
-
- @Test
- public void propertyValueIsNullByDefault() {
- String propertyValue = System.getProperty(JmxRmiOpenTypesSerialFilter.PROPERTY_NAME);
-
- assertThat(propertyValue).isNull();
- }
-
- @Test
- public void supportsDedicatedSerialFilter_returnsTrue_atLeastJava9() {
- assumeThat(isJavaVersionAtLeast(JavaVersion.JAVA_9)).isTrue();
-
- JmxRmiOpenTypesSerialFilter jmxRmiOpenTypesSerialFilter = new JmxRmiOpenTypesSerialFilter();
-
- boolean result = jmxRmiOpenTypesSerialFilter.supportsDedicatedSerialFilter();
-
- assertThat(result).isTrue();
- }
-
- @Test
- public void supportsDedicatedSerialFilter_returnsFalse_atMostJava8() {
- assumeThat(isJavaVersionAtMost(JavaVersion.JAVA_1_8)).isTrue();
-
- JmxRmiOpenTypesSerialFilter jmxRmiOpenTypesSerialFilter = new JmxRmiOpenTypesSerialFilter();
-
- boolean result = jmxRmiOpenTypesSerialFilter.supportsDedicatedSerialFilter();
-
- assertThat(result).isFalse();
- }
-
- @Test
- public void setPropertyValue_setsValue_ifExistingValueIsNull() {
- String value = "value-of-property";
- JmxRmiOpenTypesSerialFilter jmxRmiOpenTypesSerialFilter = new JmxRmiOpenTypesSerialFilter();
-
- jmxRmiOpenTypesSerialFilter.setPropertyValueUnlessExists(value);
-
- String propertyValue = System.getProperty(JmxRmiOpenTypesSerialFilter.PROPERTY_NAME);
- assertThat(propertyValue).isEqualTo(value);
- }
-
- @Test
- public void setPropertyValue_setsValue_ifExistingValueIsEmpty() {
- System.setProperty(JmxRmiOpenTypesSerialFilter.PROPERTY_NAME, "");
- String value = "value-of-property";
- JmxRmiOpenTypesSerialFilter jmxRmiOpenTypesSerialFilter = new JmxRmiOpenTypesSerialFilter();
-
- jmxRmiOpenTypesSerialFilter.setPropertyValueUnlessExists(value);
-
- String propertyValue = System.getProperty(JmxRmiOpenTypesSerialFilter.PROPERTY_NAME);
- assertThat(propertyValue).isEqualTo(value);
- }
-
- @Test
- public void setPropertyValue_logsMessage_ifExistingValueIsEmpty() {
- System.setProperty(JmxRmiOpenTypesSerialFilter.PROPERTY_NAME, "");
- String value = "value-of-property";
- JmxRmiOpenTypesSerialFilter jmxRmiOpenTypesSerialFilter =
- new JmxRmiOpenTypesSerialFilter(infoLogger, () -> true);
-
- jmxRmiOpenTypesSerialFilter.setPropertyValueUnlessExists(value);
-
- String expectedLogMessage = "System property " + JmxRmiOpenTypesSerialFilter.PROPERTY_NAME +
- " is now configured with '" + value + "'.";
- verify(infoLogger).accept(expectedLogMessage);
- }
-
- @Test
- public void setPropertyValue_leavesExistingValue_ifExistingValueIsNotEmpty() {
- String existingValue = "existing-value-of-property";
- System.setProperty(JmxRmiOpenTypesSerialFilter.PROPERTY_NAME, existingValue);
- String value = "value-of-property";
- JmxRmiOpenTypesSerialFilter jmxRmiOpenTypesSerialFilter = new JmxRmiOpenTypesSerialFilter();
-
- jmxRmiOpenTypesSerialFilter.setPropertyValueUnlessExists(value);
-
- String propertyValue = System.getProperty(JmxRmiOpenTypesSerialFilter.PROPERTY_NAME);
- assertThat(propertyValue).isEqualTo(existingValue);
- }
-
- @Test
- public void setPropertyValue_logsMessage_ifExistingValueIsNotEmpty() {
- String existingValue = "existing-value-of-property";
- System.setProperty(JmxRmiOpenTypesSerialFilter.PROPERTY_NAME, existingValue);
- String value = "value-of-property";
- JmxRmiOpenTypesSerialFilter jmxRmiOpenTypesSerialFilter =
- new JmxRmiOpenTypesSerialFilter(infoLogger, () -> true);
-
- jmxRmiOpenTypesSerialFilter.setPropertyValueUnlessExists(value);
-
- String expectedLogMessage = "System property " + JmxRmiOpenTypesSerialFilter.PROPERTY_NAME +
- " is already configured.";
- verify(infoLogger).accept(expectedLogMessage);
- }
-
- @Test
- public void createSerialFilterPattern_includesBoolean() {
- JmxRmiOpenTypesSerialFilter jmxRmiOpenTypesSerialFilter = new JmxRmiOpenTypesSerialFilter();
-
- String result = jmxRmiOpenTypesSerialFilter.createSerialFilterPattern();
-
- assertThat(result).contains(Boolean.class.getName());
- }
-
- @Test
- public void createSerialFilterPattern_includesByte() {
- JmxRmiOpenTypesSerialFilter jmxRmiOpenTypesSerialFilter = new JmxRmiOpenTypesSerialFilter();
-
- String result = jmxRmiOpenTypesSerialFilter.createSerialFilterPattern();
-
- assertThat(result).contains(Byte.class.getName());
- }
-
- @Test
- public void createSerialFilterPattern_includesCharacter() {
- JmxRmiOpenTypesSerialFilter jmxRmiOpenTypesSerialFilter = new JmxRmiOpenTypesSerialFilter();
-
- String result = jmxRmiOpenTypesSerialFilter.createSerialFilterPattern();
-
- assertThat(result).contains(Character.class.getName());
- }
-
- @Test
- public void createSerialFilterPattern_includesShort() {
- JmxRmiOpenTypesSerialFilter jmxRmiOpenTypesSerialFilter = new JmxRmiOpenTypesSerialFilter();
-
- String result = jmxRmiOpenTypesSerialFilter.createSerialFilterPattern();
-
- assertThat(result).contains(Short.class.getName());
- }
-
- @Test
- public void createSerialFilterPattern_includesInteger() {
- JmxRmiOpenTypesSerialFilter jmxRmiOpenTypesSerialFilter = new JmxRmiOpenTypesSerialFilter();
-
- String result = jmxRmiOpenTypesSerialFilter.createSerialFilterPattern();
-
- assertThat(result).contains(Integer.class.getName());
- }
-
- @Test
- public void createSerialFilterPattern_includesLong() {
- JmxRmiOpenTypesSerialFilter jmxRmiOpenTypesSerialFilter = new JmxRmiOpenTypesSerialFilter();
-
- String result = jmxRmiOpenTypesSerialFilter.createSerialFilterPattern();
-
- assertThat(result).contains(Long.class.getName());
- }
-
- @Test
- public void createSerialFilterPattern_includesFloat() {
- JmxRmiOpenTypesSerialFilter jmxRmiOpenTypesSerialFilter = new JmxRmiOpenTypesSerialFilter();
-
- String result = jmxRmiOpenTypesSerialFilter.createSerialFilterPattern();
-
- assertThat(result).contains(Float.class.getName());
- }
-
- @Test
- public void createSerialFilterPattern_includesDouble() {
- JmxRmiOpenTypesSerialFilter jmxRmiOpenTypesSerialFilter = new JmxRmiOpenTypesSerialFilter();
-
- String result = jmxRmiOpenTypesSerialFilter.createSerialFilterPattern();
-
- assertThat(result).contains(Double.class.getName());
- }
-
- @Test
- public void createSerialFilterPattern_includesString() {
- JmxRmiOpenTypesSerialFilter jmxRmiOpenTypesSerialFilter = new JmxRmiOpenTypesSerialFilter();
-
- String result = jmxRmiOpenTypesSerialFilter.createSerialFilterPattern();
-
- assertThat(result).contains(String.class.getName());
- }
-
- @Test
- public void createSerialFilterPattern_includesBigInteger() {
- JmxRmiOpenTypesSerialFilter jmxRmiOpenTypesSerialFilter = new JmxRmiOpenTypesSerialFilter();
-
- String result = jmxRmiOpenTypesSerialFilter.createSerialFilterPattern();
-
- assertThat(result).contains(BigInteger.class.getName());
- }
-
- @Test
- public void createSerialFilterPattern_includesBigDecimal() {
- JmxRmiOpenTypesSerialFilter jmxRmiOpenTypesSerialFilter = new JmxRmiOpenTypesSerialFilter();
-
- String result = jmxRmiOpenTypesSerialFilter.createSerialFilterPattern();
-
- assertThat(result).contains(BigDecimal.class.getName());
- }
-
- @Test
- public void createSerialFilterPattern_includesObjectName() {
- JmxRmiOpenTypesSerialFilter jmxRmiOpenTypesSerialFilter = new JmxRmiOpenTypesSerialFilter();
-
- String result = jmxRmiOpenTypesSerialFilter.createSerialFilterPattern();
-
- assertThat(result).contains(ObjectName.class.getName());
- }
-
- @Test
- public void createSerialFilterPattern_includesCompositeData() {
- JmxRmiOpenTypesSerialFilter jmxRmiOpenTypesSerialFilter = new JmxRmiOpenTypesSerialFilter();
-
- String result = jmxRmiOpenTypesSerialFilter.createSerialFilterPattern();
-
- assertThat(result).contains(CompositeData.class.getName());
- }
-
- @Test
- public void createSerialFilterPattern_includesTabularData() {
- JmxRmiOpenTypesSerialFilter jmxRmiOpenTypesSerialFilter = new JmxRmiOpenTypesSerialFilter();
-
- String result = jmxRmiOpenTypesSerialFilter.createSerialFilterPattern();
-
- assertThat(result).contains(TabularData.class.getName());
- }
-
- @Test
- public void createSerialFilterPattern_includesSimpleType() {
- JmxRmiOpenTypesSerialFilter jmxRmiOpenTypesSerialFilter = new JmxRmiOpenTypesSerialFilter();
-
- String result = jmxRmiOpenTypesSerialFilter.createSerialFilterPattern();
-
- assertThat(result).contains(SimpleType.class.getName());
- }
-
- @Test
- public void createSerialFilterPattern_includesCompositeType() {
- JmxRmiOpenTypesSerialFilter jmxRmiOpenTypesSerialFilter = new JmxRmiOpenTypesSerialFilter();
-
- String result = jmxRmiOpenTypesSerialFilter.createSerialFilterPattern();
-
- assertThat(result).contains(CompositeType.class.getName());
- }
-
- @Test
- public void createSerialFilterPattern_includesTabularType() {
- JmxRmiOpenTypesSerialFilter jmxRmiOpenTypesSerialFilter = new JmxRmiOpenTypesSerialFilter();
-
- String result = jmxRmiOpenTypesSerialFilter.createSerialFilterPattern();
-
- assertThat(result).contains(TabularType.class.getName());
- }
-
- @Test
- public void createSerialFilterPattern_includesArrayType() {
- JmxRmiOpenTypesSerialFilter jmxRmiOpenTypesSerialFilter = new JmxRmiOpenTypesSerialFilter();
-
- String result = jmxRmiOpenTypesSerialFilter.createSerialFilterPattern();
-
- assertThat(result).contains(ArrayType.class.getName());
- }
-
- @Test
- public void createSerialFilterPattern_includesMarshalledObject() {
- JmxRmiOpenTypesSerialFilter jmxRmiOpenTypesSerialFilter = new JmxRmiOpenTypesSerialFilter();
-
- String result = jmxRmiOpenTypesSerialFilter.createSerialFilterPattern();
-
- assertThat(result).contains(MarshalledObject.class.getName());
- }
-
- @Test
- public void createSerialFilterPattern_rejectsAllOtherTypes() {
- JmxRmiOpenTypesSerialFilter jmxRmiOpenTypesSerialFilter = new JmxRmiOpenTypesSerialFilter();
-
- String result = jmxRmiOpenTypesSerialFilter.createSerialFilterPattern();
-
- assertThat(result).endsWith("!*");
- }
-
- @Test
- public void configureSerialFilterIfEmpty_setsPropertyValue_atLeastJava9() {
- JmxRmiOpenTypesSerialFilter jmxRmiOpenTypesSerialFilter =
- new JmxRmiOpenTypesSerialFilter(infoLogger, () -> true);
-
- jmxRmiOpenTypesSerialFilter.configureSerialFilter();
-
- String propertyValue = System.getProperty(JmxRmiOpenTypesSerialFilter.PROPERTY_NAME);
- assertThat(propertyValue).isNotEmpty();
- }
-
- @Test
- public void configureSerialFilterIfEmpty_setsPropertyValue_atMostJava8() {
- JmxRmiSerialFilter jmxRmiOpenTypesSerialFilter =
- new JmxRmiOpenTypesSerialFilter(infoLogger, () -> false);
-
- jmxRmiOpenTypesSerialFilter.configureSerialFilter();
-
- String propertyValue = System.getProperty(JmxRmiOpenTypesSerialFilter.PROPERTY_NAME);
- assertThat(propertyValue).isNull();
- }
-}
diff --git a/geode-core/src/test/resources/expected-pom.xml b/geode-core/src/test/resources/expected-pom.xml
index a0d787a..e2faa8a 100644
--- a/geode-core/src/test/resources/expected-pom.xml
+++ b/geode-core/src/test/resources/expected-pom.xml
@@ -78,6 +78,11 @@
</dependency>
<dependency>
<groupId>org.apache.geode</groupId>
+ <artifactId>geode-serialization</artifactId>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.geode</groupId>
<artifactId>geode-management</artifactId>
<scope>compile</scope>
</dependency>
@@ -218,11 +223,6 @@
</dependency>
<dependency>
<groupId>org.apache.geode</groupId>
- <artifactId>geode-serialization</artifactId>
- <scope>runtime</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.geode</groupId>
<artifactId>geode-tcp-server</artifactId>
<scope>runtime</scope>
</dependency>
diff --git a/geode-http-service/build.gradle b/geode-http-service/build.gradle
index 8b2bcde..b9c3e07 100755
--- a/geode-http-service/build.gradle
+++ b/geode-http-service/build.gradle
@@ -31,6 +31,7 @@ dependencies {
compileOnly(project(':geode-common')) {
exclude module: 'junit'
}
+ compileOnly(project(':geode-serialization'))
testCompile(project(':geode-core'))
testCompile(project(':geode-common'))
diff --git a/geode-junit/src/main/java/org/apache/geode/codeAnalysis/AnalyzeSerializablesTestBase.java b/geode-junit/src/main/java/org/apache/geode/codeAnalysis/AnalyzeSerializablesTestBase.java
index 63f8825..16f02ea 100644
--- a/geode-junit/src/main/java/org/apache/geode/codeAnalysis/AnalyzeSerializablesTestBase.java
+++ b/geode-junit/src/main/java/org/apache/geode/codeAnalysis/AnalyzeSerializablesTestBase.java
@@ -16,6 +16,7 @@ package org.apache.geode.codeAnalysis;
import static org.apache.geode.distributed.ConfigurationProperties.SERIALIZABLE_OBJECT_FILTER;
import static org.apache.geode.distributed.ConfigurationProperties.VALIDATE_SERIALIZABLE_OBJECTS;
+import static org.apache.geode.internal.InternalDataSerializer.initializeSerializationFilter;
import static org.assertj.core.api.Assertions.fail;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -52,8 +53,7 @@ import org.apache.geode.DataSerializable;
import org.apache.geode.DataSerializer;
import org.apache.geode.codeAnalysis.decode.CompiledClass;
import org.apache.geode.codeAnalysis.decode.CompiledField;
-import org.apache.geode.distributed.internal.DistributionConfigImpl;
-import org.apache.geode.internal.InternalDataSerializer;
+import org.apache.geode.internal.DistributedSerializableObjectConfig;
import org.apache.geode.internal.serialization.BufferDataOutputStream;
import org.apache.geode.internal.serialization.DataSerializableFixedID;
import org.apache.geode.internal.serialization.Version;
@@ -333,7 +333,7 @@ public abstract class AnalyzeSerializablesTestBase
properties.setProperty(VALIDATE_SERIALIZABLE_OBJECTS, "true");
properties.setProperty(SERIALIZABLE_OBJECT_FILTER, "!*");
- InternalDataSerializer.initializeSerializationFilter(new DistributionConfigImpl(properties));
+ initializeSerializationFilter(new DistributedSerializableObjectConfig(properties));
}
@Override
diff --git a/geode-serialization/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiSetFilterBlankIntegrationTest.java b/geode-serialization/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiSetFilterBlankIntegrationTest.java
new file mode 100644
index 0000000..6155c8b
--- /dev/null
+++ b/geode-serialization/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiSetFilterBlankIntegrationTest.java
@@ -0,0 +1,63 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static org.apache.commons.lang3.JavaVersion.JAVA_1_8;
+import static org.apache.commons.lang3.JavaVersion.JAVA_9;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtMost;
+import static org.apache.geode.internal.serialization.filter.ApiPackage.JAVA_IO;
+import static org.apache.geode.internal.serialization.filter.ApiPackage.SUN_MISC;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * This test calls the real setSerialFilter which can only be set once within a JVM, so it's in an
+ * integration test which forks a new JVM for the test class.
+ */
+public class ReflectiveObjectInputFilterApiSetFilterBlankIntegrationTest {
+
+ private ApiPackage apiPackage;
+
+ @Before
+ public void setUp() {
+ if (isJavaVersionAtLeast(JAVA_1_8) && isJavaVersionAtMost(JAVA_1_8)) {
+ apiPackage = SUN_MISC;
+ }
+
+ if (isJavaVersionAtLeast(JAVA_9)) {
+ apiPackage = JAVA_IO;
+ }
+
+ }
+
+ @Test
+ public void setsFilterGivenBlankPattern()
+ throws ClassNotFoundException, IllegalAccessException, InvocationTargetException,
+ NoSuchMethodException {
+ ObjectInputFilterApi api = new ReflectiveObjectInputFilterApi(apiPackage);
+ Object filter = api.createFilter(" ");
+
+ api.setSerialFilter(filter);
+
+ assertThat(api.getSerialFilter())
+ .as("ObjectInputFilter$Config.getSerialFilter()")
+ .isSameAs(filter);
+ }
+}
diff --git a/geode-serialization/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiSetFilterIntegrationTest.java b/geode-serialization/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiSetFilterIntegrationTest.java
new file mode 100644
index 0000000..619673b
--- /dev/null
+++ b/geode-serialization/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiSetFilterIntegrationTest.java
@@ -0,0 +1,60 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static org.apache.commons.lang3.JavaVersion.JAVA_1_8;
+import static org.apache.commons.lang3.JavaVersion.JAVA_9;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtMost;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * This test calls the real setSerialFilter which can only be set once within a JVM, so it's in an
+ * integration test which forks a new JVM for the test class.
+ */
+public class ReflectiveObjectInputFilterApiSetFilterIntegrationTest {
+
+ private ApiPackage apiPackage;
+
+ @Before
+ public void setUp() {
+ if (isJavaVersionAtLeast(JAVA_1_8) && isJavaVersionAtMost(JAVA_1_8)) {
+ apiPackage = ApiPackage.SUN_MISC;
+ }
+
+ if (isJavaVersionAtLeast(JAVA_9)) {
+ apiPackage = ApiPackage.JAVA_IO;
+ }
+ }
+
+ @Test
+ public void setsFilterGivenValidPattern()
+ throws ClassNotFoundException, IllegalAccessException, InvocationTargetException,
+ NoSuchMethodException {
+ ObjectInputFilterApi api = new ReflectiveObjectInputFilterApi(apiPackage);
+ Object filter = api.createFilter("!*");
+
+ api.setSerialFilter(filter);
+
+ assertThat(api.getSerialFilter())
+ .as("ObjectInputFilter$Config.getSerialFilter()")
+ .isSameAs(filter);
+ }
+}
diff --git a/geode-serialization/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiSetFilterNullIntegrationTest.java b/geode-serialization/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiSetFilterNullIntegrationTest.java
new file mode 100644
index 0000000..9b13b73
--- /dev/null
+++ b/geode-serialization/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiSetFilterNullIntegrationTest.java
@@ -0,0 +1,61 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static org.apache.commons.lang3.JavaVersion.JAVA_1_8;
+import static org.apache.commons.lang3.JavaVersion.JAVA_9;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtMost;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.catchThrowable;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * This test calls the real setSerialFilter which can only be set once within a JVM, so it's in an
+ * integration test which forks a new JVM for the test class.
+ */
+public class ReflectiveObjectInputFilterApiSetFilterNullIntegrationTest {
+
+ private ApiPackage apiPackage;
+
+ @Before
+ public void setUp() {
+ if (isJavaVersionAtLeast(JAVA_1_8) && isJavaVersionAtMost(JAVA_1_8)) {
+ apiPackage = ApiPackage.SUN_MISC;
+ }
+
+ if (isJavaVersionAtLeast(JAVA_9)) {
+ apiPackage = ApiPackage.JAVA_IO;
+ }
+ }
+
+ @Test
+ public void throwsNullPointerExceptionGivenNull()
+ throws ClassNotFoundException, NoSuchMethodException {
+ ObjectInputFilterApi api = new ReflectiveObjectInputFilterApi(apiPackage);
+
+ Throwable thrown = catchThrowable(() -> {
+ api.setSerialFilter(null);
+ });
+
+ assertThat(thrown)
+ .isInstanceOf(InvocationTargetException.class)
+ .hasCauseInstanceOf(NullPointerException.class);
+ }
+}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesService.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ApiPackage.java
similarity index 63%
copy from geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesService.java
copy to geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ApiPackage.java
index 1d139ce..549911e 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesService.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ApiPackage.java
@@ -14,20 +14,28 @@
*/
package org.apache.geode.internal.serialization.filter;
-import java.io.IOException;
-import java.net.URL;
-import java.util.Collection;
+import static java.util.Objects.requireNonNull;
-@FunctionalInterface
-public interface SanctionedSerializablesService {
+/**
+ * The Java package containing {@code ObjectInputFilter}. On Java 8, it's {@code sun.misc}. On
+ * Java 9 or greater, it's {@code java.io}.
+ */
+enum ApiPackage {
+
+ JAVA_IO("java.io."),
+ SUN_MISC("sun.misc.");
- URL getSanctionedSerializablesURL();
+ private final String prefix;
+
+ ApiPackage(String prefix) {
+ this.prefix = prefix;
+ }
- default Class<?> getInterface() {
- return getClass();
+ String getPrefix() {
+ return prefix;
}
- default Collection<String> getSerializationAcceptlist() throws IOException {
- return SanctionedSerializables.loadClassNames(getSanctionedSerializablesURL());
+ String qualify(String className) {
+ return prefix + requireNonNull(className, "className is required");
}
}
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/JmxRmiSerialFilter.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/FilterConfiguration.java
similarity index 75%
copy from geode-core/src/main/java/org/apache/geode/management/internal/JmxRmiSerialFilter.java
copy to geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/FilterConfiguration.java
index 4a187e0..9a51a28 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/JmxRmiSerialFilter.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/FilterConfiguration.java
@@ -12,10 +12,16 @@
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
-package org.apache.geode.management.internal;
+package org.apache.geode.internal.serialization.filter;
+/**
+ * Defines operation to configure a serialization filter.
+ */
@FunctionalInterface
-public interface JmxRmiSerialFilter {
+public interface FilterConfiguration {
- void configureSerialFilter();
+ /**
+ * Returns true if serialization filter was successfully configured.
+ */
+ boolean configure();
}
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/JmxRmiSerialFilter.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/FilterPattern.java
similarity index 69%
copy from geode-core/src/main/java/org/apache/geode/management/internal/JmxRmiSerialFilter.java
copy to geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/FilterPattern.java
index 4a187e0..79135b5 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/JmxRmiSerialFilter.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/FilterPattern.java
@@ -12,10 +12,17 @@
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
-package org.apache.geode.management.internal;
+package org.apache.geode.internal.serialization.filter;
+/**
+ * Defines operation to generate a serialization filter pattern. The syntax is defined in the
+ * javadocs of the JREs {@code (sun.misc. or java.io.)ObjectInputFilter$Config#createFilter}
+ */
@FunctionalInterface
-public interface JmxRmiSerialFilter {
+public interface FilterPattern {
- void configureSerialFilter();
+ /**
+ * Returns the serialization filter pattern.
+ */
+ String pattern();
}
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/JmxRmiSerialFilter.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilter.java
similarity index 74%
copy from geode-core/src/main/java/org/apache/geode/management/internal/JmxRmiSerialFilter.java
copy to geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilter.java
index 4a187e0..87c19bd 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/JmxRmiSerialFilter.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilter.java
@@ -12,10 +12,16 @@
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
-package org.apache.geode.management.internal;
+package org.apache.geode.internal.serialization.filter;
+/**
+ * Defines operation to set this serialization filter as the JVMs process-wide filter.
+ */
@FunctionalInterface
-public interface JmxRmiSerialFilter {
+interface GlobalSerialFilter {
- void configureSerialFilter();
+ /**
+ * Sets this serialization filter as the process-wide filter.
+ */
+ void setFilter();
}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterConfiguration.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterConfiguration.java
new file mode 100644
index 0000000..7d312ac
--- /dev/null
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterConfiguration.java
@@ -0,0 +1,144 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.util.Objects.nonNull;
+import static org.apache.commons.lang3.exception.ExceptionUtils.getRootCause;
+import static org.apache.geode.internal.serialization.filter.SanctionedSerializables.loadSanctionedClassNames;
+import static org.apache.geode.internal.serialization.filter.SanctionedSerializables.loadSanctionedSerializablesServices;
+
+import java.util.Set;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
+import org.apache.logging.log4j.Logger;
+
+import org.apache.geode.logging.internal.log4j.api.LogService;
+
+/**
+ * Implementation of {@code FilterConfiguration} that delegates to an {@code ObjectInputFilterApi}.
+ */
+class GlobalSerialFilterConfiguration implements FilterConfiguration {
+
+ private static final Logger LOGGER = LogService.getLogger();
+
+ private final SerializableObjectConfig serializableObjectConfig;
+ private final FilterPatternFactory filterPatternFactory;
+ private final Supplier<Set<String>> sanctionedClassesSupplier;
+ private final Consumer<String> logger;
+ private final GlobalSerialFilterFactory globalSerialFilterFactory;
+
+ /**
+ * Constructs instance with collaborators.
+ */
+ GlobalSerialFilterConfiguration(SerializableObjectConfig serializableObjectConfig) {
+ this(serializableObjectConfig,
+ new DefaultFilterPatternFactory(),
+ () -> loadSanctionedClassNames(loadSanctionedSerializablesServices()),
+ LOGGER::info,
+ (pattern, sanctionedClasses) -> new ReflectiveFacadeGlobalSerialFilterFactory()
+ .create(pattern, sanctionedClasses));
+ }
+
+ GlobalSerialFilterConfiguration(SerializableObjectConfig serializableObjectConfig,
+ Consumer<String> logger, GlobalSerialFilterFactory globalSerialFilterFactory) {
+ this(serializableObjectConfig,
+ new DefaultFilterPatternFactory(),
+ () -> loadSanctionedClassNames(loadSanctionedSerializablesServices()),
+ logger,
+ globalSerialFilterFactory);
+ }
+
+ private GlobalSerialFilterConfiguration(
+ SerializableObjectConfig serializableObjectConfig,
+ FilterPatternFactory filterPatternFactory,
+ Supplier<Set<String>> sanctionedClassesSupplier,
+ Consumer<String> logger,
+ GlobalSerialFilterFactory globalSerialFilterFactory) {
+ this.serializableObjectConfig = serializableObjectConfig;
+ this.filterPatternFactory = filterPatternFactory;
+ this.sanctionedClassesSupplier = sanctionedClassesSupplier;
+ this.logger = logger;
+ this.globalSerialFilterFactory = globalSerialFilterFactory;
+ }
+
+ @Override
+ public boolean configure() {
+ try {
+ // enable validate-serializable-objects
+ serializableObjectConfig.setValidateSerializableObjects(true);
+
+ // create a GlobalSerialFilter
+ String pattern = filterPatternFactory
+ .create(serializableObjectConfig.getSerializableObjectFilterIfEnabled());
+ Set<String> sanctionedClasses = sanctionedClassesSupplier.get();
+ GlobalSerialFilter globalSerialFilter =
+ globalSerialFilterFactory.create(pattern, sanctionedClasses);
+
+ // invoke setFilter on GlobalSerialFilter to set the process-wide filter
+ globalSerialFilter.setFilter();
+
+ // log statement that filter is now configured
+ logger.accept("Global serial filter is now configured.");
+ return true;
+
+ } catch (UnsupportedOperationException e) {
+ if (hasRootCauseWithMessage(e, IllegalStateException.class,
+ "Serial filter can only be set once")) {
+
+ // log statement that filter was already configured
+ logger.accept("Global serial filter is already configured.");
+ }
+ return false;
+ }
+ }
+
+ private static boolean hasRootCauseWithMessage(Throwable throwable,
+ Class<? extends Throwable> causeClass, String message) {
+ Throwable rootCause = getRootCause(throwable);
+ return isInstanceOf(rootCause, causeClass) && hasMessage(rootCause, message);
+ }
+
+ private static boolean isInstanceOf(Throwable throwable, Class<? extends Throwable> causeClass) {
+ return nonNull(throwable) && throwable.getClass().equals(causeClass);
+ }
+
+ private static boolean hasMessage(Throwable throwable, String message) {
+ return nonNull(throwable) && throwable.getMessage().equalsIgnoreCase(message);
+ }
+
+ /**
+ * Creates filter pattern string including the specified optional
+ * {@code serializable-object-filter}.
+ */
+ @FunctionalInterface
+ interface FilterPatternFactory {
+
+ String create(String optionalSerializableObjectFilter);
+ }
+
+ /**
+ * Default implementation of {@code FilterPatternFactory}.
+ */
+ static class DefaultFilterPatternFactory implements FilterPatternFactory {
+
+ @Override
+ public String create(String optionalSerializableObjectFilter) {
+ return new SanctionedSerializablesFilterPattern()
+ .append(optionalSerializableObjectFilter)
+ .pattern();
+ }
+ }
+}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesService.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterConfigurationFactory.java
similarity index 68%
copy from geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesService.java
copy to geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterConfigurationFactory.java
index 1d139ce..6a85bfd 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesService.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterConfigurationFactory.java
@@ -14,20 +14,16 @@
*/
package org.apache.geode.internal.serialization.filter;
-import java.io.IOException;
-import java.net.URL;
-import java.util.Collection;
-
+/**
+ * Defines the factory for creating a {@code FilterConfiguration} to configure a
+ * {@code GlobalSerialFilter}.
+ */
@FunctionalInterface
-public interface SanctionedSerializablesService {
-
- URL getSanctionedSerializablesURL();
-
- default Class<?> getInterface() {
- return getClass();
- }
+interface GlobalSerialFilterConfigurationFactory {
- default Collection<String> getSerializationAcceptlist() throws IOException {
- return SanctionedSerializables.loadClassNames(getSanctionedSerializablesURL());
- }
+ /**
+ * Creates a {@code FilterConfiguration} to configure a {@code GlobalSerialFilter} using the
+ * specified {@code SerializableObjectConfig}.
+ */
+ FilterConfiguration create(SerializableObjectConfig serializableObjectConfig);
}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesService.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterFactory.java
similarity index 70%
copy from geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesService.java
copy to geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterFactory.java
index 1d139ce..6745831 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesService.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterFactory.java
@@ -14,20 +14,17 @@
*/
package org.apache.geode.internal.serialization.filter;
-import java.io.IOException;
-import java.net.URL;
import java.util.Collection;
+/**
+ * Defines the factory for creating a {@code GlobalSerialFilter}.
+ */
@FunctionalInterface
-public interface SanctionedSerializablesService {
-
- URL getSanctionedSerializablesURL();
-
- default Class<?> getInterface() {
- return getClass();
- }
+interface GlobalSerialFilterFactory {
- default Collection<String> getSerializationAcceptlist() throws IOException {
- return SanctionedSerializables.loadClassNames(getSanctionedSerializablesURL());
- }
+ /**
+ * Creates a {@code GlobalSerialFilter} using the specified filter pattern and collection of
+ * sanctioned classes. The pattern is generated by {@code FilterPattern}.
+ */
+ GlobalSerialFilter create(String pattern, Collection<String> sanctionedClasses);
}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/Java9ReflectiveObjectInputFilterApi.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/Java9ReflectiveObjectInputFilterApi.java
new file mode 100644
index 0000000..53e3652
--- /dev/null
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/Java9ReflectiveObjectInputFilterApi.java
@@ -0,0 +1,64 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import java.io.ObjectInputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+/**
+ * Java 9 or greater needs to override some API paths in {@code ReflectiveObjectInputFilterApi}.
+ */
+class Java9ReflectiveObjectInputFilterApi extends ReflectiveObjectInputFilterApi {
+
+ private final Class<?> ObjectInputStream;
+ private final Method ObjectInputStream_setObjectInputFilter;
+ private final Method ObjectInputStream_getObjectInputFilter;
+
+ /**
+ * Constructs instance for the specified {@code ApiPackage}.
+ */
+ Java9ReflectiveObjectInputFilterApi(ApiPackage apiPackage)
+ throws ClassNotFoundException, NoSuchMethodException {
+ super(apiPackage);
+ ObjectInputStream = ObjectInputStream();
+ ObjectInputStream_setObjectInputFilter = ObjectInputStream_setObjectInputFilter();
+ ObjectInputStream_getObjectInputFilter = ObjectInputStream_getObjectInputFilter();
+ }
+
+ private Class<?> ObjectInputStream() throws ClassNotFoundException {
+ return Class.forName(apiPackage.qualify("ObjectInputStream"));
+ }
+
+ private Method ObjectInputStream_setObjectInputFilter() throws NoSuchMethodException {
+ return ObjectInputStream.getDeclaredMethod("setObjectInputFilter", ObjectInputFilter);
+ }
+
+ private Method ObjectInputStream_getObjectInputFilter() throws NoSuchMethodException {
+ return ObjectInputStream.getDeclaredMethod("getObjectInputFilter");
+ }
+
+ @Override
+ public Object getObjectInputFilter(ObjectInputStream inputStream)
+ throws InvocationTargetException, IllegalAccessException {
+ return ObjectInputStream_getObjectInputFilter.invoke(inputStream);
+ }
+
+ @Override
+ public void setObjectInputFilter(ObjectInputStream inputStream, Object objectInputFilter)
+ throws InvocationTargetException, IllegalAccessException {
+ ObjectInputStream_setObjectInputFilter.invoke(inputStream, objectInputFilter);
+ }
+}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/JmxSerialFilterConfiguration.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/JmxSerialFilterConfiguration.java
new file mode 100644
index 0000000..21b0908
--- /dev/null
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/JmxSerialFilterConfiguration.java
@@ -0,0 +1,72 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static org.apache.commons.lang3.StringUtils.isBlank;
+
+import java.util.function.Consumer;
+
+import org.apache.logging.log4j.Logger;
+
+import org.apache.geode.annotations.VisibleForTesting;
+import org.apache.geode.logging.internal.log4j.api.LogService;
+
+/**
+ * Implementation of {@code FilterConfiguration} for configuring the JVMs JMX serialization filter.
+ *
+ * <p>
+ * Configure the “jmx.remote.rmi.server.serial.filter.pattern” system property if Java version is
+ * Java 9 or greater. The serial pattern will be configured to accept only standard JMX open-types.
+ * If the system property already has a non-null value, then leave it as is.
+ *
+ * <p>
+ * Configure the {@code jdk.serialFilter} system property if Java version is Java 8. The serial
+ * pattern will be configured to accept only geode sanctioned serializables and standard JMX
+ * open-types. If the system property already has a non-null value, then leave it as is.
+ */
+class JmxSerialFilterConfiguration implements FilterConfiguration {
+
+ private static final Logger LOGGER = LogService.getLogger();
+
+ private final String key;
+ private final String value;
+ private final Consumer<String> logger;
+
+ /**
+ * Constructs instance for the specified system property and filter pattern.
+ */
+ JmxSerialFilterConfiguration(String property, String pattern) {
+ this(property, pattern, LOGGER::info);
+ }
+
+ @VisibleForTesting
+ JmxSerialFilterConfiguration(String property, String pattern, Consumer<String> logger) {
+ key = property;
+ value = pattern;
+ this.logger = logger;
+ }
+
+ @Override
+ public boolean configure() {
+ if (isBlank(System.getProperty(key))) {
+ System.setProperty(key, value);
+ logger.accept("System property '" + key + "' is now configured with '" + value + "'.");
+ return true;
+ }
+
+ logger.accept("System property '" + key + "' is already configured.");
+ return false;
+ }
+}
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/JmxRmiSerialFilter.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/JmxSerialFilterConfigurationFactory.java
similarity index 70%
copy from geode-core/src/main/java/org/apache/geode/management/internal/JmxRmiSerialFilter.java
copy to geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/JmxSerialFilterConfigurationFactory.java
index 4a187e0..8062e0d 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/JmxRmiSerialFilter.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/JmxSerialFilterConfigurationFactory.java
@@ -12,10 +12,17 @@
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
-package org.apache.geode.management.internal;
+package org.apache.geode.internal.serialization.filter;
+/**
+ * Defines the factory for creating a {@code FilterConfiguration} to configure a
+ * {@code JmxSerialFilter}.
+ */
@FunctionalInterface
-public interface JmxRmiSerialFilter {
+interface JmxSerialFilterConfigurationFactory {
- void configureSerialFilter();
+ /**
+ * Creates a {@code FilterConfiguration} to configure a {@code JmxSerialFilter}.
+ */
+ FilterConfiguration create();
}
diff --git a/geode-core/src/main/java/org/apache/geode/internal/EmptyInputStreamFilter.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/NullObjectInputFilter.java
similarity index 77%
rename from geode-core/src/main/java/org/apache/geode/internal/EmptyInputStreamFilter.java
rename to geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/NullObjectInputFilter.java
index 82369a0..e25c073 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/EmptyInputStreamFilter.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/NullObjectInputFilter.java
@@ -12,13 +12,17 @@
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
-package org.apache.geode.internal;
+package org.apache.geode.internal.serialization.filter;
import java.io.ObjectInputStream;
-public class EmptyInputStreamFilter implements InputStreamFilter {
+/**
+ * Implementation of {@code ObjectInputFilter} that does nothing.
+ */
+public class NullObjectInputFilter implements ObjectInputFilter {
+
@Override
- public void setFilterOn(ObjectInputStream ois) {
+ public void setFilterOn(ObjectInputStream objectInputStream) {
// Do nothing, this is the case where we don't filter.
}
}
diff --git a/geode-core/src/main/java/org/apache/geode/internal/InputStreamFilter.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ObjectInputFilter.java
similarity index 69%
copy from geode-core/src/main/java/org/apache/geode/internal/InputStreamFilter.java
copy to geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ObjectInputFilter.java
index 43b43e6..091f8f6 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/InputStreamFilter.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ObjectInputFilter.java
@@ -12,13 +12,18 @@
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
-package org.apache.geode.internal;
+package org.apache.geode.internal.serialization.filter;
import java.io.ObjectInputStream;
-public interface InputStreamFilter {
-
- /** establish a serialization filter on the given stream */
- void setFilterOn(ObjectInputStream ois);
+/**
+ * Defines operation to set this serialization filter on an {@code ObjectInputStream}.
+ */
+@FunctionalInterface
+public interface ObjectInputFilter {
+ /**
+ * Sets this serialization filter on the specified {@code ObjectInputStream}.
+ */
+ void setFilterOn(ObjectInputStream objectInputStream);
}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterApi.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterApi.java
new file mode 100644
index 0000000..976c748
--- /dev/null
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterApi.java
@@ -0,0 +1,85 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import java.io.ObjectInputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collection;
+
+/**
+ * Adapter interface that defines a layer of indirection for JDK's {@code ObjectInputFilter} class.
+ *
+ * <p>
+ * {@code ObjectInputFilter} is absent in builds of Java 8 prior to 121. It is present in later
+ * builds of Java 8 as {@code sun.misc.ObjectInputFilter} and underwent changes in Java 9 including
+ * being moved to {@code java.io.ObjectInputFilter}.
+ */
+interface ObjectInputFilterApi {
+
+ /**
+ * Get the filter for classes being deserialized on the ObjectInputStream.
+ *
+ * <p>
+ * Invokes {@code getObjectInputFilter} on {@code ObjectInputFilter$Config}.
+ */
+ Object getObjectInputFilter(ObjectInputStream inputStream)
+ throws InvocationTargetException, IllegalAccessException;
+
+ /**
+ * Set the process-wide filter if it has not already been configured or set.
+ *
+ * <p>
+ * Invokes {@code setObjectInputFilter} on {@code ObjectInputFilter$Config}
+ */
+ void setObjectInputFilter(ObjectInputStream inputStream, Object objectInputFilter)
+ throws InvocationTargetException, IllegalAccessException;
+
+ /**
+ * Returns the process-wide serialization filter or null if not configured.
+ *
+ * <p>
+ * Invokes {@code getSerialFilter} on {@code ObjectInputFilter$Config}
+ */
+ Object getSerialFilter()
+ throws InvocationTargetException, IllegalAccessException;
+
+ /**
+ * Set the process-wide filter if it has not already been configured or set.
+ *
+ * <p>
+ * Invokes {@code setSerialFilter} on {@code ObjectInputFilter$Config}
+ */
+ void setSerialFilter(Object objectInputFilter)
+ throws InvocationTargetException, IllegalAccessException;
+
+ /**
+ * Returns an ObjectInputFilter from a string of patterns. The syntax is defined in the javadocs
+ * of the JREs {@code (sun.misc. or java.io.)ObjectInputFilter$Config}.
+ *
+ * <p>
+ * Invokes {@code createFilter} on {@code ObjectInputFilter$Config}.
+ */
+ Object createFilter(String pattern)
+ throws InvocationTargetException, IllegalAccessException;
+
+ /**
+ * Returns a Java Proxy with InvocationHandler to allow Geode to inject custom behavior before
+ * invoking the methods on the JREs {@code (sun.misc. or java.io.)ObjectInputFilter$Config}.
+ */
+ Object createObjectInputFilterProxy(String pattern, Collection<String> sanctionedClasses)
+ throws InvocationTargetException, IllegalAccessException;
+
+ Class<?> getObjectInputFilterClass();
+}
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/JmxRmiSerialFilter.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterApiFactory.java
similarity index 78%
rename from geode-core/src/main/java/org/apache/geode/management/internal/JmxRmiSerialFilter.java
rename to geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterApiFactory.java
index 4a187e0..11957dd 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/JmxRmiSerialFilter.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterApiFactory.java
@@ -12,10 +12,13 @@
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
-package org.apache.geode.management.internal;
+package org.apache.geode.internal.serialization.filter;
+/**
+ * Creates an instance of {@code ObjectInputFilterApi}.
+ */
@FunctionalInterface
-public interface JmxRmiSerialFilter {
+public interface ObjectInputFilterApiFactory {
- void configureSerialFilter();
+ ObjectInputFilterApi createObjectInputFilterApi();
}
diff --git a/geode-core/src/main/java/org/apache/geode/internal/InputStreamFilter.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterFactory.java
similarity index 75%
rename from geode-core/src/main/java/org/apache/geode/internal/InputStreamFilter.java
rename to geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterFactory.java
index 43b43e6..c5fe4bf 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/InputStreamFilter.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterFactory.java
@@ -12,13 +12,13 @@
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
-package org.apache.geode.internal;
+package org.apache.geode.internal.serialization.filter;
-import java.io.ObjectInputStream;
+import java.util.Set;
-public interface InputStreamFilter {
-
- /** establish a serialization filter on the given stream */
- void setFilterOn(ObjectInputStream ois);
+@FunctionalInterface
+public interface ObjectInputFilterFactory {
+ ObjectInputFilter create(SerializableObjectConfig serializableObjectConfig,
+ Set<String> sanctionedClasses);
}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterUtils.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterUtils.java
new file mode 100644
index 0000000..6a44f49
--- /dev/null
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterUtils.java
@@ -0,0 +1,61 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import java.util.function.Function;
+
+import org.apache.geode.annotations.VisibleForTesting;
+import org.apache.geode.internal.lang.utils.ClassUtils;
+
+/**
+ * Utility methods for {@code ObjectInputFilter}.
+ */
+public class ObjectInputFilterUtils {
+
+ private static final String UNSUPPORTED_MESSAGE = "ObjectInputFilter is not available.";
+
+ /**
+ * Returns true if this JVM supports {@code ObjectInputFilter}.
+ */
+ public static boolean supportsObjectInputFilter() {
+ return supportsObjectInputFilter(ClassUtils::isClassAvailable);
+ }
+
+ static void throwUnsupportedOperationException() {
+ throw new UnsupportedOperationException(UNSUPPORTED_MESSAGE, null);
+ }
+
+ static void throwUnsupportedOperationException(Throwable cause) {
+ throw new UnsupportedOperationException(UNSUPPORTED_MESSAGE, cause);
+ }
+
+ static void throwUnsupportedOperationException(String message) {
+ throw new UnsupportedOperationException(message, null);
+ }
+
+ static void throwUnsupportedOperationException(String message, Throwable cause) {
+ throw new UnsupportedOperationException(message, cause);
+ }
+
+ @VisibleForTesting
+ static boolean supportsObjectInputFilter(Function<String, Boolean> isClassAvailable) {
+ return isClassAvailable.apply("sun.misc.ObjectInputFilter") ||
+ isClassAvailable.apply("java.io.ObjectInputFilter");
+ }
+
+ private ObjectInputFilterUtils() {
+ // do not instantiate
+ }
+}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/OpenMBeanFilterPattern.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/OpenMBeanFilterPattern.java
new file mode 100644
index 0000000..14aa037
--- /dev/null
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/OpenMBeanFilterPattern.java
@@ -0,0 +1,68 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.rmi.MarshalledObject;
+import java.util.StringJoiner;
+
+import javax.management.ObjectName;
+import javax.management.openmbean.ArrayType;
+import javax.management.openmbean.CompositeData;
+import javax.management.openmbean.CompositeType;
+import javax.management.openmbean.OpenType;
+import javax.management.openmbean.SimpleType;
+import javax.management.openmbean.TabularData;
+import javax.management.openmbean.TabularType;
+
+/**
+ * Defines a serial filter pattern that accepts all open MBean data types and rejects everything
+ * not included in the pattern.
+ */
+public class OpenMBeanFilterPattern implements FilterPattern {
+
+ @Override
+ public String pattern() {
+ // note: java.util.* may also be needed
+ return new StringJoiner(";")
+
+ // accept all open MBean data types
+ .add(Boolean.class.getName())
+ .add(Byte.class.getName())
+ .add(Character.class.getName())
+ .add(Short.class.getName())
+ .add(Integer.class.getName())
+ .add(Long.class.getName())
+ .add(Float.class.getName())
+ .add(Double.class.getName())
+ .add(String.class.getName())
+ .add(BigInteger.class.getName())
+ .add(BigDecimal.class.getName())
+ .add(ObjectName.class.getName())
+ .add(OpenType.class.getName())
+ .add(CompositeData.class.getName())
+ .add(TabularData.class.getName())
+ .add(SimpleType.class.getName())
+ .add(CompositeType.class.getName())
+ .add(TabularType.class.getName())
+ .add(ArrayType.class.getName())
+ .add(MarshalledObject.class.getName())
+
+ // reject all others
+ .add("!*")
+ .toString();
+ }
+}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilter.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilter.java
new file mode 100644
index 0000000..4a1152d
--- /dev/null
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilter.java
@@ -0,0 +1,71 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.util.Collections.unmodifiableCollection;
+import static org.apache.geode.internal.serialization.filter.ObjectInputFilterUtils.throwUnsupportedOperationException;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collection;
+
+/**
+ * Implementation of {@code GlobalSerialFilter} that delegates to {@code ObjectInputFilterApi} to
+ * maintain independence from the JRE version.
+ */
+class ReflectiveFacadeGlobalSerialFilter implements GlobalSerialFilter {
+
+ private final ObjectInputFilterApi api;
+ private final String pattern;
+ private final Collection<String> sanctionedClasses;
+
+ /**
+ * Constructs instance with the specified collaborators.
+ */
+ ReflectiveFacadeGlobalSerialFilter(ObjectInputFilterApi api, String pattern,
+ Collection<String> sanctionedClasses) {
+ this.api = api;
+ this.pattern = pattern;
+ this.sanctionedClasses = unmodifiableCollection(sanctionedClasses);
+ }
+
+ /**
+ * Invokes interface-defined operation to set this as the process-wide filter.
+ */
+ @Override
+ public void setFilter() {
+ try {
+ // create the ObjectInputFilter to set as the global serial filter
+ Object objectInputFilter = api.createObjectInputFilterProxy(pattern, sanctionedClasses);
+
+ // set the global serial filter
+ api.setSerialFilter(objectInputFilter);
+
+ } catch (IllegalAccessException | InvocationTargetException e) {
+ throwUnsupportedOperationException(
+ "Geode was unable to configure a global serialization filter",
+ e);
+ }
+ }
+
+ @Override
+ public String toString() {
+ return new StringBuilder(getClass().getSimpleName())
+ .append('{')
+ .append("api=").append(api)
+ .append(", pattern='").append(pattern).append('\'')
+ .append('}')
+ .toString();
+ }
+}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesService.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilterFactory.java
similarity index 50%
copy from geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesService.java
copy to geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilterFactory.java
index 1d139ce..022c766 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesService.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilterFactory.java
@@ -14,20 +14,31 @@
*/
package org.apache.geode.internal.serialization.filter;
-import java.io.IOException;
-import java.net.URL;
+import static java.util.Objects.requireNonNull;
+
import java.util.Collection;
-@FunctionalInterface
-public interface SanctionedSerializablesService {
+import org.apache.geode.annotations.VisibleForTesting;
+
+/**
+ * Creates an instance of {@code GlobalSerialFilter} that delegates to {@code ObjectInputFilterApi}
+ * to maintain independence from the JRE version.
+ */
+class ReflectiveFacadeGlobalSerialFilterFactory implements GlobalSerialFilterFactory {
- URL getSanctionedSerializablesURL();
+ private final ObjectInputFilterApi api;
+
+ ReflectiveFacadeGlobalSerialFilterFactory() {
+ this(new ReflectiveObjectInputFilterApiFactory().createObjectInputFilterApi());
+ }
- default Class<?> getInterface() {
- return getClass();
+ @VisibleForTesting
+ ReflectiveFacadeGlobalSerialFilterFactory(ObjectInputFilterApi api) {
+ this.api = requireNonNull(api, "ObjectInputFilterApi is required");
}
- default Collection<String> getSerializationAcceptlist() throws IOException {
- return SanctionedSerializables.loadClassNames(getSanctionedSerializablesURL());
+ @Override
+ public GlobalSerialFilter create(String pattern, Collection<String> sanctionedClasses) {
+ return new ReflectiveFacadeGlobalSerialFilter(api, pattern, sanctionedClasses);
}
}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeObjectInputFilter.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeObjectInputFilter.java
new file mode 100644
index 0000000..08bae44
--- /dev/null
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeObjectInputFilter.java
@@ -0,0 +1,78 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.util.Collections.unmodifiableCollection;
+import static org.apache.geode.internal.serialization.filter.ObjectInputFilterUtils.throwUnsupportedOperationException;
+
+import java.io.ObjectInputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collection;
+
+/**
+ * Implementation of {@code ObjectInputFilter} that delegates to {@code ObjectInputFilterApi} to
+ * maintain independence from the JRE version.
+ */
+class ReflectiveFacadeObjectInputFilter implements ObjectInputFilter {
+
+ private final ObjectInputFilterApi api;
+ private final String pattern;
+ private final Collection<String> sanctionedClasses;
+
+ /**
+ * Constructs instance with the specified collaborators.
+ */
+ ReflectiveFacadeObjectInputFilter(ObjectInputFilterApi api, String pattern,
+ Collection<String> sanctionedClasses) {
+ this.pattern = pattern;
+ this.sanctionedClasses = unmodifiableCollection(sanctionedClasses);
+ this.api = api;
+ }
+
+ /**
+ * Invokes interface-defined operation to set this serialization filter on the specified target
+ * {@code ObjectInputStream}.
+ */
+ @Override
+ public void setFilterOn(ObjectInputStream objectInputStream) {
+ try {
+ // create the ObjectInputFilter to set as the global serial filter
+ Object objectInputFilter = api.createObjectInputFilterProxy(pattern, sanctionedClasses);
+
+ // set the global serial filter
+ api.setObjectInputFilter(objectInputStream, objectInputFilter);
+
+ } catch (IllegalAccessException | InvocationTargetException e) {
+ throwUnsupportedOperationException(
+ "Geode was unable to configure a serialization filter on input stream '"
+ + objectInputStream.hashCode() + "'",
+ e);
+ }
+ }
+
+ @Override
+ public String toString() {
+ return new StringBuilder(getClass().getSimpleName())
+ .append('{')
+ .append("api=").append(api)
+ .append(", pattern='").append(pattern).append('\'')
+ .append('}')
+ .toString();
+ }
+
+ ObjectInputFilterApi getObjectInputFilterApi() {
+ return api;
+ }
+}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeObjectInputFilterFactory.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeObjectInputFilterFactory.java
new file mode 100644
index 0000000..a38416c
--- /dev/null
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeObjectInputFilterFactory.java
@@ -0,0 +1,61 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.util.Objects.requireNonNull;
+import static org.apache.geode.internal.serialization.filter.ObjectInputFilterUtils.supportsObjectInputFilter;
+import static org.apache.geode.internal.serialization.filter.ObjectInputFilterUtils.throwUnsupportedOperationException;
+
+import java.util.Set;
+
+/**
+ * Creates an instance of {@code ObjectInputFilter} that delegates to {@code ObjectInputFilterApi}
+ * to maintain independence from the JRE version.
+ */
+public class ReflectiveFacadeObjectInputFilterFactory implements ObjectInputFilterFactory {
+
+ private static final String UNSUPPORTED_MESSAGE =
+ "A serialization filter has been specified but this version of Java does not support serialization filters - ObjectInputFilter is not available";
+
+ private final ObjectInputFilterApi api;
+
+ public ReflectiveFacadeObjectInputFilterFactory() {
+ this(new ReflectiveObjectInputFilterApiFactory().createObjectInputFilterApi());
+ }
+
+ private ReflectiveFacadeObjectInputFilterFactory(ObjectInputFilterApi api) {
+ this.api = requireNonNull(api, "ObjectInputFilterApi is required");
+ }
+
+ @Override
+ public ObjectInputFilter create(SerializableObjectConfig config, Set<String> sanctionedClasses) {
+ if (config.getValidateSerializableObjects()) {
+ requireObjectInputFilter();
+
+ String pattern = new SanctionedSerializablesFilterPattern()
+ .append(config.getSerializableObjectFilter())
+ .pattern();
+
+ return new ReflectiveFacadeObjectInputFilter(api, pattern, sanctionedClasses);
+ }
+ return new NullObjectInputFilter();
+ }
+
+ public static void requireObjectInputFilter() {
+ if (!supportsObjectInputFilter()) {
+ throwUnsupportedOperationException(UNSUPPORTED_MESSAGE);
+ }
+ }
+}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApi.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApi.java
new file mode 100644
index 0000000..10c3aad
--- /dev/null
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApi.java
@@ -0,0 +1,269 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import java.io.InvalidClassException;
+import java.io.ObjectInputStream;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.util.Collection;
+
+import org.apache.logging.log4j.Logger;
+
+import org.apache.geode.annotations.VisibleForTesting;
+import org.apache.geode.logging.internal.log4j.api.LogService;
+
+/**
+ * Implementation of {@code ObjectInputFilterApi} that uses reflection and a dynamic proxy to wrap
+ * the JREs ObjectInputFilter API in both Java 8 and Java 9 or greater.
+ */
+public class ReflectiveObjectInputFilterApi implements ObjectInputFilterApi {
+
+ private static final Logger logger = LogService.getLogger();
+
+ protected final ApiPackage apiPackage;
+
+ // api.package.ObjectInputFilter
+ protected final Class<?> ObjectInputFilter;
+ private final Method ObjectInputFilter_checkInput;
+ private final Object ObjectInputFilter_Status_ALLOWED;
+ private final Object ObjectInputFilter_Status_REJECTED;
+
+ // api.package.ObjectInputFilter$Config
+ private final Class<?> ObjectInputFilter_Config;
+ private final Method ObjectInputFilter_Config_createFilter;
+ private final Method ObjectInputFilter_Config_getObjectInputFilter;
+ private final Method ObjectInputFilter_Config_setObjectInputFilter;
+ private final Method ObjectInputFilter_Config_getSerialFilter;
+ private final Method ObjectInputFilter_Config_setSerialFilter;
+
+ // api.package.ObjectInputFilter$FilterInfo
+ private final Class<?> ObjectInputFilter_FilterInfo;
+ private final Method ObjectInputFilter_FilterInfo_serialClass;
+
+ /**
+ * Use reflection to look up the classes and methods for the API.
+ */
+ public ReflectiveObjectInputFilterApi(ApiPackage apiPackage)
+ throws ClassNotFoundException, NoSuchMethodException {
+ this.apiPackage = apiPackage;
+
+ ObjectInputFilter = ObjectInputFilter();
+ ObjectInputFilter_Config = ObjectInputFilter_Config();
+ ObjectInputFilter_FilterInfo = ObjectInputFilter_FilterInfo();
+ Class<?> ObjectInputFilter_Status = ObjectInputFilter_Status();
+ ObjectInputFilter_Status_ALLOWED = ObjectInputFilter_Status.getEnumConstants()[1];
+ ObjectInputFilter_Status_REJECTED = ObjectInputFilter_Status.getEnumConstants()[2];
+
+ // Status enum includes UNDECIDED, ALLOWED, and REJECTED
+ if (!ObjectInputFilter_Status_ALLOWED.toString().equals("ALLOWED")
+ || !ObjectInputFilter_Status_REJECTED.toString().equals("REJECTED")) {
+ throw new UnsupportedOperationException(
+ "ObjectInputFilter$Status enumeration in this JDK is not as expected");
+ }
+
+ ObjectInputFilter_checkInput = ObjectInputFilter_checkInput();
+
+ ObjectInputFilter_Config_createFilter = ObjectInputFilter_Config_createFilter();
+ if (apiPackage == ApiPackage.SUN_MISC) {
+ ObjectInputFilter_Config_getObjectInputFilter =
+ ObjectInputFilter_Config_getObjectInputFilter();
+ ObjectInputFilter_Config_setObjectInputFilter =
+ ObjectInputFilter_Config_setObjectInputFilter();
+ } else {
+ ObjectInputFilter_Config_getObjectInputFilter = null;
+ ObjectInputFilter_Config_setObjectInputFilter = null;
+ }
+ ObjectInputFilter_Config_getSerialFilter = ObjectInputFilter_Config_getSerialFilter();
+ ObjectInputFilter_Config_setSerialFilter = ObjectInputFilter_Config_setSerialFilter();
+
+ ObjectInputFilter_FilterInfo_serialClass = ObjectInputFilter_FilterInfo_serialClass();
+ }
+
+ @Override
+ public Object getObjectInputFilter(ObjectInputStream inputStream)
+ throws InvocationTargetException, IllegalAccessException {
+ return ObjectInputFilter_Config_getObjectInputFilter.invoke(ObjectInputFilter_Config,
+ inputStream);
+ }
+
+ @Override
+ public void setObjectInputFilter(ObjectInputStream inputStream, Object objectInputFilter)
+ throws InvocationTargetException, IllegalAccessException {
+ ObjectInputFilter_Config_setObjectInputFilter.invoke(ObjectInputFilter_Config, inputStream,
+ objectInputFilter);
+ }
+
+ @Override
+ public Object getSerialFilter()
+ throws InvocationTargetException, IllegalAccessException {
+ return ObjectInputFilter_Config_getSerialFilter.invoke(ObjectInputFilter_Config);
+ }
+
+ @Override
+ public void setSerialFilter(Object objectInputFilter)
+ throws InvocationTargetException, IllegalAccessException {
+ ObjectInputFilter_Config_setSerialFilter.invoke(ObjectInputFilter_Config, objectInputFilter);
+ }
+
+ @Override
+ public Object createFilter(String pattern)
+ throws InvocationTargetException, IllegalAccessException {
+ return ObjectInputFilter_Config_createFilter.invoke(null, pattern);
+ }
+
+ @Override
+ public Object createObjectInputFilterProxy(String pattern, Collection<String> sanctionedClasses)
+ throws InvocationTargetException, IllegalAccessException {
+ Object objectInputFilter =
+ ObjectInputFilter_Config_createFilter.invoke(ObjectInputFilter_Config, pattern);
+
+ /*
+ * Members first connect to each other with sockets that are restricted to the Geode sanctioned
+ * serializables which sets the Filter on that stream (an ObjectInputStream can only set a
+ * Filter once in its lifetime). Geode then loads up its ConfigurationProperties and needs
+ * to widen the Filter to include the User's sanctioned serializables if they provided any
+ * (serializable-object-filter).
+ *
+ * Wrap the Filter in a dynamic Proxy to provide an InvocationHandler in order to decorate
+ * before-calls to checkInput (checks the class against the filter). This allows us to
+ * effectively override the call to widen the filter to include the User's addition to the set
+ * of sanctioned serializables.
+ */
+ InvocationHandler invocationHandler = (proxy, method, args) -> {
+ if (!"checkInput".equals(method.getName())) {
+ throw new UnsupportedOperationException(
+ "ObjectInputFilter." + method.getName() + " is not implemented");
+ }
+
+ // fetch the class of the serialized instance
+ Object objectInputFilter_filterInfo = args[0];
+ Class<?> serialClass =
+ (Class<?>) ObjectInputFilter_FilterInfo_serialClass.invoke(objectInputFilter_filterInfo);
+ if (serialClass == null) { // no class to check, so nothing to accept-list
+ return ObjectInputFilter_checkInput.invoke(objectInputFilter, objectInputFilter_filterInfo);
+ }
+
+ // check sanctionedClasses to determine if the name of the class is ALLOWED
+ String serialClassName = serialClass.getName();
+ if (serialClass.isArray()) {
+ serialClassName = serialClass.getComponentType().getName();
+ }
+ if (sanctionedClasses.contains(serialClassName)) {
+ return ObjectInputFilter_Status_ALLOWED;
+ }
+
+ // check the filter to determine if the class is ALLOWED
+ Object objectInputFilter_Status =
+ ObjectInputFilter_checkInput.invoke(objectInputFilter, objectInputFilter_filterInfo);
+ if (objectInputFilter_Status == ObjectInputFilter_Status_REJECTED) {
+ logger.fatal("Serialization filter is rejecting class {}", serialClassName,
+ new InvalidClassException(serialClassName));
+ }
+ return objectInputFilter_Status;
+ };
+
+ // wrap the filter within a proxy to inject the above invocation handler
+ return Proxy.newProxyInstance(
+ ObjectInputFilter.getClassLoader(),
+ new Class[] {ObjectInputFilter},
+ invocationHandler);
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder("ReflectiveObjectInputFilterApi{");
+ sb.append("apiPackage='").append(apiPackage).append('\'');
+ sb.append('}');
+ return sb.toString();
+ }
+
+ @Override
+ public Class<?> getObjectInputFilterClass() {
+ return ObjectInputFilter;
+ }
+
+ @VisibleForTesting
+ public ApiPackage getApiPackage() {
+ return apiPackage;
+ }
+
+ /** {@code public interface ObjectInputFilter} */
+ private Class<?> ObjectInputFilter() throws ClassNotFoundException {
+ return Class.forName(apiPackage.qualify("ObjectInputFilter"));
+ }
+
+ /** {@code public Status checkInput(FilterInfo filterInfo)} */
+ private Method ObjectInputFilter_checkInput()
+ throws NoSuchMethodException {
+ return ObjectInputFilter
+ .getDeclaredMethod("checkInput", ObjectInputFilter_FilterInfo);
+ }
+
+ /** {@code public enum Status} */
+ private Class<?> ObjectInputFilter_Status() throws ClassNotFoundException {
+ return Class.forName(apiPackage.qualify("ObjectInputFilter$Status"));
+ }
+
+ /** {@code public final class Config} */
+ private Class<?> ObjectInputFilter_Config() throws ClassNotFoundException {
+ return Class.forName(apiPackage.qualify("ObjectInputFilter$Config"));
+ }
+
+ /** {@code public static ObjectInputFilter createFilter(String pattern)} */
+ private Method ObjectInputFilter_Config_createFilter()
+ throws NoSuchMethodException {
+ return ObjectInputFilter_Config.getDeclaredMethod("createFilter", String.class);
+ }
+
+ /** {@code public static ObjectInputFilter getSerialFilter()} */
+ private Method ObjectInputFilter_Config_getObjectInputFilter()
+ throws NoSuchMethodException {
+ return ObjectInputFilter_Config.getDeclaredMethod("getObjectInputFilter",
+ ObjectInputStream.class);
+ }
+
+ /** {@code public static setSerialFilter(ObjectInputFilter filter)} */
+ private Method ObjectInputFilter_Config_setObjectInputFilter()
+ throws NoSuchMethodException {
+ return ObjectInputFilter_Config.getDeclaredMethod("setObjectInputFilter",
+ ObjectInputStream.class, ObjectInputFilter);
+ }
+
+ /** {@code public static ObjectInputFilter getSerialFilter()} */
+ private Method ObjectInputFilter_Config_getSerialFilter()
+ throws NoSuchMethodException {
+ return ObjectInputFilter_Config.getDeclaredMethod("getSerialFilter");
+ }
+
+ /** {@code public static setSerialFilter(ObjectInputFilter filter)} */
+ private Method ObjectInputFilter_Config_setSerialFilter()
+ throws NoSuchMethodException {
+ return ObjectInputFilter_Config.getDeclaredMethod("setSerialFilter", ObjectInputFilter);
+ }
+
+ /** {@code public interface FilterInfo} */
+ private Class<?> ObjectInputFilter_FilterInfo() throws ClassNotFoundException {
+ return Class.forName(apiPackage.qualify("ObjectInputFilter$FilterInfo"));
+ }
+
+ /** {@code public Class<?> serialClass()} */
+ private Method ObjectInputFilter_FilterInfo_serialClass()
+ throws NoSuchMethodException {
+ return ObjectInputFilter_FilterInfo.getDeclaredMethod("serialClass");
+ }
+}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiFactory.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiFactory.java
new file mode 100644
index 0000000..d50c15d
--- /dev/null
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiFactory.java
@@ -0,0 +1,45 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static org.apache.commons.lang3.JavaVersion.JAVA_1_8;
+import static org.apache.commons.lang3.JavaVersion.JAVA_9;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast;
+import static org.apache.geode.internal.serialization.filter.ApiPackage.JAVA_IO;
+import static org.apache.geode.internal.serialization.filter.ApiPackage.SUN_MISC;
+import static org.apache.geode.internal.serialization.filter.ObjectInputFilterUtils.throwUnsupportedOperationException;
+
+/**
+ * Implementation of {@code ObjectInputFilterApiFactory} that creates a reflection based
+ * {@code ObjectInputFilterApi}.
+ */
+public class ReflectiveObjectInputFilterApiFactory implements ObjectInputFilterApiFactory {
+
+ @Override
+ public ObjectInputFilterApi createObjectInputFilterApi() {
+ try {
+ if (isJavaVersionAtLeast(JAVA_9)) {
+ return new Java9ReflectiveObjectInputFilterApi(JAVA_IO);
+ }
+ if (isJavaVersionAtLeast(JAVA_1_8)) {
+ return new ReflectiveObjectInputFilterApi(SUN_MISC);
+ }
+ } catch (ClassNotFoundException | NoSuchMethodException e) {
+ throwUnsupportedOperationException(e);
+ }
+ throwUnsupportedOperationException();
+ return null; // unreachable
+ }
+}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializables.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializables.java
index a493c58..6c68010 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializables.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializables.java
@@ -32,14 +32,13 @@ import org.apache.logging.log4j.Logger;
import org.apache.geode.logging.internal.log4j.api.LogService;
+/**
+ * Loads {@code SanctionedSerializablesService}s and sanctioned class data.
+ */
public class SanctionedSerializables {
private static final Logger logger = LogService.getLogger();
- private SanctionedSerializables() {
- // do not instantiate
- }
-
/**
* Loads all SanctionedSerializablesServices on the classpath.
*/
@@ -57,7 +56,7 @@ public class SanctionedSerializables {
* Loads class names of sanctioned serializables from a resource. Caller will add these to the
* serialization filter acceptlist.
*/
- public static Collection<String> loadClassNames(URL sanctionedSerializables) throws IOException {
+ static Collection<String> loadClassNames(URL sanctionedSerializables) throws IOException {
if (sanctionedSerializables == null) {
return emptyList();
}
@@ -93,4 +92,8 @@ public class SanctionedSerializables {
}
return sanctionedClasses;
}
+
+ private SanctionedSerializables() {
+ // do not instantiate
+ }
}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesFilterPattern.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesFilterPattern.java
new file mode 100644
index 0000000..b40ef0e
--- /dev/null
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesFilterPattern.java
@@ -0,0 +1,111 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import java.util.StringJoiner;
+
+/**
+ * This list contains classes that Geode's classes subclass, such as antlr AST classes which are
+ * used by our Object Query Language. It also contains certain classes that are DataSerializable
+ * but end up being serialized as part of other serializable objects. VersionedObjectList, for
+ * instance, is serialized as part of a partial putAll exception object.
+ *
+ * <p>
+ * Do not java-serialize objects that Geode does not have complete control over. This leaves us
+ * open to security attacks such as Gadget Chains and compromises the ability to do a rolling
+ * upgrade from one version of Geode to the next.
+ *
+ * <p>
+ * In general, you shouldn't use java serialization, and you should implement
+ * DataSerializableFixedID for internal Geode objects. This gives you better control over
+ * backward-compatibility.
+ *
+ * <p>
+ * Do not add to this list unless absolutely necessary. Instead, put your classes either in the
+ * sanctionedSerializables file for your module or in its excludedClasses file. Run
+ * AnalyzeSerializables to generate the content for the file.
+ */
+public class SanctionedSerializablesFilterPattern implements FilterPattern {
+
+ private final StringJoiner stringJoiner = dependenciesPattern();
+
+ @Override
+ public String pattern() {
+ return new StringJoiner(";")
+ .merge(stringJoiner)
+
+ // reject all others
+ .add("!*")
+
+ .toString();
+ }
+
+ /**
+ * Used to append the user specified serializable-object-filter
+ */
+ public SanctionedSerializablesFilterPattern append(CharSequence chars) {
+ stringJoiner.add(chars);
+ return this;
+ }
+
+ private static StringJoiner dependenciesPattern() {
+ return new StringJoiner(";")
+
+ // accept all open MBean data types
+ .add("java.**")
+ .add("javax.management.**")
+
+ // used for some old enums
+ .add("javax.print.attribute.EnumSyntax")
+
+ // query AST objects
+ .add("antlr.**")
+
+ // old Admin API
+ .add("org.apache.commons.modeler.AttributeInfo")
+ .add("org.apache.commons.modeler.FeatureInfo")
+ .add("org.apache.commons.modeler.ManagedBean")
+ .add("org.apache.geode.distributed.internal.DistributionConfigSnapshot")
+ .add("org.apache.geode.distributed.internal.RuntimeDistributionConfigImpl")
+ .add("org.apache.geode.distributed.internal.DistributionConfigImpl")
+
+ // WindowedExportFunction, RegionSnapshotService
+ .add("org.apache.geode.distributed.internal.membership.InternalDistributedMember")
+
+ // putAll
+ .add("org.apache.geode.internal.cache.persistence.PersistentMemberID")
+ .add("org.apache.geode.internal.cache.persistence.DiskStoreID")
+ .add("org.apache.geode.internal.cache.tier.sockets.VersionedObjectList")
+
+ // security services
+ .add("org.apache.shiro.**")
+
+ // export logs
+ .add("org.apache.logging.log4j.Level")
+ .add("org.apache.logging.log4j.spi.StandardLevel")
+
+ // jar deployment
+ .add("com.sun.proxy.$Proxy*")
+ .add("com.healthmarketscience.rmiio.RemoteInputStream")
+ .add("javax.rmi.ssl.SslRMIClientSocketFactory")
+ .add("javax.net.ssl.SSLHandshakeException")
+ .add("javax.net.ssl.SSLException")
+ .add("sun.security.validator.ValidatorException")
+ .add("sun.security.provider.certpath.SunCertPathBuilderException")
+
+ // geode-modules
+ .add("org.apache.geode.modules.util.SessionCustomExpiry");
+ }
+}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesService.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesService.java
index 1d139ce..9306934 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesService.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesService.java
@@ -18,9 +18,15 @@ import java.io.IOException;
import java.net.URL;
import java.util.Collection;
+/**
+ * Service interface to define a module's sanctioned serializables.
+ */
@FunctionalInterface
public interface SanctionedSerializablesService {
+ /**
+ * Returns a URL for loading a module's collection of sanctioned serializables.
+ */
URL getSanctionedSerializablesURL();
default Class<?> getInterface() {
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesService.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SerializableObjectConfig.java
similarity index 67%
copy from geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesService.java
copy to geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SerializableObjectConfig.java
index 1d139ce..40ab638 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesService.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SerializableObjectConfig.java
@@ -14,20 +14,18 @@
*/
package org.apache.geode.internal.serialization.filter;
-import java.io.IOException;
-import java.net.URL;
-import java.util.Collection;
+/**
+ * Defines the configuration properties used by serialization filter in Geode.
+ */
+public interface SerializableObjectConfig {
-@FunctionalInterface
-public interface SanctionedSerializablesService {
+ default String getSerializableObjectFilterIfEnabled() {
+ return getValidateSerializableObjects() ? getSerializableObjectFilter() : null;
+ }
- URL getSanctionedSerializablesURL();
+ boolean getValidateSerializableObjects();
- default Class<?> getInterface() {
- return getClass();
- }
+ void setValidateSerializableObjects(boolean value);
- default Collection<String> getSerializationAcceptlist() throws IOException {
- return SanctionedSerializables.loadClassNames(getSanctionedSerializablesURL());
- }
+ String getSerializableObjectFilter();
}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SystemPropertyGlobalSerialFilterConfigurationFactory.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SystemPropertyGlobalSerialFilterConfigurationFactory.java
new file mode 100644
index 0000000..4c592d3
--- /dev/null
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SystemPropertyGlobalSerialFilterConfigurationFactory.java
@@ -0,0 +1,52 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static org.apache.commons.lang3.StringUtils.isBlank;
+
+import org.apache.geode.internal.lang.SystemProperty;
+
+/**
+ * Creates an instance of {@code GlobalSerialFilterConfiguration} that is enabled only if certain
+ * conditions are met. The system property {@code jdk.serialFilter} must be blank, and the system
+ * property {@code geode.enableGlobalSerialFilter} must be set to true.
+ */
+public class SystemPropertyGlobalSerialFilterConfigurationFactory
+ implements GlobalSerialFilterConfigurationFactory {
+
+ private final boolean enabled;
+
+ public SystemPropertyGlobalSerialFilterConfigurationFactory() {
+ // enable GlobalSerialFilter only under these conditions:
+ // (1) jdk.serialFilter must be blank
+ // (2) geode.enableGlobalSerialFilter must be set "true"
+ this(isBlank(System.getProperty("jdk.serialFilter")) &&
+ SystemProperty
+ .getProductBooleanProperty("enableGlobalSerialFilter")
+ .orElse(false));
+ }
+
+ private SystemPropertyGlobalSerialFilterConfigurationFactory(boolean enabled) {
+ this.enabled = enabled;
+ }
+
+ @Override
+ public FilterConfiguration create(SerializableObjectConfig serializableObjectConfig) {
+ if (enabled) {
+ return new GlobalSerialFilterConfiguration(serializableObjectConfig);
+ }
+ return () -> false;
+ }
+}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SystemPropertyJmxSerialFilterConfigurationFactory.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SystemPropertyJmxSerialFilterConfigurationFactory.java
new file mode 100644
index 0000000..6f9fbd7
--- /dev/null
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SystemPropertyJmxSerialFilterConfigurationFactory.java
@@ -0,0 +1,55 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static org.apache.commons.lang3.JavaVersion.JAVA_9;
+import static org.apache.commons.lang3.StringUtils.isBlank;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast;
+
+import org.apache.geode.annotations.VisibleForTesting;
+
+/**
+ * Creates an instance of {@code JmxSerialFilterConfiguration} that is enabled only if certain
+ * conditions are met. The system property {@code jmx.remote.rmi.server.serial.filter.pattern} must
+ * be blank, and the JRE must be Java 9 or greater.
+ */
+public class SystemPropertyJmxSerialFilterConfigurationFactory
+ implements JmxSerialFilterConfigurationFactory {
+
+ private static final String PROPERTY_NAME = "jmx.remote.rmi.server.serial.filter.pattern";
+
+ private final boolean enabled;
+ private final String pattern;
+
+ public SystemPropertyJmxSerialFilterConfigurationFactory() {
+ // JmxSerialFilter requires Java 9 or greater
+ this(isJavaVersionAtLeast(JAVA_9) && isBlank(System.getProperty(PROPERTY_NAME)),
+ new OpenMBeanFilterPattern().pattern());
+ }
+
+ @VisibleForTesting
+ SystemPropertyJmxSerialFilterConfigurationFactory(boolean enabled, String pattern) {
+ this.enabled = enabled;
+ this.pattern = pattern;
+ }
+
+ @Override
+ public FilterConfiguration create() {
+ if (enabled) {
+ return new JmxSerialFilterConfiguration(PROPERTY_NAME, pattern);
+ }
+ return () -> false;
+ }
+}
diff --git a/geode-serialization/src/main/resources/org/apache/geode/internal/serialization/sanctioned-geode-serialization-serializables.txt b/geode-serialization/src/main/resources/org/apache/geode/internal/serialization/sanctioned-geode-serialization-serializables.txt
index 4e9c598..3133970 100644
--- a/geode-serialization/src/main/resources/org/apache/geode/internal/serialization/sanctioned-geode-serialization-serializables.txt
+++ b/geode-serialization/src/main/resources/org/apache/geode/internal/serialization/sanctioned-geode-serialization-serializables.txt
@@ -1,3 +1,4 @@
org/apache/geode/internal/serialization/DSCODE,false,value:byte
org/apache/geode/internal/serialization/DSFIDNotFoundException,true,130596009484324655,dsfid:int,versionOrdinal:short
org/apache/geode/internal/serialization/UnsupportedSerializationVersionException,true,3572445857994216007
+org/apache/geode/internal/serialization/filter/ApiPackage,false,prefix:java/lang/String
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/SerializationDependenciesTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/SerializationDependenciesTest.java
index 3806564..4dfb4c5 100644
--- a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/SerializationDependenciesTest.java
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/SerializationDependenciesTest.java
@@ -43,7 +43,7 @@ public class SerializationDependenciesTest {
resideInAPackage("org.apache.geode.internal.serialization..")
.or(not(resideInAPackage("org.apache.geode..")))
.or(resideInAPackage("org.apache.geode.annotations.."))
- .or(resideInAPackage("org.apache.geode.internal.lang.utils.."))
+ .or(resideInAPackage("org.apache.geode.internal.lang.."))
.or(resideInAPackage("org.apache.geode.logging.internal.log4j.api.."))
.or(resideInAPackage("org.apache.geode.test..")));
}
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ApiPackageTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ApiPackageTest.java
new file mode 100644
index 0000000..19c159b
--- /dev/null
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ApiPackageTest.java
@@ -0,0 +1,61 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static org.apache.geode.internal.serialization.filter.ApiPackage.JAVA_IO;
+import static org.apache.geode.internal.serialization.filter.ApiPackage.SUN_MISC;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.catchThrowable;
+
+import org.junit.Test;
+
+public class ApiPackageTest {
+
+ @Test
+ public void JAVA_IO_prefix() {
+ assertThat(JAVA_IO.getPrefix()).isEqualTo("java.io.");
+ }
+
+ @Test
+ public void SUN_MISC_prefix() {
+ assertThat(SUN_MISC.getPrefix()).isEqualTo("sun.misc.");
+ }
+
+ @Test
+ public void qualifyEmptyStringEqualsPrefix() {
+ assertThat(JAVA_IO.qualify("")).isEqualTo(JAVA_IO.getPrefix());
+ }
+
+ @Test
+ public void qualifyNullStringThrowsNullPointerException() {
+ Throwable thrown = catchThrowable(() -> {
+ JAVA_IO.qualify(null);
+ });
+
+ assertThat(thrown)
+ .isInstanceOf(NullPointerException.class)
+ .hasMessage("className is required");
+ }
+
+ @Test
+ public void qualifyReturnsPrefixedClassName() {
+ ApiPackage apiPackage = JAVA_IO;
+ String className = "className";
+
+ String qualifiedClassName = apiPackage.qualify(className);
+
+ assertThat(qualifiedClassName).isEqualTo(apiPackage.getPrefix() + className);
+ }
+}
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterConfigurationTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterConfigurationTest.java
new file mode 100644
index 0000000..a799123
--- /dev/null
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterConfigurationTest.java
@@ -0,0 +1,76 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static org.apache.geode.util.internal.UncheckedUtils.uncheckedCast;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
+
+import java.util.function.Consumer;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class GlobalSerialFilterConfigurationTest {
+
+ private SerializableObjectConfig config;
+ private GlobalSerialFilter globalSerialFilter;
+ private Consumer<String> logger;
+
+ @Before
+ public void setUp() {
+ config = mock(SerializableObjectConfig.class);
+ globalSerialFilter = mock(GlobalSerialFilter.class);
+ logger = uncheckedCast(mock(Consumer.class));
+ }
+
+ @Test
+ public void configureLogs_whenUnsupportedOperationExceptionIsThrown_withCause() {
+ doThrow(new UnsupportedOperationException(
+ new IllegalStateException("Serial filter can only be set once")))
+ .when(globalSerialFilter).setFilter();
+ FilterConfiguration filterConfiguration = new GlobalSerialFilterConfiguration(
+ config, logger, (pattern, sanctionedClasses) -> globalSerialFilter);
+
+ filterConfiguration.configure();
+
+ verify(logger).accept("Global serial filter is already configured.");
+ }
+
+ @Test
+ public void configureDoesNotLog_whenUnsupportedOperationExceptionIsThrown_withoutCause() {
+ doThrow(new UnsupportedOperationException("testing with no root cause"))
+ .when(globalSerialFilter).setFilter();
+ FilterConfiguration filterConfiguration = new GlobalSerialFilterConfiguration(
+ config, logger, (pattern, sanctionedClasses) -> globalSerialFilter);
+
+ filterConfiguration.configure();
+
+ verifyZeroInteractions(logger);
+ }
+
+ @Test
+ public void configureSetsValidateSerializableObjects() {
+ SerializableObjectConfig serializableObjectConfig = mock(SerializableObjectConfig.class);
+ FilterConfiguration filterConfiguration =
+ new GlobalSerialFilterConfiguration(serializableObjectConfig);
+
+ filterConfiguration.configure();
+
+ verify(serializableObjectConfig).setValidateSerializableObjects(true);
+ }
+}
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/JmxSerialFilterConfigurationFactoryTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/JmxSerialFilterConfigurationFactoryTest.java
new file mode 100644
index 0000000..e7e72f6
--- /dev/null
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/JmxSerialFilterConfigurationFactoryTest.java
@@ -0,0 +1,65 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static org.apache.commons.lang3.JavaVersion.JAVA_1_8;
+import static org.apache.commons.lang3.JavaVersion.JAVA_9;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtMost;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assumptions.assumeThat;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.contrib.java.lang.system.RestoreSystemProperties;
+
+public class JmxSerialFilterConfigurationFactoryTest {
+
+ @Rule
+ public RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties();
+
+ @Test
+ public void createsConditionalJmxSerialFilterConfiguration_onJava9orGreater() {
+ assumeThat(isJavaVersionAtLeast(JAVA_9)).isTrue();
+ JmxSerialFilterConfigurationFactory factory =
+ new SystemPropertyJmxSerialFilterConfigurationFactory();
+
+ FilterConfiguration filterConfiguration = factory.create();
+
+ assertThat(filterConfiguration).isInstanceOf(JmxSerialFilterConfiguration.class);
+ }
+
+ @Test
+ public void createsNoOp_onJava8() {
+ assumeThat(isJavaVersionAtMost(JAVA_1_8)).isTrue();
+ JmxSerialFilterConfigurationFactory factory =
+ new SystemPropertyJmxSerialFilterConfigurationFactory();
+
+ FilterConfiguration filterConfiguration = factory.create();
+
+ assertThat(filterConfiguration).isNotInstanceOf(JmxSerialFilterConfiguration.class);
+ }
+
+ @Test
+ public void createsNoOp_whenJmxSerialFilter_isSet() {
+ System.setProperty("jmx.remote.rmi.server.serial.filter.pattern", "*");
+ JmxSerialFilterConfigurationFactory factory =
+ new SystemPropertyJmxSerialFilterConfigurationFactory();
+
+ FilterConfiguration filterConfiguration = factory.create();
+
+ assertThat(filterConfiguration).isNotInstanceOf(JmxSerialFilterConfiguration.class);
+ }
+}
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/JmxSerialFilterConfigurationTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/JmxSerialFilterConfigurationTest.java
new file mode 100644
index 0000000..ad05630
--- /dev/null
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/JmxSerialFilterConfigurationTest.java
@@ -0,0 +1,155 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static org.apache.geode.util.internal.UncheckedUtils.uncheckedCast;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import java.util.function.Consumer;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.contrib.java.lang.system.RestoreSystemProperties;
+
+public class JmxSerialFilterConfigurationTest {
+
+ private static final String SYSTEM_PROPERTY = "system.property.name";
+
+ private String pattern;
+ private Consumer<String> loggerConsumer;
+
+ @Rule
+ public RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties();
+
+ @Before
+ public void setUp() {
+ pattern = "the-filter-pattern";
+ loggerConsumer = uncheckedCast(mock(Consumer.class));
+ }
+
+ @Test
+ public void propertyValue_isNullByDefault() {
+ assertThat(System.getProperty(SYSTEM_PROPERTY))
+ .as(SYSTEM_PROPERTY)
+ .isNull();
+ }
+
+ @Test
+ public void setsPropertyValue() {
+ FilterConfiguration filterConfiguration =
+ new JmxSerialFilterConfiguration(SYSTEM_PROPERTY, pattern);
+
+ filterConfiguration.configure();
+
+ assertThat(System.getProperty(SYSTEM_PROPERTY))
+ .as(SYSTEM_PROPERTY)
+ .isNotEmpty();
+ }
+
+ @Test
+ public void setsPropertyValue_ifExistingValueIsNull() {
+ System.clearProperty(SYSTEM_PROPERTY);
+ FilterConfiguration filterConfiguration =
+ new JmxSerialFilterConfiguration(SYSTEM_PROPERTY, pattern);
+
+ filterConfiguration.configure();
+
+ assertThat(System.getProperty(SYSTEM_PROPERTY))
+ .as(SYSTEM_PROPERTY)
+ .isEqualTo(pattern);
+ }
+
+ @Test
+ public void setsPropertyValue_ifExistingValueIsEmpty() {
+ System.setProperty(SYSTEM_PROPERTY, "");
+ FilterConfiguration filterConfiguration =
+ new JmxSerialFilterConfiguration(SYSTEM_PROPERTY, pattern);
+
+ filterConfiguration.configure();
+
+ assertThat(System.getProperty(SYSTEM_PROPERTY))
+ .as(SYSTEM_PROPERTY)
+ .isEqualTo(pattern);
+ }
+
+ @Test
+ public void setsPropertyValue_ifExistingValueIsBlank() {
+ System.setProperty(SYSTEM_PROPERTY, " ");
+ FilterConfiguration filterConfiguration =
+ new JmxSerialFilterConfiguration(SYSTEM_PROPERTY, pattern);
+
+ filterConfiguration.configure();
+
+ assertThat(System.getProperty(SYSTEM_PROPERTY))
+ .as(SYSTEM_PROPERTY)
+ .isEqualTo(pattern);
+ }
+
+ @Test
+ public void logsNowConfigured_ifExistingValueIsEmpty() {
+ System.setProperty(SYSTEM_PROPERTY, "");
+ FilterConfiguration filterConfiguration =
+ new JmxSerialFilterConfiguration(SYSTEM_PROPERTY, pattern, loggerConsumer);
+
+ filterConfiguration.configure();
+
+ verify(loggerConsumer)
+ .accept("System property '" + SYSTEM_PROPERTY + "' is now configured with '" +
+ pattern + "'.");
+ }
+
+ @Test
+ public void logsNowConfigured_ifExistingValueIsBlank() {
+ System.setProperty(SYSTEM_PROPERTY, " ");
+ FilterConfiguration filterConfiguration =
+ new JmxSerialFilterConfiguration(SYSTEM_PROPERTY, pattern, loggerConsumer);
+
+ filterConfiguration.configure();
+
+ verify(loggerConsumer)
+ .accept("System property '" + SYSTEM_PROPERTY + "' is now configured with '" +
+ pattern + "'.");
+ }
+
+ @Test
+ public void doesNotSetPropertyValue_ifExistingValueIsNotEmpty() {
+ String existingValue = "existing-value-of-property";
+ System.setProperty(SYSTEM_PROPERTY, existingValue);
+ FilterConfiguration filterConfiguration =
+ new JmxSerialFilterConfiguration(SYSTEM_PROPERTY, pattern);
+
+ filterConfiguration.configure();
+
+ assertThat(System.getProperty(SYSTEM_PROPERTY))
+ .as(SYSTEM_PROPERTY)
+ .isEqualTo(existingValue);
+ }
+
+ @Test
+ public void logsAlreadyConfiguredMessage_ifExistingPropertyValueIsNotEmpty() {
+ String existingValue = "existing-value-of-property";
+ System.setProperty(SYSTEM_PROPERTY, existingValue);
+ FilterConfiguration filterConfiguration =
+ new JmxSerialFilterConfiguration(SYSTEM_PROPERTY, pattern, loggerConsumer);
+
+ filterConfiguration.configure();
+
+ verify(loggerConsumer)
+ .accept("System property '" + SYSTEM_PROPERTY + "' is already configured.");
+ }
+}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesService.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/NullObjectInputFilterTest.java
similarity index 65%
copy from geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesService.java
copy to geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/NullObjectInputFilterTest.java
index 1d139ce..9a0b386 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesService.java
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/NullObjectInputFilterTest.java
@@ -14,20 +14,22 @@
*/
package org.apache.geode.internal.serialization.filter;
-import java.io.IOException;
-import java.net.URL;
-import java.util.Collection;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verifyZeroInteractions;
-@FunctionalInterface
-public interface SanctionedSerializablesService {
+import java.io.ObjectInputStream;
- URL getSanctionedSerializablesURL();
+import org.junit.Test;
- default Class<?> getInterface() {
- return getClass();
- }
+public class NullObjectInputFilterTest {
+
+ @Test
+ public void doesNothing() {
+ ObjectInputStream objectInputStream = mock(ObjectInputStream.class);
+ ObjectInputFilter filter = new NullObjectInputFilter();
+
+ filter.setFilterOn(objectInputStream);
- default Collection<String> getSerializationAcceptlist() throws IOException {
- return SanctionedSerializables.loadClassNames(getSanctionedSerializablesURL());
+ verifyZeroInteractions(objectInputStream);
}
}
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterUtilsTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterUtilsTest.java
new file mode 100644
index 0000000..fc0d480
--- /dev/null
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterUtilsTest.java
@@ -0,0 +1,94 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static org.apache.commons.lang3.JavaVersion.JAVA_1_8;
+import static org.apache.commons.lang3.JavaVersion.JAVA_9;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtMost;
+import static org.apache.geode.internal.serialization.filter.ObjectInputFilterUtils.supportsObjectInputFilter;
+import static org.apache.geode.util.internal.UncheckedUtils.uncheckedCast;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assumptions.assumeThat;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.function.Function;
+
+import org.junit.Test;
+
+public class ObjectInputFilterUtilsTest {
+
+ @Test
+ public void supportsObjectInputFilter_delegatesToClassUtils() {
+ Function<String, Boolean> isClassAvailable = uncheckedCast(mock(Function.class));
+ when(isClassAvailable.apply(anyString())).thenReturn(true);
+
+ supportsObjectInputFilter(isClassAvailable);
+
+ verify(isClassAvailable).apply(anyString());
+ }
+
+ @Test
+ public void supportsObjectInputFilter_checksSunMisc() {
+ Function<String, Boolean> isClassAvailable = uncheckedCast(mock(Function.class));
+ when(isClassAvailable.apply(anyString())).thenReturn(false);
+
+ supportsObjectInputFilter(isClassAvailable);
+
+ verify(isClassAvailable).apply("sun.misc.ObjectInputFilter");
+ }
+
+ @Test
+ public void supportsObjectInputFilter_checksJavaIo() {
+ Function<String, Boolean> isClassAvailable = uncheckedCast(mock(Function.class));
+ when(isClassAvailable.apply(anyString())).thenReturn(false);
+
+ supportsObjectInputFilter(isClassAvailable);
+
+ verify(isClassAvailable).apply("java.io.ObjectInputFilter");
+ }
+
+ @Test
+ public void supportsObjectInputFilter_checksSunMiscAndJavaIo() {
+ Function<String, Boolean> isClassAvailable = uncheckedCast(mock(Function.class));
+ when(isClassAvailable.apply(anyString())).thenReturn(false);
+
+ supportsObjectInputFilter(isClassAvailable);
+
+ verify(isClassAvailable).apply("sun.misc.ObjectInputFilter");
+ verify(isClassAvailable).apply("java.io.ObjectInputFilter");
+ }
+
+ @Test
+ public void supportsObjectInputFilter_returnsTrue_onJava8() {
+ assumeThat(isJavaVersionAtMost(JAVA_1_8)).isTrue();
+
+ boolean result = supportsObjectInputFilter();
+
+ assertThat(result).isTrue();
+ }
+
+ @Test
+ public void supportsObjectInputFilter_returnsTrue_onJava9orGreater() {
+ assumeThat(isJavaVersionAtLeast(JAVA_9)).isTrue();
+
+ boolean result = supportsObjectInputFilter();
+
+ assertThat(result).isTrue();
+ }
+}
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/OpenMBeanFilterPatternTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/OpenMBeanFilterPatternTest.java
new file mode 100644
index 0000000..bfb8809
--- /dev/null
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/OpenMBeanFilterPatternTest.java
@@ -0,0 +1,142 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.rmi.MarshalledObject;
+
+import javax.management.ObjectName;
+import javax.management.openmbean.ArrayType;
+import javax.management.openmbean.CompositeData;
+import javax.management.openmbean.CompositeType;
+import javax.management.openmbean.SimpleType;
+import javax.management.openmbean.TabularData;
+import javax.management.openmbean.TabularType;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class OpenMBeanFilterPatternTest {
+
+ private String defaultPattern;
+
+ @Before
+ public void setUp() {
+ defaultPattern = new OpenMBeanFilterPattern().pattern();
+ }
+
+ @Test
+ public void includesBoolean() {
+ assertThat(defaultPattern).contains(Boolean.class.getName());
+ }
+
+ @Test
+ public void includesByte() {
+ assertThat(defaultPattern).contains(Byte.class.getName());
+ }
+
+ @Test
+ public void includesCharacter() {
+ assertThat(defaultPattern).contains(Character.class.getName());
+ }
+
+ @Test
+ public void includesShort() {
+ assertThat(defaultPattern).contains(Short.class.getName());
+ }
+
+ @Test
+ public void includesInteger() {
+ assertThat(defaultPattern).contains(Integer.class.getName());
+ }
+
+ @Test
+ public void includesLong() {
+ assertThat(defaultPattern).contains(Long.class.getName());
+ }
+
+ @Test
+ public void includesFloat() {
+ assertThat(defaultPattern).contains(Float.class.getName());
+ }
+
+ @Test
+ public void includesDouble() {
+ assertThat(defaultPattern).contains(Double.class.getName());
+ }
+
+ @Test
+ public void includesString() {
+ assertThat(defaultPattern).contains(String.class.getName());
+ }
+
+ @Test
+ public void includesBigInteger() {
+ assertThat(defaultPattern).contains(BigInteger.class.getName());
+ }
+
+ @Test
+ public void includesBigDecimal() {
+ assertThat(defaultPattern).contains(BigDecimal.class.getName());
+ }
+
+ @Test
+ public void includesObjectName() {
+ assertThat(defaultPattern).contains(ObjectName.class.getName());
+ }
+
+ @Test
+ public void includesCompositeData() {
+ assertThat(defaultPattern).contains(CompositeData.class.getName());
+ }
+
+ @Test
+ public void includesTabularData() {
+ assertThat(defaultPattern).contains(TabularData.class.getName());
+ }
+
+ @Test
+ public void includesSimpleType() {
+ assertThat(defaultPattern).contains(SimpleType.class.getName());
+ }
+
+ @Test
+ public void includesCompositeType() {
+ assertThat(defaultPattern).contains(CompositeType.class.getName());
+ }
+
+ @Test
+ public void includesTabularType() {
+ assertThat(defaultPattern).contains(TabularType.class.getName());
+ }
+
+ @Test
+ public void includesArrayType() {
+ assertThat(defaultPattern).contains(ArrayType.class.getName());
+ }
+
+ @Test
+ public void includesMarshalledObject() {
+ assertThat(defaultPattern).contains(MarshalledObject.class.getName());
+ }
+
+ @Test
+ public void rejectsAllOtherTypes() {
+ assertThat(defaultPattern).endsWith(";!*");
+ }
+}
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilterFactoryTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilterFactoryTest.java
new file mode 100644
index 0000000..34c83c4
--- /dev/null
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilterFactoryTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.util.Collections.emptySet;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.junit.Test;
+
+public class ReflectiveFacadeGlobalSerialFilterFactoryTest {
+
+ @Test
+ public void constructsDelegatingGlobalSerialFilter() {
+ ObjectInputFilterApi api = mock(ObjectInputFilterApi.class);
+ GlobalSerialFilterFactory factory = new ReflectiveFacadeGlobalSerialFilterFactory(api);
+
+ GlobalSerialFilter filter = factory.create("pattern", emptySet());
+
+ assertThat(filter).isInstanceOf(ReflectiveFacadeGlobalSerialFilter.class);
+ }
+
+ @Test
+ public void delegatesToObjectInputFilterApiToCreateObjectInputFilter()
+ throws InvocationTargetException, IllegalAccessException {
+ ObjectInputFilterApi api = mock(ObjectInputFilterApi.class);
+ GlobalSerialFilterFactory factory = new ReflectiveFacadeGlobalSerialFilterFactory(api);
+ GlobalSerialFilter filter = factory.create("pattern", emptySet());
+ Object objectInputFilter = mock(Object.class);
+
+ when(api.createObjectInputFilterProxy(any(), any()))
+ .thenReturn(objectInputFilter);
+
+ filter.setFilter();
+
+ verify(api).createObjectInputFilterProxy(any(), any());
+ }
+
+ @Test
+ public void delegatesToObjectInputFilterApiToSetSerialFilter()
+ throws InvocationTargetException, IllegalAccessException {
+ ObjectInputFilterApi api = mock(ObjectInputFilterApi.class);
+ GlobalSerialFilterFactory factory = new ReflectiveFacadeGlobalSerialFilterFactory(api);
+ GlobalSerialFilter filter = factory.create("pattern", emptySet());
+ Object objectInputFilter = mock(Object.class);
+
+ when(api.createObjectInputFilterProxy(any(), any()))
+ .thenReturn(objectInputFilter);
+
+ filter.setFilter();
+
+ verify(api).setSerialFilter(objectInputFilter);
+ }
+}
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilterTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilterTest.java
new file mode 100644
index 0000000..5966d1b
--- /dev/null
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilterTest.java
@@ -0,0 +1,104 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.util.Arrays.asList;
+import static java.util.Collections.singleton;
+import static org.apache.geode.util.internal.UncheckedUtils.uncheckedCast;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.catchThrowable;
+import static org.mockito.ArgumentCaptor.forClass;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collection;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+
+public class ReflectiveFacadeGlobalSerialFilterTest {
+
+ private ObjectInputFilterApi api;
+
+ @Before
+ public void setUp() {
+ api = mock(ObjectInputFilterApi.class);
+ }
+
+ @Test
+ public void createsObjectInputFilterProxy()
+ throws InvocationTargetException, IllegalAccessException {
+ String pattern = "the-pattern";
+ Collection<String> sanctionedClasses = asList("class-name-one", "class-name-two");
+ GlobalSerialFilter globalSerialFilter =
+ new ReflectiveFacadeGlobalSerialFilter(api, pattern, sanctionedClasses);
+
+ globalSerialFilter.setFilter();
+
+ ArgumentCaptor<Collection<String>> captor = uncheckedCast(forClass(Collection.class));
+ verify(api).createObjectInputFilterProxy(eq(pattern), captor.capture());
+ assertThat(captor.getValue()).containsExactlyElementsOf(sanctionedClasses);
+ }
+
+ @Test
+ public void setsSerialFilter() throws InvocationTargetException, IllegalAccessException {
+ GlobalSerialFilter globalSerialFilter =
+ new ReflectiveFacadeGlobalSerialFilter(api, "the-pattern", singleton("class-name"));
+
+ globalSerialFilter.setFilter();
+
+ verify(api).setSerialFilter(any());
+ }
+
+ @Test
+ public void propagatesIllegalAccessExceptionInUnsupportedOperationException()
+ throws InvocationTargetException, IllegalAccessException {
+ IllegalAccessException exception = new IllegalAccessException("testing");
+ doThrow(exception).when(api).setSerialFilter(any());
+ GlobalSerialFilter globalSerialFilter =
+ new ReflectiveFacadeGlobalSerialFilter(api, "the-pattern", singleton("class-name"));
+
+ Throwable thrown = catchThrowable(() -> {
+ globalSerialFilter.setFilter();
+ });
+
+ assertThat(thrown)
+ .isInstanceOf(UnsupportedOperationException.class)
+ .hasRootCause(exception);
+ }
+
+ @Test
+ public void propagatesInvocationTargetExceptionInUnsupportedOperationException()
+ throws InvocationTargetException, IllegalAccessException {
+ InvocationTargetException exception =
+ new InvocationTargetException(new Exception("testing"), "testing");
+ doThrow(exception).when(api).setSerialFilter(any());
+ GlobalSerialFilter globalSerialFilter =
+ new ReflectiveFacadeGlobalSerialFilter(api, "the-pattern", singleton("class-name"));
+
+ Throwable thrown = catchThrowable(() -> {
+ globalSerialFilter.setFilter();
+ });
+
+ assertThat(thrown)
+ .isInstanceOf(UnsupportedOperationException.class)
+ .hasCause(exception);
+ }
+}
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeObjectInputFilterFactoryTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeObjectInputFilterFactoryTest.java
new file mode 100644
index 0000000..e35b5bd
--- /dev/null
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeObjectInputFilterFactoryTest.java
@@ -0,0 +1,84 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.util.Collections.emptySet;
+import static org.apache.commons.lang3.JavaVersion.JAVA_1_8;
+import static org.apache.commons.lang3.JavaVersion.JAVA_9;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtMost;
+import static org.apache.geode.internal.serialization.filter.ApiPackage.JAVA_IO;
+import static org.apache.geode.internal.serialization.filter.ApiPackage.SUN_MISC;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assumptions.assumeThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.Set;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class ReflectiveFacadeObjectInputFilterFactoryTest {
+
+ private static final Set<String> SANCTIONED_CLASSES = emptySet();
+
+ private SerializableObjectConfig config;
+
+ @Before
+ public void setUp() {
+ config = mock(SerializableObjectConfig.class);
+ when(config.getValidateSerializableObjects()).thenReturn(true);
+ }
+
+ @Test
+ public void createsJava9InputStreamFilter_onJava9orGreater() {
+ assumeThat(isJavaVersionAtLeast(JAVA_9)).isTrue();
+
+ // arrange
+ ObjectInputFilterFactory factory = new ReflectiveFacadeObjectInputFilterFactory();
+
+ // act
+ ObjectInputFilter objectInputFilter = factory.create(config, SANCTIONED_CLASSES);
+
+ // assert
+ assertThat(getApiPackage(getObjectInputFilterApi(objectInputFilter))).isEqualTo(JAVA_IO);
+ }
+
+ @Test
+ public void createsJava8InputStreamFilter_onJava8() {
+ assumeThat(isJavaVersionAtMost(JAVA_1_8)).isTrue();
+
+ // arrange
+ ObjectInputFilterFactory factory = new ReflectiveFacadeObjectInputFilterFactory();
+
+ // act
+ ObjectInputFilter objectInputFilter = factory.create(config, SANCTIONED_CLASSES);
+
+ // assert
+ assertThat(getApiPackage(getObjectInputFilterApi(objectInputFilter))).isEqualTo(SUN_MISC);
+ }
+
+ private static ObjectInputFilterApi getObjectInputFilterApi(ObjectInputFilter result) {
+ ReflectiveFacadeObjectInputFilter impl = (ReflectiveFacadeObjectInputFilter) result;
+ ObjectInputFilterApi objectInputFilterApi = impl.getObjectInputFilterApi();
+ assertThat(objectInputFilterApi).isInstanceOf(ReflectiveObjectInputFilterApi.class);
+ return objectInputFilterApi;
+ }
+
+ private static ApiPackage getApiPackage(ObjectInputFilterApi reflectionObjectInputFilterApi) {
+ return ((ReflectiveObjectInputFilterApi) reflectionObjectInputFilterApi).getApiPackage();
+ }
+}
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeObjectInputFilterTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeObjectInputFilterTest.java
new file mode 100644
index 0000000..cca697f
--- /dev/null
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeObjectInputFilterTest.java
@@ -0,0 +1,142 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.util.Arrays.asList;
+import static java.util.Collections.emptySet;
+import static java.util.Collections.singleton;
+import static org.apache.geode.util.internal.UncheckedUtils.uncheckedCast;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.catchThrowable;
+import static org.mockito.ArgumentCaptor.forClass;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.same;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.io.ObjectInputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collection;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+
+public class ReflectiveFacadeObjectInputFilterTest {
+
+ private ObjectInputFilterApi api;
+ private ObjectInputStream objectInputStream;
+
+ @Before
+ public void setUp() {
+ api = mock(ObjectInputFilterApi.class);
+ objectInputStream = mock(ObjectInputStream.class);
+ }
+
+ @Test
+ public void createsObjectInputFilterProxy()
+ throws InvocationTargetException, IllegalAccessException {
+ String pattern = "the-pattern";
+ Collection<String> sanctionedClasses = asList("class-name-one", "class-name-two");
+ ObjectInputFilter objectInputFilter =
+ new ReflectiveFacadeObjectInputFilter(api, pattern, sanctionedClasses);
+
+ objectInputFilter.setFilterOn(objectInputStream);
+
+ ArgumentCaptor<Collection<String>> captor = uncheckedCast(forClass(Collection.class));
+ verify(api).createObjectInputFilterProxy(eq(pattern), captor.capture());
+ assertThat(captor.getValue()).containsExactlyElementsOf(sanctionedClasses);
+ }
+
+ @Test
+ public void setsSerialFilter() throws InvocationTargetException, IllegalAccessException {
+ ObjectInputFilter objectInputFilter =
+ new ReflectiveFacadeObjectInputFilter(api, "the-pattern", singleton("class-name"));
+
+ objectInputFilter.setFilterOn(objectInputStream);
+
+ verify(api).setObjectInputFilter(same(objectInputStream), any());
+ }
+
+ @Test
+ public void propagatesIllegalAccessExceptionInUnsupportedOperationException()
+ throws InvocationTargetException, IllegalAccessException {
+ IllegalAccessException exception = new IllegalAccessException("testing");
+ doThrow(exception).when(api).setObjectInputFilter(same(objectInputStream), any());
+ ObjectInputFilter objectInputFilter =
+ new ReflectiveFacadeObjectInputFilter(api, "the-pattern", singleton("class-name"));
+
+ Throwable thrown = catchThrowable(() -> {
+ objectInputFilter.setFilterOn(objectInputStream);
+ });
+
+ assertThat(thrown)
+ .isInstanceOf(UnsupportedOperationException.class)
+ .hasRootCause(exception);
+ }
+
+ @Test
+ public void propagatesInvocationTargetExceptionInUnsupportedOperationException()
+ throws InvocationTargetException, IllegalAccessException {
+ InvocationTargetException exception =
+ new InvocationTargetException(new Exception("testing"), "testing");
+ doThrow(exception).when(api).setObjectInputFilter(same(objectInputStream), any());
+ ObjectInputFilter objectInputFilter =
+ new ReflectiveFacadeObjectInputFilter(api, "the-pattern", singleton("class-name"));
+
+ Throwable thrown = catchThrowable(() -> {
+ objectInputFilter.setFilterOn(objectInputStream);
+ });
+
+ assertThat(thrown)
+ .isInstanceOf(UnsupportedOperationException.class)
+ .hasCause(exception);
+ }
+
+ @Test
+ public void delegatesToObjectInputFilterApiToCreateObjectInputFilter()
+ throws InvocationTargetException, IllegalAccessException {
+ ObjectInputFilterApi api = mock(ObjectInputFilterApi.class);
+ ObjectInputFilter filter = new ReflectiveFacadeObjectInputFilter(api, "pattern", emptySet());
+ Object objectInputFilter = mock(Object.class);
+ ObjectInputStream objectInputStream = mock(ObjectInputStream.class);
+
+ when(api.createObjectInputFilterProxy(any(), any()))
+ .thenReturn(objectInputFilter);
+
+ filter.setFilterOn(objectInputStream);
+
+ verify(api).createObjectInputFilterProxy(any(), any());
+ }
+
+ @Test
+ public void delegatesToObjectInputFilterApiToSetFilterOnObjectInputStream()
+ throws InvocationTargetException, IllegalAccessException {
+ ObjectInputFilterApi api = mock(ObjectInputFilterApi.class);
+ ObjectInputFilter filter = new ReflectiveFacadeObjectInputFilter(api, "pattern", emptySet());
+ Object objectInputFilter = mock(Object.class);
+ ObjectInputStream objectInputStream = mock(ObjectInputStream.class);
+
+ when(api.createObjectInputFilterProxy(any(), any()))
+ .thenReturn(objectInputFilter);
+
+ filter.setFilterOn(objectInputStream);
+
+ verify(api).setObjectInputFilter(objectInputStream, objectInputFilter);
+ }
+}
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiFactoryTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiFactoryTest.java
new file mode 100644
index 0000000..b3ac61f
--- /dev/null
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiFactoryTest.java
@@ -0,0 +1,60 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static org.apache.commons.lang3.JavaVersion.JAVA_1_8;
+import static org.apache.commons.lang3.JavaVersion.JAVA_9;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtMost;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assumptions.assumeThat;
+
+import org.junit.Test;
+
+public class ReflectiveObjectInputFilterApiFactoryTest {
+
+ @Test
+ public void createsInstanceOfReflectionObjectInputFilterApi() {
+ ObjectInputFilterApiFactory factory = new ReflectiveObjectInputFilterApiFactory();
+
+ ObjectInputFilterApi api = factory.createObjectInputFilterApi();
+
+ assertThat(api).isInstanceOf(ReflectiveObjectInputFilterApi.class);
+ }
+
+ @Test
+ public void usesJavaIO_inJava9() {
+ assumeThat(isJavaVersionAtLeast(JAVA_9)).isTrue();
+
+ ObjectInputFilterApiFactory factory = new ReflectiveObjectInputFilterApiFactory();
+
+ ReflectiveObjectInputFilterApi api =
+ (ReflectiveObjectInputFilterApi) factory.createObjectInputFilterApi();
+
+ assertThat(api.getApiPackage()).isEqualTo(ApiPackage.JAVA_IO);
+ }
+
+ @Test
+ public void usesSunMisc_inJava8() {
+ assumeThat(isJavaVersionAtMost(JAVA_1_8)).isTrue();
+
+ ObjectInputFilterApiFactory factory = new ReflectiveObjectInputFilterApiFactory();
+
+ ReflectiveObjectInputFilterApi api =
+ (ReflectiveObjectInputFilterApi) factory.createObjectInputFilterApi();
+
+ assertThat(api.getApiPackage()).isEqualTo(ApiPackage.SUN_MISC);
+ }
+}
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiTest.java
new file mode 100644
index 0000000..8cf1f8c
--- /dev/null
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiTest.java
@@ -0,0 +1,223 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.util.Collections.emptyList;
+import static java.util.Collections.singleton;
+import static java.util.Objects.hash;
+import static java.util.Objects.requireNonNull;
+import static org.apache.commons.lang3.JavaVersion.JAVA_1_8;
+import static org.apache.commons.lang3.JavaVersion.JAVA_9;
+import static org.apache.commons.lang3.SerializationUtils.serialize;
+import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.catchThrowable;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InvalidClassException;
+import java.io.ObjectInputStream;
+import java.io.Serializable;
+import java.lang.reflect.InvocationTargetException;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class ReflectiveObjectInputFilterApiTest {
+
+ private ObjectInputFilterApi api;
+
+ @Before
+ public void setUp() throws ClassNotFoundException, NoSuchMethodException {
+ if (isJavaVersionAtLeast(JAVA_9)) {
+ api = new Java9ReflectiveObjectInputFilterApi(ApiPackage.JAVA_IO);
+ } else if (isJavaVersionAtLeast(JAVA_1_8)) {
+ api = new ReflectiveObjectInputFilterApi(ApiPackage.SUN_MISC);
+ }
+ }
+
+ @Test
+ public void createFilterGivenValidPatternReturnsNewFilter()
+ throws IllegalAccessException, InvocationTargetException {
+
+ Object filter = api.createFilter("!*");
+
+ assertThat(filter)
+ .as("ObjectInputFilter$Config.createFilter(\"!*\")")
+ .isNotNull()
+ .isInstanceOf(api.getObjectInputFilterClass());
+ }
+
+ @Test
+ public void createFilterGivenEmptyPatternReturnsNull()
+ throws IllegalAccessException, InvocationTargetException {
+
+ Object filter = api.createFilter("");
+
+ assertThat(filter)
+ .as("ObjectInputFilter$Config.createFilter(\"\")")
+ .isNull();
+ }
+
+ @Test
+ public void createFilterGivenBlankPatternReturnsNewFilter()
+ throws IllegalAccessException, InvocationTargetException {
+
+ Object filter = api.createFilter(" ");
+
+ assertThat(filter)
+ .as("ObjectInputFilter$Config.createFilter(\" \")")
+ .isNotNull()
+ .isInstanceOf(api.getObjectInputFilterClass());
+ }
+
+ @Test
+ public void getSerialFilterReturnsNullWhenFilterDoesNotExist()
+ throws IllegalAccessException, InvocationTargetException {
+
+ Object filter = api.getSerialFilter();
+
+ assertThat(filter)
+ .as("ObjectInputFilter$Config.getSerialFilter()")
+ .isNull();
+ }
+
+ @Test
+ public void getObjectInputFilterReturnsNullWhenFilterDoesNotExist()
+ throws IllegalAccessException, InvocationTargetException, IOException {
+ Serializable object = "hello";
+ ObjectInputStream inputStream = new ObjectInputStream(byteArrayInputStream(object));
+
+ Object filter = api.getObjectInputFilter(inputStream);
+
+ assertThat(filter).isNull();
+ }
+
+ @Test
+ public void getObjectInputFilterReturnsExistingFilter()
+ throws IllegalAccessException, InvocationTargetException, IOException {
+ Object existingFilter = api.createFilter("*");
+ Serializable object = "hello";
+ ObjectInputStream inputStream = new ObjectInputStream(byteArrayInputStream(object));
+ api.setObjectInputFilter(inputStream, existingFilter);
+
+ Object filter = api.getObjectInputFilter(inputStream);
+
+ assertThat(filter).isSameAs(existingFilter);
+ }
+
+ @Test
+ public void setObjectInputFilterGivenAcceptFilterReadsObject()
+ throws ClassNotFoundException, IllegalAccessException, InvocationTargetException,
+ IOException {
+ Serializable object = new SerializableClass("hello");
+ Object filter = api.createFilter(object.getClass().getName() + ";!*");
+
+ try (ObjectInputStream inputStream = new ObjectInputStream(byteArrayInputStream(object))) {
+ api.setObjectInputFilter(inputStream, filter);
+
+ assertThat(inputStream.readObject()).isEqualTo(object);
+ }
+ }
+
+ @Test
+ public void setObjectInputFilterGivenDenyFilterThrowsInvalidClassException()
+ throws IllegalAccessException, InvocationTargetException, IOException {
+ Serializable object = new SerializableClass("hello");
+ Object filter = api.createFilter("!" + object.getClass().getName());
+
+ try (ObjectInputStream inputStream = new ObjectInputStream(byteArrayInputStream(object))) {
+ api.setObjectInputFilter(inputStream, filter);
+
+ Throwable thrown = catchThrowable(() -> {
+ assertThat(inputStream.readObject()).isEqualTo(object);
+ });
+
+ assertThat(thrown).isInstanceOf(InvalidClassException.class);
+ }
+ }
+
+ @Test
+ public void createObjectInputFilterProxyGivenAcceptFilterReadsObject()
+ throws ClassNotFoundException, IllegalAccessException, InvocationTargetException,
+ IOException {
+ Serializable object = new SerializableClass("hello");
+ String className = object.getClass().getName();
+ Object filter = api.createObjectInputFilterProxy(className + ";!*", singleton(className));
+
+ try (ObjectInputStream inputStream = new ObjectInputStream(byteArrayInputStream(object))) {
+ api.setObjectInputFilter(inputStream, filter);
+
+ assertThat(inputStream.readObject()).isEqualTo(object);
+ }
+ }
+
+ @Test
+ public void createObjectInputFilterProxyGivenRejectFilterThrowsInvalidClassException()
+ throws IllegalAccessException, InvocationTargetException, IOException {
+ Serializable object = new SerializableClass("hello");
+ String className = object.getClass().getName();
+ Object filter = api.createObjectInputFilterProxy("!" + className + ";*", emptyList());
+
+ try (ObjectInputStream inputStream = new ObjectInputStream(byteArrayInputStream(object))) {
+ api.setObjectInputFilter(inputStream, filter);
+
+ Throwable thrown = catchThrowable(() -> {
+ assertThat(inputStream.readObject()).isEqualTo(object);
+ });
+
+ assertThat(thrown).isInstanceOf(InvalidClassException.class);
+ }
+ }
+
+ private static ByteArrayInputStream byteArrayInputStream(Serializable object) {
+ return new ByteArrayInputStream(serialize(object));
+ }
+
+ private static class SerializableClass implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ private final String value;
+
+ private SerializableClass(String value) {
+ this.value = requireNonNull(value);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ SerializableClass that = (SerializableClass) o;
+ return value.equals(that.value);
+ }
+
+ @Override
+ public int hashCode() {
+ return hash(value);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder("SerializableClass{");
+ sb.append("value='").append(value).append('\'');
+ sb.append('}');
+ return sb.toString();
+ }
+ }
+}
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesFilterPatternTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesFilterPatternTest.java
new file mode 100644
index 0000000..177e2c9
--- /dev/null
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SanctionedSerializablesFilterPatternTest.java
@@ -0,0 +1,206 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.StringJoiner;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class SanctionedSerializablesFilterPatternTest {
+
+ private String defaultPattern;
+
+ @Before
+ public void setUp() {
+ defaultPattern = new SanctionedSerializablesFilterPattern().pattern();
+ }
+
+ @Test
+ public void includesJavaWithSubpackages() {
+ assertThat(defaultPattern).contains("java.**");
+ }
+
+ @Test
+ public void includesJavaxManagementWithSubpackages() {
+ assertThat(defaultPattern).contains("javax.management.**");
+ }
+
+ @Test
+ public void includesEnumSyntax() {
+ assertThat(defaultPattern).contains("javax.print.attribute.EnumSyntax");
+ }
+
+ @Test
+ public void includesAntlrWithSubpackages() {
+ assertThat(defaultPattern).contains("antlr.**");
+ }
+
+ @Test
+ public void includesCommonsModelerAttributeInfo() {
+ assertThat(defaultPattern).contains("org.apache.commons.modeler.AttributeInfo");
+ }
+
+ @Test
+ public void includesCommonsModelerFeatureInfo() {
+ assertThat(defaultPattern).contains("org.apache.commons.modeler.FeatureInfo");
+ }
+
+ @Test
+ public void includesCommonsModelerManagedBean() {
+ assertThat(defaultPattern).contains("org.apache.commons.modeler.ManagedBean");
+ }
+
+ @Test
+ public void includesDistributionConfigSnapshot() {
+ assertThat(defaultPattern)
+ .contains("org.apache.geode.distributed.internal.DistributionConfigSnapshot");
+ }
+
+ @Test
+ public void includesRuntimeDistributionConfigImpl() {
+ assertThat(defaultPattern)
+ .contains("org.apache.geode.distributed.internal.RuntimeDistributionConfigImpl");
+ }
+
+ @Test
+ public void includesDistributionConfigImpl() {
+ assertThat(defaultPattern)
+ .contains("org.apache.geode.distributed.internal.DistributionConfigImpl");
+ }
+
+ @Test
+ public void includesInternalDistributedMember() {
+ assertThat(defaultPattern)
+ .contains("org.apache.geode.distributed.internal.membership.InternalDistributedMember");
+ }
+
+ @Test
+ public void includesPersistentMemberID() {
+ assertThat(defaultPattern)
+ .contains("org.apache.geode.internal.cache.persistence.PersistentMemberID");
+ }
+
+ @Test
+ public void includesDiskStoreID() {
+ assertThat(defaultPattern).contains("org.apache.geode.internal.cache.persistence.DiskStoreID");
+ }
+
+ @Test
+ public void includesVersionedObjectList() {
+ assertThat(defaultPattern)
+ .contains("org.apache.geode.internal.cache.tier.sockets.VersionedObjectList");
+ }
+
+ @Test
+ public void includesShiroPackage() {
+ assertThat(defaultPattern).contains("org.apache.shiro.**");
+ }
+
+ @Test
+ public void includesLog4jLevel() {
+ assertThat(defaultPattern).contains("org.apache.logging.log4j.Level");
+ }
+
+ @Test
+ public void includesLog4jStandardLevel() {
+ assertThat(defaultPattern).contains("org.apache.logging.log4j.spi.StandardLevel");
+ }
+
+ @Test
+ public void includesSunProxy() {
+ assertThat(defaultPattern).contains("com.sun.proxy.$Proxy*");
+ }
+
+ @Test
+ public void includesRmiioRemoteInputStream() {
+ assertThat(defaultPattern).contains("com.healthmarketscience.rmiio.RemoteInputStream");
+ }
+
+ @Test
+ public void includesSslRMIClientSocketFactory() {
+ assertThat(defaultPattern).contains("javax.rmi.ssl.SslRMIClientSocketFactory");
+ }
+
+ @Test
+ public void includesSSLHandshakeException() {
+ assertThat(defaultPattern).contains("javax.net.ssl.SSLHandshakeException");
+ }
+
+ @Test
+ public void includesSSLException() {
+ assertThat(defaultPattern).contains("javax.net.ssl.SSLException");
+ }
+
+ @Test
+ public void includesSunValidatorException() {
+ assertThat(defaultPattern).contains("sun.security.validator.ValidatorException");
+ }
+
+ @Test
+ public void includesSunSunCertPathBuilderException() {
+ assertThat(defaultPattern)
+ .contains("sun.security.provider.certpath.SunCertPathBuilderException");
+ }
+
+ @Test
+ public void includesSessionCustomExpiry() {
+ assertThat(defaultPattern).contains("org.apache.geode.modules.util.SessionCustomExpiry");
+ }
+
+ @Test
+ public void rejectsAllOtherTypes() {
+ assertThat(defaultPattern).endsWith(";!*");
+ }
+
+ @Test
+ public void appendsToPattern() {
+ String extraToAppend = "extra";
+ String pattern = new SanctionedSerializablesFilterPattern()
+ .append(extraToAppend)
+ .pattern();
+
+ assertThat(pattern).contains(extraToAppend);
+ }
+
+ @Test
+ public void appendsJustBeforeRejectPattern() {
+ String extraToAppend = "extra";
+ String pattern = new SanctionedSerializablesFilterPattern()
+ .append(extraToAppend)
+ .pattern();
+
+ String expectedEnd = new StringJoiner(";")
+ .add(extraToAppend)
+ .add("!*")
+ .toString();
+
+ assertThat(pattern).endsWith(expectedEnd);
+ }
+
+ @Test
+ public void patternReturnsSameValueMultipleTimes() {
+ FilterPattern sanctionedSerializablesFilterPattern =
+ new SanctionedSerializablesFilterPattern();
+ String expectedPattern = sanctionedSerializablesFilterPattern
+ .pattern();
+
+ assertThat(sanctionedSerializablesFilterPattern.pattern()).isEqualTo(expectedPattern);
+ assertThat(sanctionedSerializablesFilterPattern.pattern()).isEqualTo(expectedPattern);
+ assertThat(sanctionedSerializablesFilterPattern.pattern()).isEqualTo(expectedPattern);
+ }
+}
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SerializableObjectConfigTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SerializableObjectConfigTest.java
new file mode 100644
index 0000000..22fbded
--- /dev/null
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SerializableObjectConfigTest.java
@@ -0,0 +1,46 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import org.junit.Test;
+
+public class SerializableObjectConfigTest {
+
+ @Test
+ public void getSerializableObjectFilterIfEnabled_returnsFilter_ifValidateIsTrue() {
+ SerializableObjectConfig config = spy(SerializableObjectConfig.class);
+ when(config.getSerializableObjectFilter()).thenReturn("filter-string");
+ when(config.getValidateSerializableObjects()).thenReturn(true);
+
+ String result = config.getSerializableObjectFilterIfEnabled();
+
+ assertThat(result).isEqualTo("filter-string");
+ }
+
+ @Test
+ public void getSerializableObjectFilterIfEnabled_returnsNull_ifValidateIsFalse() {
+ SerializableObjectConfig config = spy(SerializableObjectConfig.class);
+ when(config.getSerializableObjectFilter()).thenReturn("filter-string");
+ when(config.getValidateSerializableObjects()).thenReturn(false);
+
+ String result = config.getSerializableObjectFilterIfEnabled();
+
+ assertThat(result).isNull();
+ }
+}
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SystemPropertyGlobalSerialFilterConfigurationFactoryTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SystemPropertyGlobalSerialFilterConfigurationFactoryTest.java
new file mode 100644
index 0000000..45070a6
--- /dev/null
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SystemPropertyGlobalSerialFilterConfigurationFactoryTest.java
@@ -0,0 +1,75 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.contrib.java.lang.system.RestoreSystemProperties;
+
+public class SystemPropertyGlobalSerialFilterConfigurationFactoryTest {
+
+ @Rule
+ public RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties();
+
+ @Test
+ public void createsConditionalGlobalSerialFilterConfiguration_whenEnableGlobalSerialFilter_isSet() {
+ System.setProperty("geode.enableGlobalSerialFilter", "true");
+ GlobalSerialFilterConfigurationFactory factory =
+ new SystemPropertyGlobalSerialFilterConfigurationFactory();
+
+ FilterConfiguration filterConfiguration = factory.create(mock(SerializableObjectConfig.class));
+
+ assertThat(filterConfiguration).isInstanceOf(GlobalSerialFilterConfiguration.class);
+ }
+
+ @Test
+ public void createsNoOp_whenEnableGlobalSerialFilter_isNotSet() {
+ GlobalSerialFilterConfigurationFactory factory =
+ new SystemPropertyGlobalSerialFilterConfigurationFactory();
+
+ FilterConfiguration filterConfiguration = factory.create(mock(SerializableObjectConfig.class));
+
+ assertThat(filterConfiguration)
+ .isNotInstanceOf(GlobalSerialFilterConfiguration.class);
+ }
+
+ @Test
+ public void createsNoOp_whenJdkSerialFilter_isSet() {
+ System.setProperty("jdk.serialFilter", "*");
+ GlobalSerialFilterConfigurationFactory factory =
+ new SystemPropertyGlobalSerialFilterConfigurationFactory();
+
+ FilterConfiguration filterConfiguration = factory.create(mock(SerializableObjectConfig.class));
+
+ assertThat(filterConfiguration)
+ .isNotInstanceOf(GlobalSerialFilterConfiguration.class);
+ }
+
+ @Test
+ public void createsNoOp_whenJdkSerialFilter_andEnableGlobalSerialFilter_areBothSet() {
+ System.setProperty("jdk.serialFilter", "*");
+ System.setProperty("geode.enableGlobalSerialFilter", "true");
+ GlobalSerialFilterConfigurationFactory factory =
+ new SystemPropertyGlobalSerialFilterConfigurationFactory();
+
+ FilterConfiguration filterConfiguration = factory.create(mock(SerializableObjectConfig.class));
+
+ assertThat(filterConfiguration)
+ .isNotInstanceOf(GlobalSerialFilterConfiguration.class);
+ }
+}
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SystemPropertyJmxSerialFilterConfigurationFactoryTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SystemPropertyJmxSerialFilterConfigurationFactoryTest.java
new file mode 100644
index 0000000..d95ef9c
--- /dev/null
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SystemPropertyJmxSerialFilterConfigurationFactoryTest.java
@@ -0,0 +1,90 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Map;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.contrib.java.lang.system.RestoreSystemProperties;
+
+public class SystemPropertyJmxSerialFilterConfigurationFactoryTest {
+
+ private static final String PROPERTY_NAME = "jmx.remote.rmi.server.serial.filter.pattern";
+ private static final String PATTERN = "*";
+
+ @Rule
+ public RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties();
+
+ @Test
+ public void jmxSerialFilterProperty_isBlankByDefault() {
+ assertThat(System.getProperty(PROPERTY_NAME)).isBlank();
+ }
+
+ @Test
+ public void returnsNewJmxSerialFilterConfiguration_whenFilteringIsEnabled() {
+ JmxSerialFilterConfigurationFactory factory =
+ new SystemPropertyJmxSerialFilterConfigurationFactory(true, PATTERN);
+
+ FilterConfiguration filterConfiguration = factory.create();
+
+ assertThat(filterConfiguration).isInstanceOf(JmxSerialFilterConfiguration.class);
+ }
+
+ @Test
+ public void returnsEnabledConfiguration_whenFilteringIsEnabled() {
+ JmxSerialFilterConfigurationFactory factory =
+ new SystemPropertyJmxSerialFilterConfigurationFactory(true, PATTERN);
+
+ FilterConfiguration filterConfiguration = factory.create();
+
+ assertThat(filterConfiguration.configure()).isTrue();
+ }
+
+ @Test
+ public void returnsDisabledConfiguration_whenFilteringIsDisabled() {
+ JmxSerialFilterConfigurationFactory factory =
+ new SystemPropertyJmxSerialFilterConfigurationFactory(false, PATTERN);
+
+ FilterConfiguration filterConfiguration = factory.create();
+
+ assertThat(filterConfiguration.configure()).isFalse();
+ }
+
+ @Test
+ public void enabledConfiguration_setsJmxSerialFilterProperty() {
+ JmxSerialFilterConfigurationFactory factory =
+ new SystemPropertyJmxSerialFilterConfigurationFactory(true, PATTERN);
+ FilterConfiguration filterConfiguration = factory.create();
+
+ filterConfiguration.configure();
+
+ assertThat(System.getProperty(PROPERTY_NAME)).isEqualTo(PATTERN);
+ }
+
+ @Test
+ public void disabledConfiguration_doesNotSetAnySystemProperties() {
+ Map<?, ?> propertiesBefore = System.getProperties();
+ JmxSerialFilterConfigurationFactory factory =
+ new SystemPropertyJmxSerialFilterConfigurationFactory(true, PATTERN);
+ FilterConfiguration filterConfiguration = factory.create();
+
+ filterConfiguration.configure();
+
+ assertThat(System.getProperties()).containsExactlyEntriesOf(propertiesBefore);
+ }
+}
[geode] 06/06: GEODE-9980: Improve error handling of serial filters (#7299)
Posted by kl...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
klund pushed a commit to branch support/1.12
in repository https://gitbox.apache.org/repos/asf/geode.git
commit 5169450f94241019bcc16362985097970a7e6251
Author: Kirk Lund <kl...@apache.org>
AuthorDate: Tue Feb 8 12:04:44 2022 -0800
GEODE-9980: Improve error handling of serial filters (#7299)
Improves the error handling of serial filter configuration and
filtering. The API throws a runtime exception wrapping any thrown
exceptions.
When geode.enableGlobalSerialFilter is FALSE:
* Startup succeeds without throwing any exceptions even if an older
version of Java throws "java.lang.ClassNotFoundException
sun.misc.ObjectInputFilter".
When geode.enableGlobalSerialFilter is TRUE:
* Startup fails by throwing an exception when configuration of serial
filter fails for any reason.
Renames ObjectInputFilter to avoid confusion with the Java interface of
the same name.
Fixes a bug found in ReflectiveFacadeGlobalSerialFilterTest which
resulted in configuring a non-mocked process-wide serial filter that
polluted the JVM for all later tests.
Fixes other minor details in LocatorLauncher, InternalDataSerializer
and various related tests.
(cherry picked from commit ce57e9fd2b8b644cadc469209e12e4fbd281e0d9)
---
.../filter/LocatorLauncherWithJmxManager.java | 2 +-
.../filter/SerialFilterAssertions.java | 30 +++---
.../filter/ServerLauncherWithJmxManager.java | 2 +-
.../apache/geode/distributed/LocatorLauncher.java | 16 ++-
.../apache/geode/distributed/ServerLauncher.java | 16 ++-
.../geode/internal/InternalDataSerializer.java | 27 +++--
.../geode/management/internal/ManagementAgent.java | 7 +-
.../geode/distributed/LocatorLauncherTest.java | 2 +-
...ationWhenFilterIsAlreadySetIntegrationTest.java | 52 ++++++++++
...enObjectInputFilterNotFoundIntegrationTest.java | 108 ++++++++++++++++++++
...nputFilterApiSetFilterBlankIntegrationTest.java | 1 -
....java => FilterAlreadyConfiguredException.java} | 22 +++--
.../serialization/filter/FilterConfiguration.java | 2 +-
.../serialization/filter/GlobalSerialFilter.java | 5 +-
.../filter/GlobalSerialFilterConfiguration.java | 85 ++++++----------
.../filter/JmxSerialFilterConfiguration.java | 15 +--
...nputFilter.java => NullStreamSerialFilter.java} | 4 +-
.../filter/ObjectInputFilterInvocationHandler.java | 109 +++++++++++++++++++++
.../filter/ReflectiveFacadeGlobalSerialFilter.java | 43 ++++++--
.../ReflectiveFacadeGlobalSerialFilterFactory.java | 20 ++--
.../ReflectiveFacadeObjectInputFilterFactory.java | 61 ------------
...ava => ReflectiveFacadeStreamSerialFilter.java} | 49 +++++++--
...ReflectiveFacadeStreamSerialFilterFactory.java} | 35 +++----
.../filter/ReflectiveObjectInputFilterApi.java | 59 +++--------
...ectInputFilter.java => StreamSerialFilter.java} | 7 +-
...Factory.java => StreamSerialFilterFactory.java} | 4 +-
...ertyGlobalSerialFilterConfigurationFactory.java | 24 ++++-
....java => UnableToSetSerialFilterException.java} | 22 +++--
...anctioned-geode-serialization-serializables.txt | 2 +
.../GlobalSerialFilterConfigurationTest.java | 84 ++++++++++++----
.../JmxSerialFilterConfigurationFactoryTest.java | 9 ++
.../filter/JmxSerialFilterConfigurationTest.java | 50 ++++++----
.../filter/NullObjectInputFilterTest.java | 4 +-
.../ObjectInputFilterInvocationHandlerTest.java | 97 ++++++++++++++++++
...lectiveFacadeGlobalSerialFilterFactoryTest.java | 64 ++++++------
.../ReflectiveFacadeGlobalSerialFilterTest.java | 85 +++++++++++++---
...flectiveFacadeObjectInputFilterFactoryTest.java | 12 +--
.../ReflectiveFacadeObjectInputFilterTest.java | 76 +++++++++-----
.../ReflectiveObjectInputFilterApiFactoryTest.java | 9 ++
.../filter/ReflectiveObjectInputFilterApiTest.java | 11 ++-
.../filter/SerialFilterAssertions.java | 53 +++++-----
...GlobalSerialFilterConfigurationFactoryTest.java | 101 ++++++++++++++++---
...rtyJmxSerialFilterConfigurationFactoryTest.java | 12 ++-
43 files changed, 1061 insertions(+), 437 deletions(-)
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherWithJmxManager.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherWithJmxManager.java
index 8bd96f5..b18865c 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherWithJmxManager.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/LocatorLauncherWithJmxManager.java
@@ -30,7 +30,7 @@ import org.apache.geode.management.ManagementService;
import org.apache.geode.management.internal.SystemManagementService;
import org.apache.geode.test.junit.rules.CloseableReference;
-abstract class LocatorLauncherWithJmxManager {
+public abstract class LocatorLauncherWithJmxManager {
static final String NAME = "locator";
static final String JDK_PROPERTY = "jdk.serialFilter";
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/SerialFilterAssertions.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/SerialFilterAssertions.java
index b6d552a..8432e7d 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/SerialFilterAssertions.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/SerialFilterAssertions.java
@@ -30,35 +30,29 @@ public class SerialFilterAssertions {
public static void assertThatSerialFilterIsNull()
throws InvocationTargetException, IllegalAccessException {
- boolean exists = API.getSerialFilter() != null;
- assertThat(exists)
- .as("ObjectInputFilter$Config.getSerialFilter() is null")
- .isFalse();
+ assertThat(API.getSerialFilter())
+ .as("ObjectInputFilter$Config.getSerialFilter()")
+ .isNull();
}
public static void assertThatSerialFilterIsNotNull()
throws InvocationTargetException, IllegalAccessException {
- boolean exists = API.getSerialFilter() != null;
- assertThat(exists)
- .as("ObjectInputFilter$Config.getSerialFilter() is not null")
- .isTrue();
+ assertThat(API.getSerialFilter())
+ .as("ObjectInputFilter$Config.getSerialFilter()")
+ .isNotNull();
}
public static void assertThatSerialFilterIsSameAs(Object objectInputFilter)
throws InvocationTargetException, IllegalAccessException {
- Object currentFilter = API.getSerialFilter();
- boolean sameIdentity = currentFilter == objectInputFilter;
- assertThat(sameIdentity)
- .as("ObjectInputFilter$Config.getSerialFilter() is same as parameter")
- .isTrue();
+ assertThat(API.getSerialFilter())
+ .as("ObjectInputFilter$Config.getSerialFilter()")
+ .isSameAs(objectInputFilter);
}
public static void assertThatSerialFilterIsNotSameAs(Object objectInputFilter)
throws InvocationTargetException, IllegalAccessException {
- Object currentFilter = API.getSerialFilter();
- boolean sameIdentity = currentFilter == objectInputFilter;
- assertThat(sameIdentity)
- .as("ObjectInputFilter$Config.getSerialFilter() is same as parameter")
- .isFalse();
+ assertThat(API.getSerialFilter())
+ .as("ObjectInputFilter$Config.getSerialFilter()")
+ .isNotSameAs(objectInputFilter);
}
}
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherWithJmxManager.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherWithJmxManager.java
index eba157c..a47c83a 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherWithJmxManager.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ServerLauncherWithJmxManager.java
@@ -29,7 +29,7 @@ import org.apache.geode.management.ManagementService;
import org.apache.geode.management.internal.SystemManagementService;
import org.apache.geode.test.junit.rules.CloseableReference;
-abstract class ServerLauncherWithJmxManager {
+public abstract class ServerLauncherWithJmxManager {
static final String NAME = "server";
static final String JDK_PROPERTY = "jdk.serialFilter";
diff --git a/geode-core/src/main/java/org/apache/geode/distributed/LocatorLauncher.java b/geode-core/src/main/java/org/apache/geode/distributed/LocatorLauncher.java
index fc60f83..c07aff6 100644
--- a/geode-core/src/main/java/org/apache/geode/distributed/LocatorLauncher.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/LocatorLauncher.java
@@ -87,6 +87,7 @@ import org.apache.geode.internal.process.ProcessUtils;
import org.apache.geode.internal.process.UnableToControlProcessException;
import org.apache.geode.internal.security.SecurableCommunicationChannel;
import org.apache.geode.internal.serialization.filter.SystemPropertyGlobalSerialFilterConfigurationFactory;
+import org.apache.geode.internal.serialization.filter.UnableToSetSerialFilterException;
import org.apache.geode.lang.AttachAPINotFoundException;
import org.apache.geode.logging.internal.log4j.api.LogService;
import org.apache.geode.management.internal.util.HostUtils;
@@ -702,10 +703,7 @@ public class LocatorLauncher extends AbstractLauncher<String> {
if (isStartable()) {
INSTANCE.compareAndSet(null, this);
- boolean serializationFilterConfigured =
- new SystemPropertyGlobalSerialFilterConfigurationFactory()
- .create(new DistributedSerializableObjectConfig(getDistributedSystemProperties()))
- .configure();
+ boolean serializationFilterConfigured = configureGlobalSerialFilterIfEnabled();
try {
this.process =
@@ -770,6 +768,16 @@ public class LocatorLauncher extends AbstractLauncher<String> {
}
}
+ private boolean configureGlobalSerialFilterIfEnabled() {
+ try {
+ return new SystemPropertyGlobalSerialFilterConfigurationFactory()
+ .create(new DistributedSerializableObjectConfig(getDistributedSystemProperties()))
+ .configure();
+ } catch (UnableToSetSerialFilterException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
@Override
protected Properties getDistributedSystemProperties() {
return super.getDistributedSystemProperties(getProperties());
diff --git a/geode-core/src/main/java/org/apache/geode/distributed/ServerLauncher.java b/geode-core/src/main/java/org/apache/geode/distributed/ServerLauncher.java
index 9492402..04bb04c 100755
--- a/geode-core/src/main/java/org/apache/geode/distributed/ServerLauncher.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/ServerLauncher.java
@@ -96,6 +96,7 @@ import org.apache.geode.internal.process.ProcessLauncherContext;
import org.apache.geode.internal.process.ProcessType;
import org.apache.geode.internal.process.UnableToControlProcessException;
import org.apache.geode.internal.serialization.filter.SystemPropertyGlobalSerialFilterConfigurationFactory;
+import org.apache.geode.internal.serialization.filter.UnableToSetSerialFilterException;
import org.apache.geode.lang.AttachAPINotFoundException;
import org.apache.geode.logging.internal.executors.LoggingThread;
import org.apache.geode.logging.internal.log4j.api.LogService;
@@ -791,10 +792,7 @@ public class ServerLauncher extends AbstractLauncher<String> {
if (isStartable()) {
INSTANCE.compareAndSet(null, this);
- boolean serializationFilterConfigured =
- new SystemPropertyGlobalSerialFilterConfigurationFactory()
- .create(new DistributedSerializableObjectConfig(getDistributedSystemProperties()))
- .configure();
+ boolean serializationFilterConfigured = configureGlobalSerialFilterIfEnabled();
try {
process = getControllableProcess();
@@ -893,6 +891,16 @@ public class ServerLauncher extends AbstractLauncher<String> {
getServiceName(), getWorkingDirectory(), getId()));
}
+ private boolean configureGlobalSerialFilterIfEnabled() {
+ try {
+ return new SystemPropertyGlobalSerialFilterConfigurationFactory()
+ .create(new DistributedSerializableObjectConfig(getDistributedSystemProperties()))
+ .configure();
+ } catch (UnableToSetSerialFilterException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
Cache createCache(Properties gemfireProperties) {
Iterable<ServerLauncherCacheProvider> loader = getServerLauncherCacheProviders();
for (ServerLauncherCacheProvider provider : loader) {
diff --git a/geode-core/src/main/java/org/apache/geode/internal/InternalDataSerializer.java b/geode-core/src/main/java/org/apache/geode/internal/InternalDataSerializer.java
index 056dc09..56b4d83 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/InternalDataSerializer.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/InternalDataSerializer.java
@@ -117,12 +117,13 @@ import org.apache.geode.internal.serialization.SerializationVersions;
import org.apache.geode.internal.serialization.StaticSerialization;
import org.apache.geode.internal.serialization.Version;
import org.apache.geode.internal.serialization.VersionedDataStream;
-import org.apache.geode.internal.serialization.filter.NullObjectInputFilter;
-import org.apache.geode.internal.serialization.filter.ObjectInputFilter;
-import org.apache.geode.internal.serialization.filter.ObjectInputFilterFactory;
-import org.apache.geode.internal.serialization.filter.ReflectiveFacadeObjectInputFilterFactory;
+import org.apache.geode.internal.serialization.filter.NullStreamSerialFilter;
+import org.apache.geode.internal.serialization.filter.ReflectiveFacadeStreamSerialFilterFactory;
import org.apache.geode.internal.serialization.filter.SanctionedSerializablesService;
import org.apache.geode.internal.serialization.filter.SerializableObjectConfig;
+import org.apache.geode.internal.serialization.filter.StreamSerialFilter;
+import org.apache.geode.internal.serialization.filter.StreamSerialFilterFactory;
+import org.apache.geode.internal.serialization.filter.UnableToSetSerialFilterException;
import org.apache.geode.internal.util.concurrent.CopyOnWriteHashMap;
import org.apache.geode.logging.internal.log4j.api.LogService;
import org.apache.geode.pdx.NonPortableClassException;
@@ -286,12 +287,12 @@ public abstract class InternalDataSerializer extends DataSerializer {
"org.apache.geode.cache.query.internal.cq.ServerCQImpl";
@Immutable
- private static final ObjectInputFilter defaultSerializationFilter = new NullObjectInputFilter();
+ private static final StreamSerialFilter defaultSerializationFilter = new NullStreamSerialFilter();
/**
* A deserialization filter for ObjectInputStreams
*/
@MakeNotStatic
- private static ObjectInputFilter serializationFilter = defaultSerializationFilter;
+ private static StreamSerialFilter serializationFilter = defaultSerializationFilter;
/**
* support for old GemFire clients and WAN sites - needed to enable moving from GemFire to Geode
*/
@@ -418,14 +419,13 @@ public abstract class InternalDataSerializer extends DataSerializer {
Collection<SanctionedSerializablesService> services) {
logger.info("initializing InternalDataSerializer with {} services", services.size());
- ObjectInputFilterFactory objectInputFilterFactory =
- new ReflectiveFacadeObjectInputFilterFactory();
+ StreamSerialFilterFactory objectInputFilterFactory =
+ new ReflectiveFacadeStreamSerialFilterFactory();
serializationFilter =
objectInputFilterFactory.create(config, loadSanctionedClassNames(services));
}
- @VisibleForTesting
static void clearSerializationFilter() {
serializationFilter = defaultSerializationFilter;
}
@@ -2682,7 +2682,14 @@ public abstract class InternalDataSerializer extends DataSerializer {
}
ObjectInput ois = new DSObjectInputStream(stream);
- serializationFilter.setFilterOn((ObjectInputStream) ois);
+
+ try {
+ serializationFilter.setFilterOn((ObjectInputStream) ois);
+ } catch (UnableToSetSerialFilterException e) {
+ // maintain existing behavior for validate-serializable-objects
+ throw new UnsupportedOperationException(e);
+ }
+
if (stream instanceof VersionedDataStream) {
Version v = ((VersionedDataStream) stream).getVersion();
if (Version.CURRENT != v && v != null) {
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/ManagementAgent.java b/geode-core/src/main/java/org/apache/geode/management/internal/ManagementAgent.java
index 8f94b86..18e16a2 100755
--- a/geode-core/src/main/java/org/apache/geode/management/internal/ManagementAgent.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/ManagementAgent.java
@@ -65,6 +65,7 @@ import org.apache.geode.internal.security.SecurableCommunicationChannel;
import org.apache.geode.internal.security.SecurityService;
import org.apache.geode.internal.security.shiro.JMXShiroAuthenticator;
import org.apache.geode.internal.serialization.filter.FilterConfiguration;
+import org.apache.geode.internal.serialization.filter.UnableToSetSerialFilterException;
import org.apache.geode.internal.tcp.TCPConduit;
import org.apache.geode.logging.internal.log4j.api.LogService;
import org.apache.geode.management.ManagementException;
@@ -132,7 +133,11 @@ public class ManagementAgent {
}
public synchronized void startAgent() {
- filterConfiguration.configure();
+ try {
+ filterConfiguration.configure();
+ } catch (UnableToSetSerialFilterException e) {
+ throw new RuntimeException(e);
+ }
loadWebApplications();
if (!this.running && this.config.getJmxManagerPort() != 0) {
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/distributed/LocatorLauncherTest.java b/geode-core/src/test/java/org/apache/geode/distributed/LocatorLauncherTest.java
similarity index 97%
rename from geode-core/src/distributedTest/java/org/apache/geode/distributed/LocatorLauncherTest.java
rename to geode-core/src/test/java/org/apache/geode/distributed/LocatorLauncherTest.java
index d7ba3c5..5bcb6d4 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/distributed/LocatorLauncherTest.java
+++ b/geode-core/src/test/java/org/apache/geode/distributed/LocatorLauncherTest.java
@@ -30,7 +30,7 @@ import org.apache.geode.distributed.internal.InternalLocator;
public class LocatorLauncherTest {
@Test
- public void canBeMocked() throws Exception {
+ public void canBeMocked() {
LocatorLauncher mockLocatorLauncher = mock(LocatorLauncher.class);
InternalLocator mockInternalLocator = mock(InternalLocator.class);
diff --git a/geode-serialization/src/integrationTest/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterConfigurationWhenFilterIsAlreadySetIntegrationTest.java b/geode-serialization/src/integrationTest/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterConfigurationWhenFilterIsAlreadySetIntegrationTest.java
new file mode 100644
index 0000000..1430801
--- /dev/null
+++ b/geode-serialization/src/integrationTest/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterConfigurationWhenFilterIsAlreadySetIntegrationTest.java
@@ -0,0 +1,52 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.catchThrowable;
+import static org.mockito.Mockito.mock;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class GlobalSerialFilterConfigurationWhenFilterIsAlreadySetIntegrationTest {
+
+ @Before
+ public void filterIsAlreadySet() throws InvocationTargetException, IllegalAccessException {
+ ObjectInputFilterApiFactory factory = new ReflectiveObjectInputFilterApiFactory();
+ ObjectInputFilterApi api = factory.createObjectInputFilterApi();
+ Object filter = api.createFilter("*");
+ api.setSerialFilter(filter);
+ }
+
+ @Test
+ public void throwsObjectInputFilterException_whenFilterIsAlreadySet() {
+ FilterConfiguration configuration =
+ new GlobalSerialFilterConfiguration(mock(SerializableObjectConfig.class));
+
+ Throwable thrown = catchThrowable(() -> {
+ configuration.configure();
+ });
+
+ assertThat(thrown)
+ .isInstanceOf(UnableToSetSerialFilterException.class)
+ .hasMessageContaining(
+ "Unable to configure a global serialization filter because filter has already been set non-null.")
+ .hasCauseInstanceOf(InvocationTargetException.class)
+ .hasRootCauseInstanceOf(IllegalStateException.class);
+ }
+}
diff --git a/geode-serialization/src/integrationTest/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterConfigurationWhenObjectInputFilterNotFoundIntegrationTest.java b/geode-serialization/src/integrationTest/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterConfigurationWhenObjectInputFilterNotFoundIntegrationTest.java
new file mode 100644
index 0000000..6ebd232
--- /dev/null
+++ b/geode-serialization/src/integrationTest/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterConfigurationWhenObjectInputFilterNotFoundIntegrationTest.java
@@ -0,0 +1,108 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatCode;
+import static org.assertj.core.api.Assertions.catchThrowable;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verifyZeroInteractions;
+
+import org.apache.logging.log4j.Logger;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.contrib.java.lang.system.RestoreSystemProperties;
+
+public class GlobalSerialFilterConfigurationWhenObjectInputFilterNotFoundIntegrationTest {
+
+ private final boolean supportsObjectInputFilter = false;
+
+ private ReflectiveFacadeGlobalSerialFilterFactory globalSerialFilterFactory_throws;
+ private SerializableObjectConfig config;
+ private Logger logger;
+
+ @Rule
+ public RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties();
+
+ @Before
+ public void whenObjectInputFilter_classNotFound() {
+ globalSerialFilterFactory_throws =
+ new ReflectiveFacadeGlobalSerialFilterFactory(() -> {
+ throw new UnsupportedOperationException(
+ new ClassNotFoundException("sun.misc.ObjectInputFilter"));
+ });
+ }
+
+ @Before
+ public void setUpMocks() {
+ config = mock(SerializableObjectConfig.class);
+ logger = mock(Logger.class);
+ }
+
+ @Test
+ public void doesNotThrow_whenEnableGlobalSerialFilterIsFalse_andObjectInputFilterClassNotFound() {
+ System.clearProperty("geode.enableGlobalSerialFilter");
+ GlobalSerialFilterConfigurationFactory factory =
+ new SystemPropertyGlobalSerialFilterConfigurationFactory();
+ FilterConfiguration configuration = factory.create(config);
+
+ assertThatCode(configuration::configure)
+ .doesNotThrowAnyException();
+ }
+
+ @Test
+ public void logsNothing_whenEnableGlobalSerialFilterIsFalse_andObjectInputFilterClassNotFound()
+ throws UnableToSetSerialFilterException {
+ System.clearProperty("geode.enableGlobalSerialFilter");
+ GlobalSerialFilterConfigurationFactory factory =
+ new SystemPropertyGlobalSerialFilterConfigurationFactory(() -> supportsObjectInputFilter);
+ FilterConfiguration configuration = factory.create(config);
+
+ configuration.configure();
+
+ verifyZeroInteractions(logger);
+ }
+
+ @Test
+ public void doesNotConfigureOrThrow_whenEnableGlobalSerialFilterIsTrue_andObjectInputFilterClassNotFound()
+ throws UnableToSetSerialFilterException {
+ System.setProperty("geode.enableGlobalSerialFilter", "true");
+ GlobalSerialFilterConfigurationFactory factory =
+ new SystemPropertyGlobalSerialFilterConfigurationFactory(() -> supportsObjectInputFilter);
+ FilterConfiguration configuration = factory.create(config);
+
+ boolean result = configuration.configure();
+
+ assertThat(result).isFalse();
+ }
+
+ @Test
+ public void logsWarning_whenEnableGlobalSerialFilterIsTrue_andObjectInputFilterClassNotFound() {
+ System.setProperty("geode.enableGlobalSerialFilter", "true");
+ FilterConfiguration configuration = new GlobalSerialFilterConfiguration(
+ config, logger, globalSerialFilterFactory_throws);
+
+ Throwable thrown = catchThrowable(() -> {
+ configuration.configure();
+ });
+
+ assertThat(thrown)
+ .isInstanceOf(UnsupportedOperationException.class)
+ .hasMessageContaining("java.lang.ClassNotFoundException: sun.misc.ObjectInputFilter")
+ .hasRootCauseInstanceOf(ClassNotFoundException.class)
+ .hasMessageContaining("sun.misc.ObjectInputFilter");
+ }
+}
diff --git a/geode-serialization/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiSetFilterBlankIntegrationTest.java b/geode-serialization/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiSetFilterBlankIntegrationTest.java
index 6155c8b..d5714f6 100644
--- a/geode-serialization/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiSetFilterBlankIntegrationTest.java
+++ b/geode-serialization/src/integrationTest/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiSetFilterBlankIntegrationTest.java
@@ -44,7 +44,6 @@ public class ReflectiveObjectInputFilterApiSetFilterBlankIntegrationTest {
if (isJavaVersionAtLeast(JAVA_9)) {
apiPackage = JAVA_IO;
}
-
}
@Test
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/NullObjectInputFilter.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/FilterAlreadyConfiguredException.java
similarity index 58%
copy from geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/NullObjectInputFilter.java
copy to geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/FilterAlreadyConfiguredException.java
index e25c073..e42990e 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/NullObjectInputFilter.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/FilterAlreadyConfiguredException.java
@@ -14,15 +14,23 @@
*/
package org.apache.geode.internal.serialization.filter;
-import java.io.ObjectInputStream;
-
/**
- * Implementation of {@code ObjectInputFilter} that does nothing.
+ * Checked exception thrown when configuring a filter fails because a non-null filter already
+ * exists. All uses of this exception are caught and rethrown before reaching the user.
*/
-public class NullObjectInputFilter implements ObjectInputFilter {
+public class FilterAlreadyConfiguredException extends UnableToSetSerialFilterException {
+
+ public FilterAlreadyConfiguredException(String message) {
+ super(message);
+ }
- @Override
- public void setFilterOn(ObjectInputStream objectInputStream) {
- // Do nothing, this is the case where we don't filter.
+ public FilterAlreadyConfiguredException(String message, Throwable cause) {
+ super(message, cause);
}
+
+ public FilterAlreadyConfiguredException(Throwable cause) {
+ super(cause);
+ }
+
+ private static final long serialVersionUID = -6102549374563510704L;
}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/FilterConfiguration.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/FilterConfiguration.java
index 9a51a28..cf12790 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/FilterConfiguration.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/FilterConfiguration.java
@@ -23,5 +23,5 @@ public interface FilterConfiguration {
/**
* Returns true if serialization filter was successfully configured.
*/
- boolean configure();
+ boolean configure() throws UnableToSetSerialFilterException;
}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilter.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilter.java
index 87c19bd..7858878 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilter.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilter.java
@@ -22,6 +22,9 @@ interface GlobalSerialFilter {
/**
* Sets this serialization filter as the process-wide filter.
+ *
+ * @throws FilterAlreadyConfiguredException if a non-null serialization filter already exists
+ * @throws UnableToSetSerialFilterException if there's any failure setting a serialization filter
*/
- void setFilter();
+ void setFilter() throws UnableToSetSerialFilterException;
}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterConfiguration.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterConfiguration.java
index 7d312ac..1bfd028 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterConfiguration.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterConfiguration.java
@@ -14,13 +14,10 @@
*/
package org.apache.geode.internal.serialization.filter;
-import static java.util.Objects.nonNull;
-import static org.apache.commons.lang3.exception.ExceptionUtils.getRootCause;
import static org.apache.geode.internal.serialization.filter.SanctionedSerializables.loadSanctionedClassNames;
import static org.apache.geode.internal.serialization.filter.SanctionedSerializables.loadSanctionedSerializablesServices;
import java.util.Set;
-import java.util.function.Consumer;
import java.util.function.Supplier;
import org.apache.logging.log4j.Logger;
@@ -37,7 +34,7 @@ class GlobalSerialFilterConfiguration implements FilterConfiguration {
private final SerializableObjectConfig serializableObjectConfig;
private final FilterPatternFactory filterPatternFactory;
private final Supplier<Set<String>> sanctionedClassesSupplier;
- private final Consumer<String> logger;
+ private final Logger logger;
private final GlobalSerialFilterFactory globalSerialFilterFactory;
/**
@@ -45,15 +42,22 @@ class GlobalSerialFilterConfiguration implements FilterConfiguration {
*/
GlobalSerialFilterConfiguration(SerializableObjectConfig serializableObjectConfig) {
this(serializableObjectConfig,
- new DefaultFilterPatternFactory(),
- () -> loadSanctionedClassNames(loadSanctionedSerializablesServices()),
- LOGGER::info,
(pattern, sanctionedClasses) -> new ReflectiveFacadeGlobalSerialFilterFactory()
.create(pattern, sanctionedClasses));
}
- GlobalSerialFilterConfiguration(SerializableObjectConfig serializableObjectConfig,
- Consumer<String> logger, GlobalSerialFilterFactory globalSerialFilterFactory) {
+ GlobalSerialFilterConfiguration(
+ SerializableObjectConfig serializableObjectConfig,
+ GlobalSerialFilterFactory globalSerialFilterFactory) {
+ this(serializableObjectConfig,
+ LOGGER,
+ globalSerialFilterFactory);
+ }
+
+ GlobalSerialFilterConfiguration(
+ SerializableObjectConfig serializableObjectConfig,
+ Logger logger,
+ GlobalSerialFilterFactory globalSerialFilterFactory) {
this(serializableObjectConfig,
new DefaultFilterPatternFactory(),
() -> loadSanctionedClassNames(loadSanctionedSerializablesServices()),
@@ -65,7 +69,7 @@ class GlobalSerialFilterConfiguration implements FilterConfiguration {
SerializableObjectConfig serializableObjectConfig,
FilterPatternFactory filterPatternFactory,
Supplier<Set<String>> sanctionedClassesSupplier,
- Consumer<String> logger,
+ Logger logger,
GlobalSerialFilterFactory globalSerialFilterFactory) {
this.serializableObjectConfig = serializableObjectConfig;
this.filterPatternFactory = filterPatternFactory;
@@ -75,48 +79,23 @@ class GlobalSerialFilterConfiguration implements FilterConfiguration {
}
@Override
- public boolean configure() {
- try {
- // enable validate-serializable-objects
- serializableObjectConfig.setValidateSerializableObjects(true);
-
- // create a GlobalSerialFilter
- String pattern = filterPatternFactory
- .create(serializableObjectConfig.getSerializableObjectFilterIfEnabled());
- Set<String> sanctionedClasses = sanctionedClassesSupplier.get();
- GlobalSerialFilter globalSerialFilter =
- globalSerialFilterFactory.create(pattern, sanctionedClasses);
-
- // invoke setFilter on GlobalSerialFilter to set the process-wide filter
- globalSerialFilter.setFilter();
-
- // log statement that filter is now configured
- logger.accept("Global serial filter is now configured.");
- return true;
-
- } catch (UnsupportedOperationException e) {
- if (hasRootCauseWithMessage(e, IllegalStateException.class,
- "Serial filter can only be set once")) {
-
- // log statement that filter was already configured
- logger.accept("Global serial filter is already configured.");
- }
- return false;
- }
- }
-
- private static boolean hasRootCauseWithMessage(Throwable throwable,
- Class<? extends Throwable> causeClass, String message) {
- Throwable rootCause = getRootCause(throwable);
- return isInstanceOf(rootCause, causeClass) && hasMessage(rootCause, message);
- }
-
- private static boolean isInstanceOf(Throwable throwable, Class<? extends Throwable> causeClass) {
- return nonNull(throwable) && throwable.getClass().equals(causeClass);
- }
-
- private static boolean hasMessage(Throwable throwable, String message) {
- return nonNull(throwable) && throwable.getMessage().equalsIgnoreCase(message);
+ public boolean configure() throws UnableToSetSerialFilterException {
+ // enable validate-serializable-objects
+ serializableObjectConfig.setValidateSerializableObjects(true);
+
+ // create a GlobalSerialFilter
+ String pattern = filterPatternFactory
+ .create(serializableObjectConfig.getSerializableObjectFilterIfEnabled());
+ Set<String> sanctionedClasses = sanctionedClassesSupplier.get();
+ GlobalSerialFilter globalSerialFilter =
+ globalSerialFilterFactory.create(pattern, sanctionedClasses);
+
+ // invoke setFilter on GlobalSerialFilter to set the process-wide filter
+ globalSerialFilter.setFilter();
+
+ // log statement that filter is now configured
+ logger.info("Global serialization filter is now configured.");
+ return true;
}
/**
@@ -132,7 +111,7 @@ class GlobalSerialFilterConfiguration implements FilterConfiguration {
/**
* Default implementation of {@code FilterPatternFactory}.
*/
- static class DefaultFilterPatternFactory implements FilterPatternFactory {
+ public static class DefaultFilterPatternFactory implements FilterPatternFactory {
@Override
public String create(String optionalSerializableObjectFilter) {
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/JmxSerialFilterConfiguration.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/JmxSerialFilterConfiguration.java
index 21b0908..86c7191 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/JmxSerialFilterConfiguration.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/JmxSerialFilterConfiguration.java
@@ -16,8 +16,6 @@ package org.apache.geode.internal.serialization.filter;
import static org.apache.commons.lang3.StringUtils.isBlank;
-import java.util.function.Consumer;
-
import org.apache.logging.log4j.Logger;
import org.apache.geode.annotations.VisibleForTesting;
@@ -42,17 +40,20 @@ class JmxSerialFilterConfiguration implements FilterConfiguration {
private final String key;
private final String value;
- private final Consumer<String> logger;
+ private final Logger logger;
/**
* Constructs instance for the specified system property and filter pattern.
*/
JmxSerialFilterConfiguration(String property, String pattern) {
- this(property, pattern, LOGGER::info);
+ this(property, pattern, LOGGER);
}
@VisibleForTesting
- JmxSerialFilterConfiguration(String property, String pattern, Consumer<String> logger) {
+ JmxSerialFilterConfiguration(
+ String property,
+ String pattern,
+ Logger logger) {
key = property;
value = pattern;
this.logger = logger;
@@ -62,11 +63,11 @@ class JmxSerialFilterConfiguration implements FilterConfiguration {
public boolean configure() {
if (isBlank(System.getProperty(key))) {
System.setProperty(key, value);
- logger.accept("System property '" + key + "' is now configured with '" + value + "'.");
+ logger.info("System property '" + key + "' is now configured with '" + value + "'.");
return true;
}
- logger.accept("System property '" + key + "' is already configured.");
+ logger.info("System property '" + key + "' is already configured.");
return false;
}
}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/NullObjectInputFilter.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/NullStreamSerialFilter.java
similarity index 88%
copy from geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/NullObjectInputFilter.java
copy to geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/NullStreamSerialFilter.java
index e25c073..226159b 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/NullObjectInputFilter.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/NullStreamSerialFilter.java
@@ -17,9 +17,9 @@ package org.apache.geode.internal.serialization.filter;
import java.io.ObjectInputStream;
/**
- * Implementation of {@code ObjectInputFilter} that does nothing.
+ * Implementation of {@code StreamSerialFilter} that does nothing.
*/
-public class NullObjectInputFilter implements ObjectInputFilter {
+public class NullStreamSerialFilter implements StreamSerialFilter {
@Override
public void setFilterOn(ObjectInputStream objectInputStream) {
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterInvocationHandler.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterInvocationHandler.java
new file mode 100644
index 0000000..7c084b6
--- /dev/null
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterInvocationHandler.java
@@ -0,0 +1,109 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.util.Collections.unmodifiableCollection;
+import static java.util.Objects.requireNonNull;
+
+import java.io.InvalidClassException;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.util.Collection;
+
+import org.apache.logging.log4j.Logger;
+
+import org.apache.geode.logging.internal.log4j.api.LogService;
+
+class ObjectInputFilterInvocationHandler implements InvocationHandler {
+
+ private static final Logger logger = LogService.getLogger();
+
+ private final Method ObjectInputFilter_checkInput;
+ private final Method ObjectInputFilter_FilterInfo_serialClass;
+ private final Object ObjectInputFilter_Status_ALLOWED;
+ private final Object ObjectInputFilter_Status_REJECTED;
+
+ private final Object objectInputFilter;
+ private final Collection<String> sanctionedClasses;
+
+ ObjectInputFilterInvocationHandler(
+ Method ObjectInputFilter_checkInput,
+ Method ObjectInputFilter_FilterInfo_serialClass,
+ Object ObjectInputFilter_Status_ALLOWED,
+ Object ObjectInputFilter_Status_REJECTED,
+ Object objectInputFilter,
+ Collection<String> sanctionedClasses) {
+ this.ObjectInputFilter_checkInput = ObjectInputFilter_checkInput;
+ this.ObjectInputFilter_FilterInfo_serialClass = ObjectInputFilter_FilterInfo_serialClass;
+ this.ObjectInputFilter_Status_ALLOWED = ObjectInputFilter_Status_ALLOWED;
+ this.ObjectInputFilter_Status_REJECTED = ObjectInputFilter_Status_REJECTED;
+ this.objectInputFilter = objectInputFilter;
+ this.sanctionedClasses = unmodifiableCollection(sanctionedClasses);
+ }
+
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args)
+ throws IllegalAccessException, IllegalArgumentException,
+ java.lang.reflect.InvocationTargetException {
+ if (!"checkInput".equals(method.getName())) {
+ // delegate to the actual objectInputFilter instance for any method other than checkInput
+ return method.invoke(objectInputFilter, args);
+ }
+
+ requireNonNull(args, "Single argument FilterInfo is null");
+
+ if (args.length != 1) {
+ throw new IllegalArgumentException("Single argument FilterInfo is required");
+ }
+
+ // fetch the class of the serialized instance
+ Object objectInputFilter_filterInfo = args[0];
+ Class<?> serialClass =
+ (Class<?>) ObjectInputFilter_FilterInfo_serialClass.invoke(objectInputFilter_filterInfo);
+ if (serialClass == null) { // no class to check, so nothing to accept-list
+ return ObjectInputFilter_checkInput.invoke(objectInputFilter, objectInputFilter_filterInfo);
+ }
+
+ // check sanctionedClasses to determine if the name of the class is ALLOWED
+ String serialClassName = serialClass.getName();
+ if (serialClass.isArray()) {
+ serialClassName = serialClass.getComponentType().getName();
+ }
+ if (sanctionedClasses.contains(serialClassName)) {
+ return ObjectInputFilter_Status_ALLOWED;
+ }
+
+ // check the filter to determine if the class is ALLOWED
+ Object objectInputFilter_Status =
+ ObjectInputFilter_checkInput.invoke(objectInputFilter, objectInputFilter_filterInfo);
+ if (objectInputFilter_Status == ObjectInputFilter_Status_REJECTED) {
+ logger.fatal("Serialization filter is rejecting class {}", serialClassName,
+ new InvalidClassException(serialClassName));
+ }
+ return objectInputFilter_Status;
+ }
+
+ @Override
+ public String toString() {
+ return new StringBuilder(getClass().getSimpleName())
+ .append("@")
+ .append(Integer.toHexString(hashCode()))
+ .append('{')
+ .append("objectInputFilter=").append(objectInputFilter)
+ .append(", sanctionedClassesCount=").append(sanctionedClasses.size())
+ .append('}')
+ .toString();
+ }
+}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilter.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilter.java
index 4a1152d..164bffc 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilter.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilter.java
@@ -15,7 +15,8 @@
package org.apache.geode.internal.serialization.filter;
import static java.util.Collections.unmodifiableCollection;
-import static org.apache.geode.internal.serialization.filter.ObjectInputFilterUtils.throwUnsupportedOperationException;
+import static java.util.Objects.requireNonNull;
+import static org.apache.commons.lang3.exception.ExceptionUtils.getRootCause;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
@@ -35,7 +36,7 @@ class ReflectiveFacadeGlobalSerialFilter implements GlobalSerialFilter {
*/
ReflectiveFacadeGlobalSerialFilter(ObjectInputFilterApi api, String pattern,
Collection<String> sanctionedClasses) {
- this.api = api;
+ this.api = requireNonNull(api, "ObjectInputFilterApi is required");
this.pattern = pattern;
this.sanctionedClasses = unmodifiableCollection(sanctionedClasses);
}
@@ -44,7 +45,7 @@ class ReflectiveFacadeGlobalSerialFilter implements GlobalSerialFilter {
* Invokes interface-defined operation to set this as the process-wide filter.
*/
@Override
- public void setFilter() {
+ public void setFilter() throws UnableToSetSerialFilterException {
try {
// create the ObjectInputFilter to set as the global serial filter
Object objectInputFilter = api.createObjectInputFilterProxy(pattern, sanctionedClasses);
@@ -53,9 +54,7 @@ class ReflectiveFacadeGlobalSerialFilter implements GlobalSerialFilter {
api.setSerialFilter(objectInputFilter);
} catch (IllegalAccessException | InvocationTargetException e) {
- throwUnsupportedOperationException(
- "Geode was unable to configure a global serialization filter",
- e);
+ handleExceptionThrownByApi(e);
}
}
@@ -68,4 +67,36 @@ class ReflectiveFacadeGlobalSerialFilter implements GlobalSerialFilter {
.append('}')
.toString();
}
+
+ private void handleExceptionThrownByApi(ReflectiveOperationException e)
+ throws UnableToSetSerialFilterException {
+ String className = getClassName(e);
+ switch (className) {
+ case "java.lang.IllegalAccessException":
+ throw new UnableToSetSerialFilterException(
+ "Unable to configure a global serialization filter using reflection.",
+ e);
+ case "java.lang.reflect.InvocationTargetException":
+ if (getRootCause(e) instanceof IllegalStateException) {
+ // ObjectInputFilter throws IllegalStateException
+ // if the filter has already been set non-null
+ throw new FilterAlreadyConfiguredException(
+ "Unable to configure a global serialization filter because filter has already been set non-null.",
+ e);
+ }
+ String causeClassName = e.getCause() == null ? getClassName(e) : getClassName(e.getCause());
+ throw new UnableToSetSerialFilterException(
+ "Unable to configure a global serialization filter because invocation target threw "
+ + causeClassName + ".",
+ e);
+ default:
+ throw new UnableToSetSerialFilterException(
+ "Unable to configure a global serialization filter.",
+ e);
+ }
+ }
+
+ private static String getClassName(Throwable throwable) {
+ return throwable.getClass().getName();
+ }
}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilterFactory.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilterFactory.java
index 022c766..3826e00 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilterFactory.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilterFactory.java
@@ -14,11 +14,8 @@
*/
package org.apache.geode.internal.serialization.filter;
-import static java.util.Objects.requireNonNull;
-
import java.util.Collection;
-
-import org.apache.geode.annotations.VisibleForTesting;
+import java.util.function.Supplier;
/**
* Creates an instance of {@code GlobalSerialFilter} that delegates to {@code ObjectInputFilterApi}
@@ -26,19 +23,24 @@ import org.apache.geode.annotations.VisibleForTesting;
*/
class ReflectiveFacadeGlobalSerialFilterFactory implements GlobalSerialFilterFactory {
- private final ObjectInputFilterApi api;
+ private final Supplier<ObjectInputFilterApi> objectInputFilterApiSupplier;
ReflectiveFacadeGlobalSerialFilterFactory() {
- this(new ReflectiveObjectInputFilterApiFactory().createObjectInputFilterApi());
+ this(() -> new ReflectiveObjectInputFilterApiFactory().createObjectInputFilterApi());
+ }
+
+ ReflectiveFacadeGlobalSerialFilterFactory(ObjectInputFilterApi objectInputFilterApi) {
+ this(() -> objectInputFilterApi);
}
- @VisibleForTesting
- ReflectiveFacadeGlobalSerialFilterFactory(ObjectInputFilterApi api) {
- this.api = requireNonNull(api, "ObjectInputFilterApi is required");
+ ReflectiveFacadeGlobalSerialFilterFactory(
+ Supplier<ObjectInputFilterApi> objectInputFilterApiSupplier) {
+ this.objectInputFilterApiSupplier = objectInputFilterApiSupplier;
}
@Override
public GlobalSerialFilter create(String pattern, Collection<String> sanctionedClasses) {
+ ObjectInputFilterApi api = objectInputFilterApiSupplier.get();
return new ReflectiveFacadeGlobalSerialFilter(api, pattern, sanctionedClasses);
}
}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeObjectInputFilterFactory.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeObjectInputFilterFactory.java
deleted file mode 100644
index a38416c..0000000
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeObjectInputFilterFactory.java
+++ /dev/null
@@ -1,61 +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.geode.internal.serialization.filter;
-
-import static java.util.Objects.requireNonNull;
-import static org.apache.geode.internal.serialization.filter.ObjectInputFilterUtils.supportsObjectInputFilter;
-import static org.apache.geode.internal.serialization.filter.ObjectInputFilterUtils.throwUnsupportedOperationException;
-
-import java.util.Set;
-
-/**
- * Creates an instance of {@code ObjectInputFilter} that delegates to {@code ObjectInputFilterApi}
- * to maintain independence from the JRE version.
- */
-public class ReflectiveFacadeObjectInputFilterFactory implements ObjectInputFilterFactory {
-
- private static final String UNSUPPORTED_MESSAGE =
- "A serialization filter has been specified but this version of Java does not support serialization filters - ObjectInputFilter is not available";
-
- private final ObjectInputFilterApi api;
-
- public ReflectiveFacadeObjectInputFilterFactory() {
- this(new ReflectiveObjectInputFilterApiFactory().createObjectInputFilterApi());
- }
-
- private ReflectiveFacadeObjectInputFilterFactory(ObjectInputFilterApi api) {
- this.api = requireNonNull(api, "ObjectInputFilterApi is required");
- }
-
- @Override
- public ObjectInputFilter create(SerializableObjectConfig config, Set<String> sanctionedClasses) {
- if (config.getValidateSerializableObjects()) {
- requireObjectInputFilter();
-
- String pattern = new SanctionedSerializablesFilterPattern()
- .append(config.getSerializableObjectFilter())
- .pattern();
-
- return new ReflectiveFacadeObjectInputFilter(api, pattern, sanctionedClasses);
- }
- return new NullObjectInputFilter();
- }
-
- public static void requireObjectInputFilter() {
- if (!supportsObjectInputFilter()) {
- throwUnsupportedOperationException(UNSUPPORTED_MESSAGE);
- }
- }
-}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeObjectInputFilter.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeStreamSerialFilter.java
similarity index 55%
rename from geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeObjectInputFilter.java
rename to geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeStreamSerialFilter.java
index 08bae44..902cf60 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeObjectInputFilter.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeStreamSerialFilter.java
@@ -15,7 +15,8 @@
package org.apache.geode.internal.serialization.filter;
import static java.util.Collections.unmodifiableCollection;
-import static org.apache.geode.internal.serialization.filter.ObjectInputFilterUtils.throwUnsupportedOperationException;
+import static java.util.Objects.requireNonNull;
+import static org.apache.commons.lang3.exception.ExceptionUtils.getRootCause;
import java.io.ObjectInputStream;
import java.lang.reflect.InvocationTargetException;
@@ -25,7 +26,7 @@ import java.util.Collection;
* Implementation of {@code ObjectInputFilter} that delegates to {@code ObjectInputFilterApi} to
* maintain independence from the JRE version.
*/
-class ReflectiveFacadeObjectInputFilter implements ObjectInputFilter {
+class ReflectiveFacadeStreamSerialFilter implements StreamSerialFilter {
private final ObjectInputFilterApi api;
private final String pattern;
@@ -34,11 +35,11 @@ class ReflectiveFacadeObjectInputFilter implements ObjectInputFilter {
/**
* Constructs instance with the specified collaborators.
*/
- ReflectiveFacadeObjectInputFilter(ObjectInputFilterApi api, String pattern,
+ ReflectiveFacadeStreamSerialFilter(ObjectInputFilterApi api, String pattern,
Collection<String> sanctionedClasses) {
+ this.api = requireNonNull(api, "ObjectInputFilterApi is required");
this.pattern = pattern;
this.sanctionedClasses = unmodifiableCollection(sanctionedClasses);
- this.api = api;
}
/**
@@ -46,7 +47,8 @@ class ReflectiveFacadeObjectInputFilter implements ObjectInputFilter {
* {@code ObjectInputStream}.
*/
@Override
- public void setFilterOn(ObjectInputStream objectInputStream) {
+ public void setFilterOn(ObjectInputStream objectInputStream)
+ throws UnableToSetSerialFilterException {
try {
// create the ObjectInputFilter to set as the global serial filter
Object objectInputFilter = api.createObjectInputFilterProxy(pattern, sanctionedClasses);
@@ -55,10 +57,7 @@ class ReflectiveFacadeObjectInputFilter implements ObjectInputFilter {
api.setObjectInputFilter(objectInputStream, objectInputFilter);
} catch (IllegalAccessException | InvocationTargetException e) {
- throwUnsupportedOperationException(
- "Geode was unable to configure a serialization filter on input stream '"
- + objectInputStream.hashCode() + "'",
- e);
+ handleExceptionThrownByApi(e);
}
}
@@ -75,4 +74,36 @@ class ReflectiveFacadeObjectInputFilter implements ObjectInputFilter {
ObjectInputFilterApi getObjectInputFilterApi() {
return api;
}
+
+ private void handleExceptionThrownByApi(ReflectiveOperationException e)
+ throws UnableToSetSerialFilterException {
+ String className = getClassName(e);
+ switch (className) {
+ case "java.lang.IllegalAccessException":
+ throw new UnableToSetSerialFilterException(
+ "Unable to configure an input stream serialization filter using reflection.",
+ e);
+ case "java.lang.reflect.InvocationTargetException":
+ if (getRootCause(e) instanceof IllegalStateException) {
+ // ObjectInputFilter throws IllegalStateException
+ // if the filter has already been set non-null
+ throw new FilterAlreadyConfiguredException(
+ "Unable to configure an input stream serialization filter because a non-null filter has already been set.",
+ e);
+ }
+ String causeClassName = e.getCause() == null ? getClassName(e) : getClassName(e.getCause());
+ throw new UnableToSetSerialFilterException(
+ "Unable to configure an input stream serialization filter because invocation target threw "
+ + causeClassName + ".",
+ e);
+ default:
+ throw new UnableToSetSerialFilterException(
+ "Unable to configure an input stream serialization filter.",
+ e);
+ }
+ }
+
+ private static String getClassName(Throwable throwable) {
+ return throwable.getClass().getName();
+ }
}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilterFactory.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeStreamSerialFilterFactory.java
similarity index 52%
copy from geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilterFactory.java
copy to geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeStreamSerialFilterFactory.java
index 022c766..3c47998 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilterFactory.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeStreamSerialFilterFactory.java
@@ -14,31 +14,26 @@
*/
package org.apache.geode.internal.serialization.filter;
-import static java.util.Objects.requireNonNull;
-
-import java.util.Collection;
-
-import org.apache.geode.annotations.VisibleForTesting;
+import java.util.Set;
/**
- * Creates an instance of {@code GlobalSerialFilter} that delegates to {@code ObjectInputFilterApi}
+ * Creates an instance of {@code ObjectInputFilter} that delegates to {@code ObjectInputFilterApi}
* to maintain independence from the JRE version.
*/
-class ReflectiveFacadeGlobalSerialFilterFactory implements GlobalSerialFilterFactory {
-
- private final ObjectInputFilterApi api;
-
- ReflectiveFacadeGlobalSerialFilterFactory() {
- this(new ReflectiveObjectInputFilterApiFactory().createObjectInputFilterApi());
- }
-
- @VisibleForTesting
- ReflectiveFacadeGlobalSerialFilterFactory(ObjectInputFilterApi api) {
- this.api = requireNonNull(api, "ObjectInputFilterApi is required");
- }
+public class ReflectiveFacadeStreamSerialFilterFactory implements StreamSerialFilterFactory {
@Override
- public GlobalSerialFilter create(String pattern, Collection<String> sanctionedClasses) {
- return new ReflectiveFacadeGlobalSerialFilter(api, pattern, sanctionedClasses);
+ public StreamSerialFilter create(SerializableObjectConfig config, Set<String> sanctionedClasses) {
+ ObjectInputFilterApi api =
+ new ReflectiveObjectInputFilterApiFactory().createObjectInputFilterApi();
+
+ if (config.getValidateSerializableObjects()) {
+ String pattern = new SanctionedSerializablesFilterPattern()
+ .append(config.getSerializableObjectFilter())
+ .pattern();
+
+ return new ReflectiveFacadeStreamSerialFilter(api, pattern, sanctionedClasses);
+ }
+ return new NullStreamSerialFilter();
}
}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApi.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApi.java
index 10c3aad..7b2e40a 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApi.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApi.java
@@ -14,7 +14,6 @@
*/
package org.apache.geode.internal.serialization.filter;
-import java.io.InvalidClassException;
import java.io.ObjectInputStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
@@ -22,10 +21,7 @@ import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Collection;
-import org.apache.logging.log4j.Logger;
-
import org.apache.geode.annotations.VisibleForTesting;
-import org.apache.geode.logging.internal.log4j.api.LogService;
/**
* Implementation of {@code ObjectInputFilterApi} that uses reflection and a dynamic proxy to wrap
@@ -33,19 +29,17 @@ import org.apache.geode.logging.internal.log4j.api.LogService;
*/
public class ReflectiveObjectInputFilterApi implements ObjectInputFilterApi {
- private static final Logger logger = LogService.getLogger();
-
protected final ApiPackage apiPackage;
// api.package.ObjectInputFilter
protected final Class<?> ObjectInputFilter;
- private final Method ObjectInputFilter_checkInput;
- private final Object ObjectInputFilter_Status_ALLOWED;
- private final Object ObjectInputFilter_Status_REJECTED;
+ protected final Method ObjectInputFilter_checkInput;
+ protected final Object ObjectInputFilter_Status_ALLOWED;
+ protected final Object ObjectInputFilter_Status_REJECTED;
// api.package.ObjectInputFilter$Config
- private final Class<?> ObjectInputFilter_Config;
- private final Method ObjectInputFilter_Config_createFilter;
+ protected final Class<?> ObjectInputFilter_Config;
+ protected final Method ObjectInputFilter_Config_createFilter;
private final Method ObjectInputFilter_Config_getObjectInputFilter;
private final Method ObjectInputFilter_Config_setObjectInputFilter;
private final Method ObjectInputFilter_Config_getSerialFilter;
@@ -53,7 +47,7 @@ public class ReflectiveObjectInputFilterApi implements ObjectInputFilterApi {
// api.package.ObjectInputFilter$FilterInfo
private final Class<?> ObjectInputFilter_FilterInfo;
- private final Method ObjectInputFilter_FilterInfo_serialClass;
+ protected final Method ObjectInputFilter_FilterInfo_serialClass;
/**
* Use reflection to look up the classes and methods for the API.
@@ -144,43 +138,18 @@ public class ReflectiveObjectInputFilterApi implements ObjectInputFilterApi {
* effectively override the call to widen the filter to include the User's addition to the set
* of sanctioned serializables.
*/
- InvocationHandler invocationHandler = (proxy, method, args) -> {
- if (!"checkInput".equals(method.getName())) {
- throw new UnsupportedOperationException(
- "ObjectInputFilter." + method.getName() + " is not implemented");
- }
-
- // fetch the class of the serialized instance
- Object objectInputFilter_filterInfo = args[0];
- Class<?> serialClass =
- (Class<?>) ObjectInputFilter_FilterInfo_serialClass.invoke(objectInputFilter_filterInfo);
- if (serialClass == null) { // no class to check, so nothing to accept-list
- return ObjectInputFilter_checkInput.invoke(objectInputFilter, objectInputFilter_filterInfo);
- }
-
- // check sanctionedClasses to determine if the name of the class is ALLOWED
- String serialClassName = serialClass.getName();
- if (serialClass.isArray()) {
- serialClassName = serialClass.getComponentType().getName();
- }
- if (sanctionedClasses.contains(serialClassName)) {
- return ObjectInputFilter_Status_ALLOWED;
- }
-
- // check the filter to determine if the class is ALLOWED
- Object objectInputFilter_Status =
- ObjectInputFilter_checkInput.invoke(objectInputFilter, objectInputFilter_filterInfo);
- if (objectInputFilter_Status == ObjectInputFilter_Status_REJECTED) {
- logger.fatal("Serialization filter is rejecting class {}", serialClassName,
- new InvalidClassException(serialClassName));
- }
- return objectInputFilter_Status;
- };
+ InvocationHandler invocationHandler = new ObjectInputFilterInvocationHandler(
+ ObjectInputFilter_checkInput,
+ ObjectInputFilter_FilterInfo_serialClass,
+ ObjectInputFilter_Status_ALLOWED,
+ ObjectInputFilter_Status_REJECTED,
+ objectInputFilter,
+ sanctionedClasses);
// wrap the filter within a proxy to inject the above invocation handler
return Proxy.newProxyInstance(
ObjectInputFilter.getClassLoader(),
- new Class[] {ObjectInputFilter},
+ new Class<?>[] {ObjectInputFilter},
invocationHandler);
}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ObjectInputFilter.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/StreamSerialFilter.java
similarity index 76%
rename from geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ObjectInputFilter.java
rename to geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/StreamSerialFilter.java
index 091f8f6..1d182e4 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ObjectInputFilter.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/StreamSerialFilter.java
@@ -20,10 +20,13 @@ import java.io.ObjectInputStream;
* Defines operation to set this serialization filter on an {@code ObjectInputStream}.
*/
@FunctionalInterface
-public interface ObjectInputFilter {
+public interface StreamSerialFilter {
/**
* Sets this serialization filter on the specified {@code ObjectInputStream}.
+ *
+ * @throws FilterAlreadyConfiguredException if a non-null serialization filter already exists
+ * @throws UnableToSetSerialFilterException if there's any failure setting a serialization filter
*/
- void setFilterOn(ObjectInputStream objectInputStream);
+ void setFilterOn(ObjectInputStream objectInputStream) throws UnableToSetSerialFilterException;
}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterFactory.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/StreamSerialFilterFactory.java
similarity index 88%
rename from geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterFactory.java
rename to geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/StreamSerialFilterFactory.java
index c5fe4bf..c5a3113 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterFactory.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/StreamSerialFilterFactory.java
@@ -17,8 +17,8 @@ package org.apache.geode.internal.serialization.filter;
import java.util.Set;
@FunctionalInterface
-public interface ObjectInputFilterFactory {
+public interface StreamSerialFilterFactory {
- ObjectInputFilter create(SerializableObjectConfig serializableObjectConfig,
+ StreamSerialFilter create(SerializableObjectConfig serializableObjectConfig,
Set<String> sanctionedClasses);
}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SystemPropertyGlobalSerialFilterConfigurationFactory.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SystemPropertyGlobalSerialFilterConfigurationFactory.java
index 4c592d3..b78cbfd 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SystemPropertyGlobalSerialFilterConfigurationFactory.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/SystemPropertyGlobalSerialFilterConfigurationFactory.java
@@ -16,6 +16,8 @@ package org.apache.geode.internal.serialization.filter;
import static org.apache.commons.lang3.StringUtils.isBlank;
+import java.util.function.BooleanSupplier;
+
import org.apache.geode.internal.lang.SystemProperty;
/**
@@ -30,9 +32,15 @@ public class SystemPropertyGlobalSerialFilterConfigurationFactory
public SystemPropertyGlobalSerialFilterConfigurationFactory() {
// enable GlobalSerialFilter only under these conditions:
- // (1) jdk.serialFilter must be blank
- // (2) geode.enableGlobalSerialFilter must be set "true"
- this(isBlank(System.getProperty("jdk.serialFilter")) &&
+ // (1) JRE supports ObjectInputFilter in either sun.misc. or java.io. package
+ // (2) jdk.serialFilter must be blank
+ // (3) geode.enableGlobalSerialFilter must be set "true"
+ this(ObjectInputFilterUtils::supportsObjectInputFilter);
+ }
+
+ SystemPropertyGlobalSerialFilterConfigurationFactory(BooleanSupplier supportsObjectInputFilter) {
+ this(supportsObjectInputFilter.getAsBoolean() &&
+ isBlank(System.getProperty("jdk.serialFilter")) &&
SystemProperty
.getProductBooleanProperty("enableGlobalSerialFilter")
.orElse(false));
@@ -47,6 +55,14 @@ public class SystemPropertyGlobalSerialFilterConfigurationFactory
if (enabled) {
return new GlobalSerialFilterConfiguration(serializableObjectConfig);
}
- return () -> false;
+ return new NullFilterConfiguration();
+ }
+
+ private static class NullFilterConfiguration implements FilterConfiguration {
+
+ @Override
+ public boolean configure() {
+ return false;
+ }
}
}
diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/NullObjectInputFilter.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/UnableToSetSerialFilterException.java
similarity index 60%
rename from geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/NullObjectInputFilter.java
rename to geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/UnableToSetSerialFilterException.java
index e25c073..a8683c8 100644
--- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/NullObjectInputFilter.java
+++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/filter/UnableToSetSerialFilterException.java
@@ -14,15 +14,23 @@
*/
package org.apache.geode.internal.serialization.filter;
-import java.io.ObjectInputStream;
-
/**
- * Implementation of {@code ObjectInputFilter} that does nothing.
+ * Checked exception thrown when there's a failure using Java's ObjectInputFilter. All uses of this
+ * exception are caught and rethrown before reaching the user.
*/
-public class NullObjectInputFilter implements ObjectInputFilter {
+public class UnableToSetSerialFilterException extends Exception {
+
+ public UnableToSetSerialFilterException(String message) {
+ super(message);
+ }
- @Override
- public void setFilterOn(ObjectInputStream objectInputStream) {
- // Do nothing, this is the case where we don't filter.
+ public UnableToSetSerialFilterException(String message, Throwable cause) {
+ super(message, cause);
}
+
+ public UnableToSetSerialFilterException(Throwable cause) {
+ super(cause);
+ }
+
+ private static final long serialVersionUID = 3406028558181224120L;
}
diff --git a/geode-serialization/src/main/resources/org/apache/geode/internal/serialization/sanctioned-geode-serialization-serializables.txt b/geode-serialization/src/main/resources/org/apache/geode/internal/serialization/sanctioned-geode-serialization-serializables.txt
index 3133970..29fa124 100644
--- a/geode-serialization/src/main/resources/org/apache/geode/internal/serialization/sanctioned-geode-serialization-serializables.txt
+++ b/geode-serialization/src/main/resources/org/apache/geode/internal/serialization/sanctioned-geode-serialization-serializables.txt
@@ -2,3 +2,5 @@ org/apache/geode/internal/serialization/DSCODE,false,value:byte
org/apache/geode/internal/serialization/DSFIDNotFoundException,true,130596009484324655,dsfid:int,versionOrdinal:short
org/apache/geode/internal/serialization/UnsupportedSerializationVersionException,true,3572445857994216007
org/apache/geode/internal/serialization/filter/ApiPackage,false,prefix:java/lang/String
+org/apache/geode/internal/serialization/filter/FilterAlreadyConfiguredException,true,-6102549374563510704
+org/apache/geode/internal/serialization/filter/UnableToSetSerialFilterException,true,3406028558181224120
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterConfigurationTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterConfigurationTest.java
index a799123..936712b 100644
--- a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterConfigurationTest.java
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/GlobalSerialFilterConfigurationTest.java
@@ -14,60 +14,102 @@
*/
package org.apache.geode.internal.serialization.filter;
+import static org.apache.geode.internal.serialization.filter.SerialFilterAssertions.assertThatSerialFilterIsNull;
import static org.apache.geode.util.internal.UncheckedUtils.uncheckedCast;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.catchThrowable;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
-import java.util.function.Consumer;
+import java.lang.reflect.InvocationTargetException;
+import org.apache.logging.log4j.Logger;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class GlobalSerialFilterConfigurationTest {
- private SerializableObjectConfig config;
+ private SerializableObjectConfig serializableObjectConfig;
private GlobalSerialFilter globalSerialFilter;
- private Consumer<String> logger;
+ private Logger logger;
@Before
public void setUp() {
- config = mock(SerializableObjectConfig.class);
+ serializableObjectConfig = mock(SerializableObjectConfig.class);
globalSerialFilter = mock(GlobalSerialFilter.class);
- logger = uncheckedCast(mock(Consumer.class));
+ logger = uncheckedCast(mock(Logger.class));
+ }
+
+ @After
+ public void serialFilterIsNull() throws InvocationTargetException, IllegalAccessException {
+ assertThatSerialFilterIsNull();
}
@Test
- public void configureLogs_whenUnsupportedOperationExceptionIsThrown_withCause() {
- doThrow(new UnsupportedOperationException(
+ public void logsInfo_whenOperationIsSuccessful() throws UnableToSetSerialFilterException {
+ FilterConfiguration filterConfiguration = new GlobalSerialFilterConfiguration(
+ serializableObjectConfig,
+ logger,
+ (pattern, sanctionedClasses) -> globalSerialFilter);
+
+ filterConfiguration.configure();
+
+ verify(logger).info("Global serialization filter is now configured.");
+ verify(logger, never()).warn(any(Object.class));
+ verify(logger, never()).error(any(Object.class));
+ }
+
+ @Test
+ public void rethrowsWhenIllegalStateExceptionIsThrownByApi()
+ throws UnableToSetSerialFilterException {
+ doThrow(new UnableToSetSerialFilterException(
new IllegalStateException("Serial filter can only be set once")))
.when(globalSerialFilter).setFilter();
FilterConfiguration filterConfiguration = new GlobalSerialFilterConfiguration(
- config, logger, (pattern, sanctionedClasses) -> globalSerialFilter);
+ serializableObjectConfig,
+ (pattern, sanctionedClasses) -> globalSerialFilter);
- filterConfiguration.configure();
+ Throwable thrown = catchThrowable(() -> {
+ filterConfiguration.configure();
+ });
- verify(logger).accept("Global serial filter is already configured.");
+ assertThat(thrown)
+ .isInstanceOf(UnableToSetSerialFilterException.class)
+ .hasMessageContaining("java.lang.IllegalStateException: Serial filter can only be set once")
+ .hasRootCauseInstanceOf(IllegalStateException.class)
+ .hasMessageContaining("Serial filter can only be set once");
}
@Test
- public void configureDoesNotLog_whenUnsupportedOperationExceptionIsThrown_withoutCause() {
- doThrow(new UnsupportedOperationException("testing with no root cause"))
- .when(globalSerialFilter).setFilter();
+ public void rethrowsWhenClassNotFoundExceptionIsThrownByApi()
+ throws UnableToSetSerialFilterException {
+ doThrow(new UnableToSetSerialFilterException(
+ new ClassNotFoundException("sun.misc.ObjectInputFilter")))
+ .when(globalSerialFilter).setFilter();
FilterConfiguration filterConfiguration = new GlobalSerialFilterConfiguration(
- config, logger, (pattern, sanctionedClasses) -> globalSerialFilter);
+ serializableObjectConfig,
+ (pattern, sanctionedClasses) -> globalSerialFilter);
- filterConfiguration.configure();
+ Throwable thrown = catchThrowable(() -> {
+ filterConfiguration.configure();
+ });
- verifyZeroInteractions(logger);
+ assertThat(thrown)
+ .isInstanceOf(UnableToSetSerialFilterException.class)
+ .hasMessageContaining("java.lang.ClassNotFoundException: sun.misc.ObjectInputFilter")
+ .hasRootCauseInstanceOf(ClassNotFoundException.class)
+ .hasMessageContaining("sun.misc.ObjectInputFilter");
}
@Test
- public void configureSetsValidateSerializableObjects() {
- SerializableObjectConfig serializableObjectConfig = mock(SerializableObjectConfig.class);
- FilterConfiguration filterConfiguration =
- new GlobalSerialFilterConfiguration(serializableObjectConfig);
+ public void setsValidateSerializableObjects() throws UnableToSetSerialFilterException {
+ FilterConfiguration filterConfiguration = new GlobalSerialFilterConfiguration(
+ serializableObjectConfig,
+ (pattern, sanctionedClasses) -> globalSerialFilter);
filterConfiguration.configure();
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/JmxSerialFilterConfigurationFactoryTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/JmxSerialFilterConfigurationFactoryTest.java
index e7e72f6..53aa5b7 100644
--- a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/JmxSerialFilterConfigurationFactoryTest.java
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/JmxSerialFilterConfigurationFactoryTest.java
@@ -18,9 +18,13 @@ import static org.apache.commons.lang3.JavaVersion.JAVA_1_8;
import static org.apache.commons.lang3.JavaVersion.JAVA_9;
import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast;
import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtMost;
+import static org.apache.geode.internal.serialization.filter.SerialFilterAssertions.assertThatSerialFilterIsNull;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assumptions.assumeThat;
+import java.lang.reflect.InvocationTargetException;
+
+import org.junit.After;
import org.junit.Rule;
import org.junit.Test;
import org.junit.contrib.java.lang.system.RestoreSystemProperties;
@@ -30,6 +34,11 @@ public class JmxSerialFilterConfigurationFactoryTest {
@Rule
public RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties();
+ @After
+ public void serialFilterIsNull() throws InvocationTargetException, IllegalAccessException {
+ assertThatSerialFilterIsNull();
+ }
+
@Test
public void createsConditionalJmxSerialFilterConfiguration_onJava9orGreater() {
assumeThat(isJavaVersionAtLeast(JAVA_9)).isTrue();
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/JmxSerialFilterConfigurationTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/JmxSerialFilterConfigurationTest.java
index ad05630..75f1efd 100644
--- a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/JmxSerialFilterConfigurationTest.java
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/JmxSerialFilterConfigurationTest.java
@@ -14,13 +14,16 @@
*/
package org.apache.geode.internal.serialization.filter;
+import static org.apache.geode.internal.serialization.filter.SerialFilterAssertions.assertThatSerialFilterIsNull;
import static org.apache.geode.util.internal.UncheckedUtils.uncheckedCast;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
-import java.util.function.Consumer;
+import java.lang.reflect.InvocationTargetException;
+import org.apache.logging.log4j.Logger;
+import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -31,7 +34,7 @@ public class JmxSerialFilterConfigurationTest {
private static final String SYSTEM_PROPERTY = "system.property.name";
private String pattern;
- private Consumer<String> loggerConsumer;
+ private Logger logger;
@Rule
public RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties();
@@ -39,7 +42,12 @@ public class JmxSerialFilterConfigurationTest {
@Before
public void setUp() {
pattern = "the-filter-pattern";
- loggerConsumer = uncheckedCast(mock(Consumer.class));
+ logger = uncheckedCast(mock(Logger.class));
+ }
+
+ @After
+ public void serialFilterIsNull() throws InvocationTargetException, IllegalAccessException {
+ assertThatSerialFilterIsNull();
}
@Test
@@ -50,7 +58,7 @@ public class JmxSerialFilterConfigurationTest {
}
@Test
- public void setsPropertyValue() {
+ public void setsPropertyValue() throws UnableToSetSerialFilterException {
FilterConfiguration filterConfiguration =
new JmxSerialFilterConfiguration(SYSTEM_PROPERTY, pattern);
@@ -62,7 +70,7 @@ public class JmxSerialFilterConfigurationTest {
}
@Test
- public void setsPropertyValue_ifExistingValueIsNull() {
+ public void setsPropertyValue_ifExistingValueIsNull() throws UnableToSetSerialFilterException {
System.clearProperty(SYSTEM_PROPERTY);
FilterConfiguration filterConfiguration =
new JmxSerialFilterConfiguration(SYSTEM_PROPERTY, pattern);
@@ -75,7 +83,7 @@ public class JmxSerialFilterConfigurationTest {
}
@Test
- public void setsPropertyValue_ifExistingValueIsEmpty() {
+ public void setsPropertyValue_ifExistingValueIsEmpty() throws UnableToSetSerialFilterException {
System.setProperty(SYSTEM_PROPERTY, "");
FilterConfiguration filterConfiguration =
new JmxSerialFilterConfiguration(SYSTEM_PROPERTY, pattern);
@@ -88,7 +96,7 @@ public class JmxSerialFilterConfigurationTest {
}
@Test
- public void setsPropertyValue_ifExistingValueIsBlank() {
+ public void setsPropertyValue_ifExistingValueIsBlank() throws UnableToSetSerialFilterException {
System.setProperty(SYSTEM_PROPERTY, " ");
FilterConfiguration filterConfiguration =
new JmxSerialFilterConfiguration(SYSTEM_PROPERTY, pattern);
@@ -101,33 +109,34 @@ public class JmxSerialFilterConfigurationTest {
}
@Test
- public void logsNowConfigured_ifExistingValueIsEmpty() {
+ public void logsSuccess_ifExistingValueIsEmpty() throws UnableToSetSerialFilterException {
System.setProperty(SYSTEM_PROPERTY, "");
FilterConfiguration filterConfiguration =
- new JmxSerialFilterConfiguration(SYSTEM_PROPERTY, pattern, loggerConsumer);
+ new JmxSerialFilterConfiguration(SYSTEM_PROPERTY, pattern, logger);
filterConfiguration.configure();
- verify(loggerConsumer)
- .accept("System property '" + SYSTEM_PROPERTY + "' is now configured with '" +
+ verify(logger)
+ .info("System property '" + SYSTEM_PROPERTY + "' is now configured with '" +
pattern + "'.");
}
@Test
- public void logsNowConfigured_ifExistingValueIsBlank() {
+ public void logsSuccess_ifExistingValueIsBlank() throws UnableToSetSerialFilterException {
System.setProperty(SYSTEM_PROPERTY, " ");
FilterConfiguration filterConfiguration =
- new JmxSerialFilterConfiguration(SYSTEM_PROPERTY, pattern, loggerConsumer);
+ new JmxSerialFilterConfiguration(SYSTEM_PROPERTY, pattern, logger);
filterConfiguration.configure();
- verify(loggerConsumer)
- .accept("System property '" + SYSTEM_PROPERTY + "' is now configured with '" +
+ verify(logger)
+ .info("System property '" + SYSTEM_PROPERTY + "' is now configured with '" +
pattern + "'.");
}
@Test
- public void doesNotSetPropertyValue_ifExistingValueIsNotEmpty() {
+ public void doesNotSetPropertyValue_ifExistingValueIsNotEmpty()
+ throws UnableToSetSerialFilterException {
String existingValue = "existing-value-of-property";
System.setProperty(SYSTEM_PROPERTY, existingValue);
FilterConfiguration filterConfiguration =
@@ -141,15 +150,16 @@ public class JmxSerialFilterConfigurationTest {
}
@Test
- public void logsAlreadyConfiguredMessage_ifExistingPropertyValueIsNotEmpty() {
+ public void logsWarning_ifExistingPropertyValueIsNotEmpty()
+ throws UnableToSetSerialFilterException {
String existingValue = "existing-value-of-property";
System.setProperty(SYSTEM_PROPERTY, existingValue);
FilterConfiguration filterConfiguration =
- new JmxSerialFilterConfiguration(SYSTEM_PROPERTY, pattern, loggerConsumer);
+ new JmxSerialFilterConfiguration(SYSTEM_PROPERTY, pattern, logger);
filterConfiguration.configure();
- verify(loggerConsumer)
- .accept("System property '" + SYSTEM_PROPERTY + "' is already configured.");
+ verify(logger)
+ .info("System property '" + SYSTEM_PROPERTY + "' is already configured.");
}
}
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/NullObjectInputFilterTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/NullObjectInputFilterTest.java
index 9a0b386..aa71714 100644
--- a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/NullObjectInputFilterTest.java
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/NullObjectInputFilterTest.java
@@ -24,9 +24,9 @@ import org.junit.Test;
public class NullObjectInputFilterTest {
@Test
- public void doesNothing() {
+ public void doesNothing() throws UnableToSetSerialFilterException {
ObjectInputStream objectInputStream = mock(ObjectInputStream.class);
- ObjectInputFilter filter = new NullObjectInputFilter();
+ StreamSerialFilter filter = new NullStreamSerialFilter();
filter.setFilterOn(objectInputStream);
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterInvocationHandlerTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterInvocationHandlerTest.java
new file mode 100644
index 0000000..6248ea3
--- /dev/null
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ObjectInputFilterInvocationHandlerTest.java
@@ -0,0 +1,97 @@
+/*
+ * 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.geode.internal.serialization.filter;
+
+import static java.util.Collections.emptySet;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.catchThrowable;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class ObjectInputFilterInvocationHandlerTest {
+
+ private static final String PATTERN = "*";
+
+ private Class<?> ObjectInputFilter;
+ private Method ObjectInputFilter_checkInput;
+ private Method ObjectInputFilter_FilterInfo_serialClass;
+ private Object ObjectInputFilter_Status_ALLOWED;
+ private Object ObjectInputFilter_Status_REJECTED;
+
+ private Object objectInputFilter;
+
+ @Before
+ public void setUp()
+ throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
+ ReflectiveObjectInputFilterApi api =
+ (ReflectiveObjectInputFilterApi) new ReflectiveObjectInputFilterApiFactory()
+ .createObjectInputFilterApi();
+
+ ObjectInputFilter = api.ObjectInputFilter;
+ ObjectInputFilter_checkInput = api.ObjectInputFilter_checkInput;
+ Class<?> objectInputFilter_Config = api.ObjectInputFilter_Config;
+ Method objectInputFilter_Config_createFilter = api.ObjectInputFilter_Config_createFilter;
+ ObjectInputFilter_Status_ALLOWED = api.ObjectInputFilter_Status_ALLOWED;
+ ObjectInputFilter_Status_REJECTED = api.ObjectInputFilter_Status_REJECTED;
+ ObjectInputFilter_FilterInfo_serialClass = api.ObjectInputFilter_FilterInfo_serialClass;
+
+ objectInputFilter = objectInputFilter_Config_createFilter
+ .invoke(objectInputFilter_Config, PATTERN);
+ }
+
+ @Test
+ public void sanctionedClassesIsRequired() {
+ Throwable thrown = catchThrowable(() -> {
+ new ObjectInputFilterInvocationHandler(
+ ObjectInputFilter_checkInput,
+ ObjectInputFilter_FilterInfo_serialClass,
+ ObjectInputFilter_Status_ALLOWED,
+ ObjectInputFilter_Status_REJECTED,
+ objectInputFilter,
+ null);
+ });
+
+ assertThat(thrown).isInstanceOf(NullPointerException.class);
+ }
+
+ @Test
+ public void toStringIsInvokedOnProxiedInstance() {
+ InvocationHandler invocationHandler = new ObjectInputFilterInvocationHandler(
+ ObjectInputFilter_checkInput,
+ ObjectInputFilter_FilterInfo_serialClass,
+ ObjectInputFilter_Status_ALLOWED,
+ ObjectInputFilter_Status_REJECTED,
+ objectInputFilter,
+ emptySet());
+ Object proxy = objectInputFilterProxy(invocationHandler);
+
+ String result = proxy.toString();
+
+ assertThat(result).isEqualTo(PATTERN);
+ }
+
+ private Object objectInputFilterProxy(InvocationHandler invocationHandler) {
+ return Proxy.newProxyInstance(
+ getClass().getClassLoader(),
+ new Class[] {ObjectInputFilter},
+ invocationHandler);
+ }
+}
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilterFactoryTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilterFactoryTest.java
index 34c83c4..9a7ca4d 100644
--- a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilterFactoryTest.java
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilterFactoryTest.java
@@ -15,57 +15,61 @@
package org.apache.geode.internal.serialization.filter;
import static java.util.Collections.emptySet;
+import static org.apache.geode.internal.serialization.filter.SerialFilterAssertions.assertThatSerialFilterIsNull;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.ArgumentMatchers.any;
+import static org.assertj.core.api.Assertions.catchThrowable;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
import java.lang.reflect.InvocationTargetException;
+import java.util.function.Supplier;
+import org.junit.After;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.contrib.java.lang.system.RestoreSystemProperties;
public class ReflectiveFacadeGlobalSerialFilterFactoryTest {
- @Test
- public void constructsDelegatingGlobalSerialFilter() {
- ObjectInputFilterApi api = mock(ObjectInputFilterApi.class);
- GlobalSerialFilterFactory factory = new ReflectiveFacadeGlobalSerialFilterFactory(api);
+ @Rule
+ public RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties();
- GlobalSerialFilter filter = factory.create("pattern", emptySet());
-
- assertThat(filter).isInstanceOf(ReflectiveFacadeGlobalSerialFilter.class);
+ @After
+ public void serialFilterIsNull() throws InvocationTargetException, IllegalAccessException {
+ assertThatSerialFilterIsNull();
}
+ /**
+ * Creates an instance of ReflectiveFacadeGlobalSerialFilter.
+ */
@Test
- public void delegatesToObjectInputFilterApiToCreateObjectInputFilter()
- throws InvocationTargetException, IllegalAccessException {
+ public void createsReflectiveFacadeGlobalSerialFilter() {
ObjectInputFilterApi api = mock(ObjectInputFilterApi.class);
GlobalSerialFilterFactory factory = new ReflectiveFacadeGlobalSerialFilterFactory(api);
- GlobalSerialFilter filter = factory.create("pattern", emptySet());
- Object objectInputFilter = mock(Object.class);
- when(api.createObjectInputFilterProxy(any(), any()))
- .thenReturn(objectInputFilter);
-
- filter.setFilter();
+ GlobalSerialFilter filter = factory.create("pattern", emptySet());
- verify(api).createObjectInputFilterProxy(any(), any());
+ assertThat(filter).isInstanceOf(ReflectiveFacadeGlobalSerialFilter.class);
}
+ /**
+ * Throws ClassNotFoundException nested inside an UnsupportedOperationException when the trying \
+ * to load the JDK ObjectInputFilter via reflection throws ClassNotFoundException.
+ */
@Test
- public void delegatesToObjectInputFilterApiToSetSerialFilter()
- throws InvocationTargetException, IllegalAccessException {
- ObjectInputFilterApi api = mock(ObjectInputFilterApi.class);
- GlobalSerialFilterFactory factory = new ReflectiveFacadeGlobalSerialFilterFactory(api);
- GlobalSerialFilter filter = factory.create("pattern", emptySet());
- Object objectInputFilter = mock(Object.class);
-
- when(api.createObjectInputFilterProxy(any(), any()))
- .thenReturn(objectInputFilter);
+ public void throws_whenObjectInputFilterClassNotFound() {
+ Supplier<ObjectInputFilterApi> objectInputFilterApiSupplier = () -> {
+ throw new UnsupportedOperationException("ObjectInputFilter is not available.",
+ new ClassNotFoundException("sun.misc.ObjectInputFilter"));
+ };
- filter.setFilter();
+ Throwable thrown = catchThrowable(() -> {
+ new ReflectiveFacadeGlobalSerialFilterFactory(objectInputFilterApiSupplier)
+ .create("pattern", emptySet());
+ });
- verify(api).setSerialFilter(objectInputFilter);
+ assertThat(thrown)
+ .isInstanceOf(UnsupportedOperationException.class)
+ .hasMessage("ObjectInputFilter is not available.")
+ .hasRootCauseInstanceOf(ClassNotFoundException.class);
}
}
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilterTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilterTest.java
index 5966d1b..3e162a1 100644
--- a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilterTest.java
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeGlobalSerialFilterTest.java
@@ -15,20 +15,25 @@
package org.apache.geode.internal.serialization.filter;
import static java.util.Arrays.asList;
+import static java.util.Collections.emptySet;
import static java.util.Collections.singleton;
+import static org.apache.geode.internal.serialization.filter.SerialFilterAssertions.assertThatSerialFilterIsNull;
import static org.apache.geode.util.internal.UncheckedUtils.uncheckedCast;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.catchThrowable;
import static org.mockito.ArgumentCaptor.forClass;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyCollection;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
@@ -36,19 +41,28 @@ import org.mockito.ArgumentCaptor;
public class ReflectiveFacadeGlobalSerialFilterTest {
private ObjectInputFilterApi api;
+ private Object objectInputFilter;
@Before
public void setUp() {
api = mock(ObjectInputFilterApi.class);
+ objectInputFilter = new Object();
+ }
+
+ @After
+ public void serialFilterIsNull() throws InvocationTargetException, IllegalAccessException {
+ assertThatSerialFilterIsNull();
}
@Test
public void createsObjectInputFilterProxy()
- throws InvocationTargetException, IllegalAccessException {
+ throws InvocationTargetException, IllegalAccessException, UnableToSetSerialFilterException {
String pattern = "the-pattern";
Collection<String> sanctionedClasses = asList("class-name-one", "class-name-two");
GlobalSerialFilter globalSerialFilter =
new ReflectiveFacadeGlobalSerialFilter(api, pattern, sanctionedClasses);
+ when(api.createObjectInputFilterProxy(eq("the-pattern"), anyCollection()))
+ .thenReturn(objectInputFilter);
globalSerialFilter.setFilter();
@@ -58,9 +72,12 @@ public class ReflectiveFacadeGlobalSerialFilterTest {
}
@Test
- public void setsSerialFilter() throws InvocationTargetException, IllegalAccessException {
+ public void setsSerialFilter()
+ throws InvocationTargetException, IllegalAccessException, UnableToSetSerialFilterException {
GlobalSerialFilter globalSerialFilter =
new ReflectiveFacadeGlobalSerialFilter(api, "the-pattern", singleton("class-name"));
+ when(api.createObjectInputFilterProxy(eq("the-pattern"), anyCollection()))
+ .thenReturn(objectInputFilter);
globalSerialFilter.setFilter();
@@ -68,37 +85,81 @@ public class ReflectiveFacadeGlobalSerialFilterTest {
}
@Test
- public void propagatesIllegalAccessExceptionInUnsupportedOperationException()
+ public void propagatesIllegalAccessExceptionInObjectInputFilterException()
throws InvocationTargetException, IllegalAccessException {
- IllegalAccessException exception = new IllegalAccessException("testing");
- doThrow(exception).when(api).setSerialFilter(any());
GlobalSerialFilter globalSerialFilter =
new ReflectiveFacadeGlobalSerialFilter(api, "the-pattern", singleton("class-name"));
+ IllegalAccessException illegalAccessException = new IllegalAccessException("testing");
+ when(api.createObjectInputFilterProxy(eq("the-pattern"), anyCollection()))
+ .thenReturn(objectInputFilter);
+ doThrow(illegalAccessException)
+ .when(api).setSerialFilter(any());
Throwable thrown = catchThrowable(() -> {
globalSerialFilter.setFilter();
});
assertThat(thrown)
- .isInstanceOf(UnsupportedOperationException.class)
- .hasRootCause(exception);
+ .isInstanceOf(UnableToSetSerialFilterException.class)
+ .hasMessage("Unable to configure a global serialization filter using reflection.")
+ .hasRootCause(illegalAccessException);
}
@Test
- public void propagatesInvocationTargetExceptionInUnsupportedOperationException()
+ public void propagatesInvocationTargetExceptionInObjectInputFilterException()
throws InvocationTargetException, IllegalAccessException {
- InvocationTargetException exception =
+ GlobalSerialFilter globalSerialFilter =
+ new ReflectiveFacadeGlobalSerialFilter(api, "the-pattern", singleton("class-name"));
+ InvocationTargetException invocationTargetException =
new InvocationTargetException(new Exception("testing"), "testing");
- doThrow(exception).when(api).setSerialFilter(any());
+ doThrow(invocationTargetException).when(api).setSerialFilter(any());
+
+ Throwable thrown = catchThrowable(() -> {
+ globalSerialFilter.setFilter();
+ });
+
+ assertThat(thrown)
+ .isInstanceOf(UnableToSetSerialFilterException.class)
+ .hasMessage(
+ "Unable to configure a global serialization filter because invocation target threw "
+ + Exception.class.getName() + ".")
+ .hasCause(invocationTargetException)
+ .hasRootCauseInstanceOf(Exception.class);
+ }
+
+ /**
+ * The ObjectInputFilter API throws IllegalStateException nested within InvocationTargetException
+ * if a non-null filter already exists.
+ */
+ @Test
+ public void propagatesNestedIllegalStateExceptionInObjectInputFilterException()
+ throws InvocationTargetException, IllegalAccessException {
GlobalSerialFilter globalSerialFilter =
new ReflectiveFacadeGlobalSerialFilter(api, "the-pattern", singleton("class-name"));
+ InvocationTargetException invocationTargetException =
+ new InvocationTargetException(new IllegalStateException("testing"), "testing");
+ doThrow(invocationTargetException).when(api).setSerialFilter(any());
Throwable thrown = catchThrowable(() -> {
globalSerialFilter.setFilter();
});
assertThat(thrown)
- .isInstanceOf(UnsupportedOperationException.class)
- .hasCause(exception);
+ .isInstanceOf(FilterAlreadyConfiguredException.class)
+ .hasMessage(
+ "Unable to configure a global serialization filter because filter has already been set non-null.")
+ .hasCauseInstanceOf(InvocationTargetException.class)
+ .hasRootCauseInstanceOf(IllegalStateException.class);
+ }
+
+ @Test
+ public void requiresObjectInputFilterApi() {
+ Throwable thrown = catchThrowable(() -> {
+ new ReflectiveFacadeGlobalSerialFilter(null, "pattern", emptySet());
+ });
+
+ assertThat(thrown)
+ .isInstanceOf(NullPointerException.class)
+ .hasMessage("ObjectInputFilterApi is required");
}
}
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeObjectInputFilterFactoryTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeObjectInputFilterFactoryTest.java
index e35b5bd..30c947b 100644
--- a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeObjectInputFilterFactoryTest.java
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeObjectInputFilterFactoryTest.java
@@ -48,10 +48,10 @@ public class ReflectiveFacadeObjectInputFilterFactoryTest {
assumeThat(isJavaVersionAtLeast(JAVA_9)).isTrue();
// arrange
- ObjectInputFilterFactory factory = new ReflectiveFacadeObjectInputFilterFactory();
+ StreamSerialFilterFactory factory = new ReflectiveFacadeStreamSerialFilterFactory();
// act
- ObjectInputFilter objectInputFilter = factory.create(config, SANCTIONED_CLASSES);
+ StreamSerialFilter objectInputFilter = factory.create(config, SANCTIONED_CLASSES);
// assert
assertThat(getApiPackage(getObjectInputFilterApi(objectInputFilter))).isEqualTo(JAVA_IO);
@@ -62,17 +62,17 @@ public class ReflectiveFacadeObjectInputFilterFactoryTest {
assumeThat(isJavaVersionAtMost(JAVA_1_8)).isTrue();
// arrange
- ObjectInputFilterFactory factory = new ReflectiveFacadeObjectInputFilterFactory();
+ StreamSerialFilterFactory factory = new ReflectiveFacadeStreamSerialFilterFactory();
// act
- ObjectInputFilter objectInputFilter = factory.create(config, SANCTIONED_CLASSES);
+ StreamSerialFilter objectInputFilter = factory.create(config, SANCTIONED_CLASSES);
// assert
assertThat(getApiPackage(getObjectInputFilterApi(objectInputFilter))).isEqualTo(SUN_MISC);
}
- private static ObjectInputFilterApi getObjectInputFilterApi(ObjectInputFilter result) {
- ReflectiveFacadeObjectInputFilter impl = (ReflectiveFacadeObjectInputFilter) result;
+ private static ObjectInputFilterApi getObjectInputFilterApi(StreamSerialFilter result) {
+ ReflectiveFacadeStreamSerialFilter impl = (ReflectiveFacadeStreamSerialFilter) result;
ObjectInputFilterApi objectInputFilterApi = impl.getObjectInputFilterApi();
assertThat(objectInputFilterApi).isInstanceOf(ReflectiveObjectInputFilterApi.class);
return objectInputFilterApi;
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeObjectInputFilterTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeObjectInputFilterTest.java
index cca697f..654e94a 100644
--- a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeObjectInputFilterTest.java
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveFacadeObjectInputFilterTest.java
@@ -50,11 +50,11 @@ public class ReflectiveFacadeObjectInputFilterTest {
@Test
public void createsObjectInputFilterProxy()
- throws InvocationTargetException, IllegalAccessException {
+ throws InvocationTargetException, IllegalAccessException, UnableToSetSerialFilterException {
String pattern = "the-pattern";
Collection<String> sanctionedClasses = asList("class-name-one", "class-name-two");
- ObjectInputFilter objectInputFilter =
- new ReflectiveFacadeObjectInputFilter(api, pattern, sanctionedClasses);
+ StreamSerialFilter objectInputFilter =
+ new ReflectiveFacadeStreamSerialFilter(api, pattern, sanctionedClasses);
objectInputFilter.setFilterOn(objectInputStream);
@@ -64,9 +64,10 @@ public class ReflectiveFacadeObjectInputFilterTest {
}
@Test
- public void setsSerialFilter() throws InvocationTargetException, IllegalAccessException {
- ObjectInputFilter objectInputFilter =
- new ReflectiveFacadeObjectInputFilter(api, "the-pattern", singleton("class-name"));
+ public void setsSerialFilter()
+ throws InvocationTargetException, IllegalAccessException, UnableToSetSerialFilterException {
+ StreamSerialFilter objectInputFilter =
+ new ReflectiveFacadeStreamSerialFilter(api, "the-pattern", singleton("class-name"));
objectInputFilter.setFilterOn(objectInputStream);
@@ -76,43 +77,74 @@ public class ReflectiveFacadeObjectInputFilterTest {
@Test
public void propagatesIllegalAccessExceptionInUnsupportedOperationException()
throws InvocationTargetException, IllegalAccessException {
- IllegalAccessException exception = new IllegalAccessException("testing");
- doThrow(exception).when(api).setObjectInputFilter(same(objectInputStream), any());
- ObjectInputFilter objectInputFilter =
- new ReflectiveFacadeObjectInputFilter(api, "the-pattern", singleton("class-name"));
+ IllegalAccessException illegalAccessException = new IllegalAccessException("testing");
+ doThrow(illegalAccessException).when(api).setObjectInputFilter(same(objectInputStream), any());
+ StreamSerialFilter objectInputFilter =
+ new ReflectiveFacadeStreamSerialFilter(api, "the-pattern", singleton("class-name"));
Throwable thrown = catchThrowable(() -> {
objectInputFilter.setFilterOn(objectInputStream);
});
assertThat(thrown)
- .isInstanceOf(UnsupportedOperationException.class)
- .hasRootCause(exception);
+ .isInstanceOf(UnableToSetSerialFilterException.class)
+ .hasMessage("Unable to configure an input stream serialization filter using reflection.")
+ .hasRootCause(illegalAccessException);
}
@Test
public void propagatesInvocationTargetExceptionInUnsupportedOperationException()
throws InvocationTargetException, IllegalAccessException {
- InvocationTargetException exception =
+ InvocationTargetException invocationTargetException =
new InvocationTargetException(new Exception("testing"), "testing");
- doThrow(exception).when(api).setObjectInputFilter(same(objectInputStream), any());
- ObjectInputFilter objectInputFilter =
- new ReflectiveFacadeObjectInputFilter(api, "the-pattern", singleton("class-name"));
+ doThrow(invocationTargetException).when(api).setObjectInputFilter(same(objectInputStream),
+ any());
+ StreamSerialFilter objectInputFilter =
+ new ReflectiveFacadeStreamSerialFilter(api, "the-pattern", singleton("class-name"));
Throwable thrown = catchThrowable(() -> {
objectInputFilter.setFilterOn(objectInputStream);
});
assertThat(thrown)
- .isInstanceOf(UnsupportedOperationException.class)
- .hasCause(exception);
+ .isInstanceOf(UnableToSetSerialFilterException.class)
+ .hasMessage(
+ "Unable to configure an input stream serialization filter because invocation target threw "
+ + Exception.class.getName() + ".")
+ .hasCause(invocationTargetException);
}
+ /**
+ * The ObjectInputFilter API throws IllegalStateException nested within InvocationTargetException
+ * if a non-null filter already exists.
+ */
@Test
- public void delegatesToObjectInputFilterApiToCreateObjectInputFilter()
+ public void propagatesNestedIllegalStateExceptionInObjectInputFilterException()
throws InvocationTargetException, IllegalAccessException {
+ StreamSerialFilter objectInputFilter =
+ new ReflectiveFacadeStreamSerialFilter(api, "the-pattern", singleton("class-name"));
+ InvocationTargetException invocationTargetException =
+ new InvocationTargetException(new IllegalStateException("testing"), "testing");
+ doThrow(invocationTargetException)
+ .when(api).setObjectInputFilter(same(objectInputStream), any());
+
+ Throwable thrown = catchThrowable(() -> {
+ objectInputFilter.setFilterOn(objectInputStream);
+ });
+
+ assertThat(thrown)
+ .isInstanceOf(FilterAlreadyConfiguredException.class)
+ .hasMessage(
+ "Unable to configure an input stream serialization filter because a non-null filter has already been set.")
+ .hasCauseInstanceOf(InvocationTargetException.class)
+ .hasRootCauseInstanceOf(IllegalStateException.class);
+ }
+
+ @Test
+ public void delegatesToObjectInputFilterApiToCreateObjectInputFilter()
+ throws InvocationTargetException, IllegalAccessException, UnableToSetSerialFilterException {
ObjectInputFilterApi api = mock(ObjectInputFilterApi.class);
- ObjectInputFilter filter = new ReflectiveFacadeObjectInputFilter(api, "pattern", emptySet());
+ StreamSerialFilter filter = new ReflectiveFacadeStreamSerialFilter(api, "pattern", emptySet());
Object objectInputFilter = mock(Object.class);
ObjectInputStream objectInputStream = mock(ObjectInputStream.class);
@@ -126,9 +158,9 @@ public class ReflectiveFacadeObjectInputFilterTest {
@Test
public void delegatesToObjectInputFilterApiToSetFilterOnObjectInputStream()
- throws InvocationTargetException, IllegalAccessException {
+ throws InvocationTargetException, IllegalAccessException, UnableToSetSerialFilterException {
ObjectInputFilterApi api = mock(ObjectInputFilterApi.class);
- ObjectInputFilter filter = new ReflectiveFacadeObjectInputFilter(api, "pattern", emptySet());
+ StreamSerialFilter filter = new ReflectiveFacadeStreamSerialFilter(api, "pattern", emptySet());
Object objectInputFilter = mock(Object.class);
ObjectInputStream objectInputStream = mock(ObjectInputStream.class);
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiFactoryTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiFactoryTest.java
index b3ac61f..a1eb877 100644
--- a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiFactoryTest.java
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiFactoryTest.java
@@ -18,13 +18,22 @@ import static org.apache.commons.lang3.JavaVersion.JAVA_1_8;
import static org.apache.commons.lang3.JavaVersion.JAVA_9;
import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast;
import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtMost;
+import static org.apache.geode.internal.serialization.filter.SerialFilterAssertions.assertThatSerialFilterIsNull;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assumptions.assumeThat;
+import java.lang.reflect.InvocationTargetException;
+
+import org.junit.After;
import org.junit.Test;
public class ReflectiveObjectInputFilterApiFactoryTest {
+ @After
+ public void serialFilterIsNull() throws InvocationTargetException, IllegalAccessException {
+ assertThatSerialFilterIsNull();
+ }
+
@Test
public void createsInstanceOfReflectionObjectInputFilterApi() {
ObjectInputFilterApiFactory factory = new ReflectiveObjectInputFilterApiFactory();
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiTest.java
index 8cf1f8c..b456eb3 100644
--- a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiTest.java
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/ReflectiveObjectInputFilterApiTest.java
@@ -22,6 +22,7 @@ import static org.apache.commons.lang3.JavaVersion.JAVA_1_8;
import static org.apache.commons.lang3.JavaVersion.JAVA_9;
import static org.apache.commons.lang3.SerializationUtils.serialize;
import static org.apache.commons.lang3.SystemUtils.isJavaVersionAtLeast;
+import static org.apache.geode.internal.serialization.filter.SerialFilterAssertions.assertThatSerialFilterIsNull;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.catchThrowable;
@@ -32,6 +33,7 @@ import java.io.ObjectInputStream;
import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -48,6 +50,11 @@ public class ReflectiveObjectInputFilterApiTest {
}
}
+ @After
+ public void serialFilterIsNull() throws InvocationTargetException, IllegalAccessException {
+ assertThatSerialFilterIsNull();
+ }
+
@Test
public void createFilterGivenValidPatternReturnsNewFilter()
throws IllegalAccessException, InvocationTargetException {
@@ -89,9 +96,7 @@ public class ReflectiveObjectInputFilterApiTest {
Object filter = api.getSerialFilter();
- assertThat(filter)
- .as("ObjectInputFilter$Config.getSerialFilter()")
- .isNull();
+ assertThat(filter).isNull();
}
@Test
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/SerialFilterAssertions.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SerialFilterAssertions.java
similarity index 52%
copy from geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/SerialFilterAssertions.java
copy to geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SerialFilterAssertions.java
index b6d552a..760e391 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/internal/serialization/filter/SerialFilterAssertions.java
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SerialFilterAssertions.java
@@ -14,12 +14,14 @@
*/
package org.apache.geode.internal.serialization.filter;
+import static java.lang.System.lineSeparator;
+import static org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace;
import static org.assertj.core.api.Assertions.assertThat;
import java.lang.reflect.InvocationTargetException;
-@SuppressWarnings({"unused", "WeakerAccess"})
-public class SerialFilterAssertions {
+@SuppressWarnings("unused")
+class SerialFilterAssertions {
private static final ObjectInputFilterApi API = new ReflectiveObjectInputFilterApiFactory()
.createObjectInputFilterApi();
@@ -28,37 +30,40 @@ public class SerialFilterAssertions {
// do not instantiate
}
- public static void assertThatSerialFilterIsNull()
+ static void assertThatSerialFilterIsNull()
throws InvocationTargetException, IllegalAccessException {
- boolean exists = API.getSerialFilter() != null;
- assertThat(exists)
- .as("ObjectInputFilter$Config.getSerialFilter() is null")
- .isFalse();
+ assertThat(API.getSerialFilter())
+ .as("ObjectInputFilter$Config.getSerialFilter()")
+ .isNull();
}
- public static void assertThatSerialFilterIsNotNull()
+ static void assertThatSerialFilterIsNotNull()
throws InvocationTargetException, IllegalAccessException {
- boolean exists = API.getSerialFilter() != null;
- assertThat(exists)
- .as("ObjectInputFilter$Config.getSerialFilter() is not null")
- .isTrue();
+ assertThat(API.getSerialFilter())
+ .as("ObjectInputFilter$Config.getSerialFilter()")
+ .isNotNull();
}
- public static void assertThatSerialFilterIsSameAs(Object objectInputFilter)
+ static void assertThatSerialFilterIsSameAs(Object objectInputFilter)
throws InvocationTargetException, IllegalAccessException {
- Object currentFilter = API.getSerialFilter();
- boolean sameIdentity = currentFilter == objectInputFilter;
- assertThat(sameIdentity)
- .as("ObjectInputFilter$Config.getSerialFilter() is same as parameter")
- .isTrue();
+ assertThat(API.getSerialFilter())
+ .as("ObjectInputFilter$Config.getSerialFilter()")
+ .isSameAs(objectInputFilter);
}
- public static void assertThatSerialFilterIsNotSameAs(Object objectInputFilter)
+ static void assertThatSerialFilterIsNotSameAs(Object objectInputFilter)
throws InvocationTargetException, IllegalAccessException {
- Object currentFilter = API.getSerialFilter();
- boolean sameIdentity = currentFilter == objectInputFilter;
- assertThat(sameIdentity)
- .as("ObjectInputFilter$Config.getSerialFilter() is same as parameter")
- .isFalse();
+ assertThat(API.getSerialFilter())
+ .as("ObjectInputFilter$Config.getSerialFilter()")
+ .isNotSameAs(objectInputFilter);
+ }
+
+ static String failMessageWithStackTraces(String message, Iterable<Throwable> stackTraces) {
+ StringBuilder formattedStackTraces = new StringBuilder(message);
+ for (Throwable stackTrace : stackTraces) {
+ formattedStackTraces.append(lineSeparator());
+ formattedStackTraces.append(getStackTrace(stackTrace));
+ }
+ return formattedStackTraces.toString();
}
}
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SystemPropertyGlobalSerialFilterConfigurationFactoryTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SystemPropertyGlobalSerialFilterConfigurationFactoryTest.java
index 45070a6..0d01e7a 100644
--- a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SystemPropertyGlobalSerialFilterConfigurationFactoryTest.java
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SystemPropertyGlobalSerialFilterConfigurationFactoryTest.java
@@ -14,62 +14,131 @@
*/
package org.apache.geode.internal.serialization.filter;
+import static org.apache.geode.internal.serialization.filter.SerialFilterAssertions.assertThatSerialFilterIsNull;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatCode;
import static org.mockito.Mockito.mock;
+import java.lang.reflect.InvocationTargetException;
+
+import org.junit.After;
+import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.contrib.java.lang.system.RestoreSystemProperties;
public class SystemPropertyGlobalSerialFilterConfigurationFactoryTest {
+ private SerializableObjectConfig config;
+
@Rule
public RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties();
+ @Before
+ public void setUp() {
+ config = mock(SerializableObjectConfig.class);
+ }
+
+ @After
+ public void serialFilterIsNull() throws InvocationTargetException, IllegalAccessException {
+ assertThatSerialFilterIsNull();
+ }
+
@Test
- public void createsConditionalGlobalSerialFilterConfiguration_whenEnableGlobalSerialFilter_isSet() {
- System.setProperty("geode.enableGlobalSerialFilter", "true");
+ public void createsNoOp_whenEnableGlobalSerialFilterIsFalse()
+ throws UnableToSetSerialFilterException {
+ System.clearProperty("geode.enableGlobalSerialFilter");
GlobalSerialFilterConfigurationFactory factory =
new SystemPropertyGlobalSerialFilterConfigurationFactory();
- FilterConfiguration filterConfiguration = factory.create(mock(SerializableObjectConfig.class));
+ FilterConfiguration configuration = factory.create(config);
- assertThat(filterConfiguration).isInstanceOf(GlobalSerialFilterConfiguration.class);
+ boolean result = configuration.configure();
+
+ assertThat(result).isFalse();
}
@Test
- public void createsNoOp_whenEnableGlobalSerialFilter_isNotSet() {
+ public void createsEnabledGlobalSerialFilterConfiguration_whenEnableGlobalSerialFilterIsTrue() {
+ System.setProperty("geode.enableGlobalSerialFilter", "true");
GlobalSerialFilterConfigurationFactory factory =
new SystemPropertyGlobalSerialFilterConfigurationFactory();
- FilterConfiguration filterConfiguration = factory.create(mock(SerializableObjectConfig.class));
+ FilterConfiguration configuration = factory.create(config);
- assertThat(filterConfiguration)
- .isNotInstanceOf(GlobalSerialFilterConfiguration.class);
+ // don't actually invoke configure because this is a unit test
+ assertThat(configuration).isInstanceOf(GlobalSerialFilterConfiguration.class);
}
@Test
- public void createsNoOp_whenJdkSerialFilter_isSet() {
+ public void createsNoOp_whenJdkSerialFilterExists() throws UnableToSetSerialFilterException {
System.setProperty("jdk.serialFilter", "*");
GlobalSerialFilterConfigurationFactory factory =
new SystemPropertyGlobalSerialFilterConfigurationFactory();
- FilterConfiguration filterConfiguration = factory.create(mock(SerializableObjectConfig.class));
+ FilterConfiguration configuration = factory.create(config);
- assertThat(filterConfiguration)
- .isNotInstanceOf(GlobalSerialFilterConfiguration.class);
+ boolean result = configuration.configure();
+
+ assertThat(result).isFalse();
}
@Test
- public void createsNoOp_whenJdkSerialFilter_andEnableGlobalSerialFilter_areBothSet() {
+ public void createsNoOp_whenJdkSerialFilterExists_andEnableGlobalSerialFilterIsTrue()
+ throws UnableToSetSerialFilterException {
System.setProperty("jdk.serialFilter", "*");
System.setProperty("geode.enableGlobalSerialFilter", "true");
GlobalSerialFilterConfigurationFactory factory =
new SystemPropertyGlobalSerialFilterConfigurationFactory();
- FilterConfiguration filterConfiguration = factory.create(mock(SerializableObjectConfig.class));
+ FilterConfiguration configuration = factory.create(config);
+
+ boolean result = configuration.configure();
+
+ assertThat(result).isFalse();
+ }
+
+ @Test
+ public void createsNoOp_whenEnableGlobalSerialFilterIsFalse_andJreDoesNotSupportObjectInputFilter()
+ throws UnableToSetSerialFilterException {
+ boolean supportsObjectInputFilter = false;
+ GlobalSerialFilterConfigurationFactory configurationFactory =
+ new SystemPropertyGlobalSerialFilterConfigurationFactory(() -> supportsObjectInputFilter);
+
+ FilterConfiguration configuration = configurationFactory.create(config);
+
+ boolean result = configuration.configure();
+
+ assertThat(result).isFalse();
+ }
+
+ @Test
+ public void createsNoOp_whenEnableGlobalSerialFilterIsTrue_andJreDoesNotSupportObjectInputFilter()
+ throws UnableToSetSerialFilterException {
+ System.setProperty("geode.enableGlobalSerialFilter", "true");
+ boolean supportsObjectInputFilter = false;
+ GlobalSerialFilterConfigurationFactory configurationFactory =
+ new SystemPropertyGlobalSerialFilterConfigurationFactory(() -> supportsObjectInputFilter);
+
+ FilterConfiguration configuration = configurationFactory.create(config);
+
+ boolean result = configuration.configure();
+
+ assertThat(result).isFalse();
+ }
+
+ @Test
+ public void doesNotThrow_whenEnableGlobalSerialFilterIsFalse_andJreDoesNotSupportObjectInputFilter() {
+ System.clearProperty("geode.enableGlobalSerialFilter");
+ GlobalSerialFilterConfigurationFactory factory =
+ new SystemPropertyGlobalSerialFilterConfigurationFactory();
+
+ assertThatCode(() -> {
+
+ FilterConfiguration configuration = factory.create(config);
+
+ configuration.configure();
- assertThat(filterConfiguration)
- .isNotInstanceOf(GlobalSerialFilterConfiguration.class);
+ }).doesNotThrowAnyException();
}
}
diff --git a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SystemPropertyJmxSerialFilterConfigurationFactoryTest.java b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SystemPropertyJmxSerialFilterConfigurationFactoryTest.java
index d95ef9c..76a9a51 100644
--- a/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SystemPropertyJmxSerialFilterConfigurationFactoryTest.java
+++ b/geode-serialization/src/test/java/org/apache/geode/internal/serialization/filter/SystemPropertyJmxSerialFilterConfigurationFactoryTest.java
@@ -46,7 +46,8 @@ public class SystemPropertyJmxSerialFilterConfigurationFactoryTest {
}
@Test
- public void returnsEnabledConfiguration_whenFilteringIsEnabled() {
+ public void returnsEnabledConfiguration_whenFilteringIsEnabled()
+ throws UnableToSetSerialFilterException {
JmxSerialFilterConfigurationFactory factory =
new SystemPropertyJmxSerialFilterConfigurationFactory(true, PATTERN);
@@ -56,7 +57,8 @@ public class SystemPropertyJmxSerialFilterConfigurationFactoryTest {
}
@Test
- public void returnsDisabledConfiguration_whenFilteringIsDisabled() {
+ public void returnsDisabledConfiguration_whenFilteringIsDisabled()
+ throws UnableToSetSerialFilterException {
JmxSerialFilterConfigurationFactory factory =
new SystemPropertyJmxSerialFilterConfigurationFactory(false, PATTERN);
@@ -66,7 +68,8 @@ public class SystemPropertyJmxSerialFilterConfigurationFactoryTest {
}
@Test
- public void enabledConfiguration_setsJmxSerialFilterProperty() {
+ public void enabledConfiguration_setsJmxSerialFilterProperty()
+ throws UnableToSetSerialFilterException {
JmxSerialFilterConfigurationFactory factory =
new SystemPropertyJmxSerialFilterConfigurationFactory(true, PATTERN);
FilterConfiguration filterConfiguration = factory.create();
@@ -77,7 +80,8 @@ public class SystemPropertyJmxSerialFilterConfigurationFactoryTest {
}
@Test
- public void disabledConfiguration_doesNotSetAnySystemProperties() {
+ public void disabledConfiguration_doesNotSetAnySystemProperties()
+ throws UnableToSetSerialFilterException {
Map<?, ?> propertiesBefore = System.getProperties();
JmxSerialFilterConfigurationFactory factory =
new SystemPropertyJmxSerialFilterConfigurationFactory(true, PATTERN);