blob: 55ff67f5356472acfc919e8e995b61e74a5fd600 [file] [log] [blame]
/*
* 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.accumulo.core.client;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.function.Function;
import java.util.function.Supplier;
import org.apache.accumulo.core.data.TableId;
/**
* This interface exposes Accumulo system level information to plugins in a stable manner. The
* purpose of this interface is to insulate plugins from internal refactorings and changes to
* Accumulo.
*
* @since 2.1.0
*/
public interface PluginEnvironment {
/**
* @since 2.1.0
*/
interface Configuration extends Iterable<Entry<String,String>> {
/**
* Properties with a default value will always return something when calling
* {@link #get(String)}, even if a user never set the property. The method allows checking if a
* user set a property.
*
* @return true if a user set this property and false if a user did not set it.
* @since 2.1.0
*/
boolean isSet(String key);
/**
* @return The value for a single property or null if not present. Sensitive properties are
* intentionally not returned in order to prevent inadvertent logging of them. If your
* plugin needs sensitive properties a getSensitive method could be added.
*/
String get(String key);
/**
* Returns all properties with a given prefix
*
* @param prefix
* prefix of properties to be returned. Include the trailing '.' in the prefix.
* @return all properties with a given prefix
* @since 2.1.0
*/
Map<String,String> getWithPrefix(String prefix);
/**
* Users can set arbitrary custom properties in Accumulo using the prefix
* {@code general.custom.}. This method will return all properties with that prefix, stripping
* the prefix. For example, assume the following properties were set :
*
* <pre>
* {@code
* general.custom.prop1=123
* general.custom.prop2=abc
* }
* </pre>
*
* Then this function would return a map containing {@code [prop1=123,prop2=abc]}.
*
*/
Map<String,String> getCustom();
/**
* This method appends the prefix {@code general.custom} and gets the property.
*
* @return The same as calling {@code getCustom().get(keySuffix)} OR
* {@code get("general.custom."+keySuffix)}
*/
String getCustom(String keySuffix);
/**
* Users can set arbitrary custom table properties in Accumulo using the prefix
* {@code table.custom.}. This method will return all properties with that prefix, stripping the
* prefix. For example, assume the following properties were set :
*
* <pre>
* {@code
* table.custom.tp1=ch1
* table.custom.tp2=bh2
* }
* </pre>
*
* Then this function would return a map containing {@code [tp1=ch1,tp2=bh2]}.
*
*/
Map<String,String> getTableCustom();
/**
* This method appends the prefix {@code table.custom} and gets the property.
*
* @return The same as calling {@code getTableCustom().get(keySuffix)} OR
* {@code get("table.custom."+keySuffix)}
*/
String getTableCustom(String keySuffix);
/**
* Returns an iterator over all properties. This may be inefficient, consider opening an issue
* if you have a use case that is only satisfied by this. Sensitive properties are intentionally
* suppressed in order to prevent inadvertent logging of them.
*/
@Override
Iterator<Entry<String,String>> iterator();
/**
* Returns a derived value from this Configuration. The returned value supplier is thread-safe
* and attempts to avoid re-computation of the response. The intended use for a derived value is
* to ensure that configuration changes that may be made in Zookeeper, for example, are always
* reflected in the returned value.
*/
<T> Supplier<T> getDerived(Function<Configuration,T> computeDerivedValue);
}
/**
* @return A view of Accumulo's system level configuration. This is backed by system level config
* in zookeeper, which falls back to site configuration, which falls back to the default
* configuration.
*/
Configuration getConfiguration();
/**
* @return a view of a table's configuration. When requesting properties that start with
* {@code table.} the returned configuration may give different values for different
* tables. For other properties the returned configuration will return the same value as
* {@link #getConfiguration()}.
*
*/
Configuration getConfiguration(TableId tableId);
/**
* Many Accumulo plugins are given table IDs as this is what Accumulo uses internally to identify
* tables. If a plugin needs to log debugging information it can call this method to get the table
* name.
*/
String getTableName(TableId tableId) throws TableNotFoundException;
/**
* Instantiate a class using Accumulo's system classloader. The class must have a no argument
* constructor.
*
* @param className
* Fully qualified name of the class.
* @param base
* The expected super type of the class.
*/
<T> T instantiate(String className, Class<T> base) throws Exception;
/**
* Instantiate a class using Accumulo's per table classloader. The class must have a no argument
* constructor.
*
* @param className
* Fully qualified name of the class.
* @param base
* The expected super type of the class.
*/
<T> T instantiate(TableId tableId, String className, Class<T> base) throws Exception;
}