diff --git a/core/utils/common-utils/src/main/java/datawave/accumulo/core/util/AccumuloConfigurationWrapper.java b/core/utils/common-utils/src/main/java/datawave/accumulo/core/util/AccumuloConfigurationWrapper.java new file mode 100644 index 00000000000..2e3ec4bf2f3 --- /dev/null +++ b/core/utils/common-utils/src/main/java/datawave/accumulo/core/util/AccumuloConfigurationWrapper.java @@ -0,0 +1,83 @@ +package datawave.accumulo.core.util; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.function.Function; +import java.util.function.Supplier; + +import org.apache.accumulo.core.client.PluginEnvironment; +import org.apache.accumulo.core.conf.AccumuloConfiguration; +import org.apache.accumulo.core.conf.Property; +import org.apache.accumulo.core.conf.PropertyType; + +/** + * A utility class that wraps an AccumuloConfiguration and implements PluginEnvironment.Configuration. This replaces the non-public + * org.apache.accumulo.core.util.ConfigurationImpl class. + */ +public class AccumuloConfigurationWrapper implements PluginEnvironment.Configuration { + + private final AccumuloConfiguration conf; + + public AccumuloConfigurationWrapper(AccumuloConfiguration conf) { + this.conf = conf; + } + + @Override + public boolean isSet(String key) { + return conf.get(key) != null; + } + + @Override + public String get(String key) { + return conf.get(key); + } + + @Override + public Map getWithPrefix(String prefix) { + // For a defined prefix property, defer to AccumuloConfiguration.getAllPropertiesWithPrefix, which returns a + // consistent snapshot taken under the configuration's lock. Mirrors the non-public ConfigurationImpl behavior. + Property propertyPrefix = Property.getPropertyByKey(prefix); + if (propertyPrefix != null && propertyPrefix.getType() == PropertyType.PREFIX) { + return conf.getAllPropertiesWithPrefix(propertyPrefix); + } + Map result = new HashMap<>(); + for (Map.Entry entry : conf) { + if (entry.getKey().startsWith(prefix)) { + result.put(entry.getKey(), entry.getValue()); + } + } + return result; + } + + @Override + public Map getCustom() { + return getWithPrefix("general.custom."); + } + + @Override + public String getCustom(String keySuffix) { + return get("general.custom." + keySuffix); + } + + @Override + public Map getTableCustom() { + return getWithPrefix("table.custom."); + } + + @Override + public String getTableCustom(String keySuffix) { + return get("table.custom." + keySuffix); + } + + @Override + public Iterator> iterator() { + return conf.iterator(); + } + + @Override + public Supplier getDerived(Function computeDerivedValue) { + T value = computeDerivedValue.apply(this); + return () -> value; + } +} diff --git a/warehouse/age-off/src/test/java/datawave/iterators/filter/ageoff/ConfigurableIteratorEnvironment.java b/warehouse/age-off/src/test/java/datawave/iterators/filter/ageoff/ConfigurableIteratorEnvironment.java index 5836c86af5d..8f415ed4994 100644 --- a/warehouse/age-off/src/test/java/datawave/iterators/filter/ageoff/ConfigurableIteratorEnvironment.java +++ b/warehouse/age-off/src/test/java/datawave/iterators/filter/ageoff/ConfigurableIteratorEnvironment.java @@ -15,9 +15,10 @@ import org.apache.accumulo.core.iterators.SortedKeyValueIterator; import org.apache.accumulo.core.security.Authorizations; import org.apache.accumulo.core.spi.common.ServiceEnvironment; -import org.apache.accumulo.core.util.ConfigurationImpl; import org.apache.commons.lang.NotImplementedException; +import datawave.accumulo.core.util.AccumuloConfigurationWrapper; + public class ConfigurableIteratorEnvironment implements IteratorEnvironment { private IteratorUtil.IteratorScope scope; @@ -114,7 +115,7 @@ public Configuration getConfiguration() { @Override public Configuration getConfiguration(TableId tableId) { - return new ConfigurationImpl(conf); + return new AccumuloConfigurationWrapper(conf); } @Override diff --git a/warehouse/query-core/src/test/java/datawave/query/iterator/QueryIteratorIT.java b/warehouse/query-core/src/test/java/datawave/query/iterator/QueryIteratorIT.java index 7be3d177278..41d4119b318 100644 --- a/warehouse/query-core/src/test/java/datawave/query/iterator/QueryIteratorIT.java +++ b/warehouse/query-core/src/test/java/datawave/query/iterator/QueryIteratorIT.java @@ -44,7 +44,6 @@ import org.apache.accumulo.core.data.Range; import org.apache.accumulo.core.data.Value; import org.apache.accumulo.core.iterators.IteratorEnvironment; -import org.apache.accumulo.core.util.ConfigurationImpl; import org.easymock.EasyMock; import org.easymock.EasyMockSupport; import org.junit.After; @@ -59,6 +58,7 @@ import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; +import datawave.accumulo.core.util.AccumuloConfigurationWrapper; import datawave.data.type.LcNoDiacriticsType; import datawave.data.type.Type; import datawave.ingest.protobuf.TermWeight; @@ -174,7 +174,7 @@ public void setup() throws IOException { pluginEnv = createMock(PluginEnvironment.class); EasyMock.expect(iterEnv.getConfig()).andReturn(DefaultConfiguration.getInstance()).anyTimes(); EasyMock.expect(iterEnv.getPluginEnv()).andReturn(pluginEnv).anyTimes(); - EasyMock.expect(pluginEnv.getConfiguration()).andReturn(new ConfigurationImpl(DefaultConfiguration.getInstance())).anyTimes(); + EasyMock.expect(pluginEnv.getConfiguration()).andReturn(new AccumuloConfigurationWrapper(DefaultConfiguration.getInstance())).anyTimes(); filter = createMock(EventDataQueryFilter.class); } diff --git a/warehouse/query-core/src/test/java/datawave/query/iterator/SourceManagerTest.java b/warehouse/query-core/src/test/java/datawave/query/iterator/SourceManagerTest.java index 829625ac408..744b2149ca0 100644 --- a/warehouse/query-core/src/test/java/datawave/query/iterator/SourceManagerTest.java +++ b/warehouse/query-core/src/test/java/datawave/query/iterator/SourceManagerTest.java @@ -36,7 +36,6 @@ import org.apache.accumulo.core.spi.common.ServiceEnvironment; import org.apache.accumulo.core.spi.crypto.CryptoEnvironment; import org.apache.accumulo.core.spi.crypto.CryptoService; -import org.apache.accumulo.core.util.ConfigurationImpl; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.junit.Before; @@ -45,6 +44,8 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import datawave.accumulo.core.util.AccumuloConfigurationWrapper; + public class SourceManagerTest { private static final SimpleDateFormat shardFormatter = new SimpleDateFormat("yyyyMMdd HHmmss"); private static long ts = -1; @@ -435,12 +436,12 @@ public void registerSideChannel(SortedKeyValueIterator iter) { public class MockPluginEnvironment implements PluginEnvironment { @Override public Configuration getConfiguration() { - return new ConfigurationImpl(conf); + return new AccumuloConfigurationWrapper(conf); } @Override public Configuration getConfiguration(TableId tableId) { - return new ConfigurationImpl(conf); + return new AccumuloConfigurationWrapper(conf); } @Override diff --git a/warehouse/query-core/src/test/java/datawave/test/iter/TestPluginEnv.java b/warehouse/query-core/src/test/java/datawave/test/iter/TestPluginEnv.java index 8b7084fdd5d..eab99050b95 100644 --- a/warehouse/query-core/src/test/java/datawave/test/iter/TestPluginEnv.java +++ b/warehouse/query-core/src/test/java/datawave/test/iter/TestPluginEnv.java @@ -5,7 +5,8 @@ import org.apache.accumulo.core.conf.AccumuloConfiguration; import org.apache.accumulo.core.conf.DefaultConfiguration; import org.apache.accumulo.core.data.TableId; -import org.apache.accumulo.core.util.ConfigurationImpl; + +import datawave.accumulo.core.util.AccumuloConfigurationWrapper; public class TestPluginEnv implements PluginEnvironment { @@ -13,12 +14,12 @@ public class TestPluginEnv implements PluginEnvironment { @Override public Configuration getConfiguration() { - return new ConfigurationImpl(conf); + return new AccumuloConfigurationWrapper(conf); } @Override public Configuration getConfiguration(TableId tableId) { - return new ConfigurationImpl(conf); + return new AccumuloConfigurationWrapper(conf); } @Override