You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by md...@apache.org on 2018/03/14 18:28:00 UTC
[3/3] hbase git commit: HBASE-20180 Avoid Class::newInstance
HBASE-20180 Avoid Class::newInstance
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/f63a7ff6
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/f63a7ff6
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/f63a7ff6
Branch: refs/heads/master
Commit: f63a7ff635fa02a8a97d9a36505732f647d2e7ff
Parents: 3734222
Author: Mike Drob <md...@apache.org>
Authored: Mon Mar 12 16:05:39 2018 -0500
Committer: Mike Drob <md...@apache.org>
Committed: Wed Mar 14 13:15:05 2018 -0500
----------------------------------------------------------------------
.../hbase/backup/BackupClientFactory.java | 5 +-
hbase-build-configuration/pom.xml | 1 +
.../coprocessor/AggregateImplementation.java | 15 +++--
.../mapreduce/MultithreadedTableMapper.java | 3 +-
.../mapreduce/TableSnapshotInputFormatImpl.java | 17 ++----
.../hadoop/hbase/constraint/Constraints.java | 10 ++--
.../hbase/master/MasterCoprocessorHost.java | 28 +++++----
.../replication/ReplicationPeerManager.java | 4 +-
.../hbase/regionserver/RSRpcServices.java | 13 ++--
.../regionserver/RegionCoprocessorHost.java | 28 +++++----
.../RegionServerCoprocessorHost.java | 29 +++++----
.../regionserver/wal/WALCoprocessorHost.java | 11 +++-
.../regionserver/ReplicationSource.java | 18 ++++--
.../regionserver/ReplicationSourceFactory.java | 5 +-
.../hbase/coprocessor/TestCoprocessorHost.java | 62 ++++++++++++--------
15 files changed, 148 insertions(+), 101 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-backup/src/main/java/org/apache/hadoop/hbase/backup/BackupClientFactory.java
----------------------------------------------------------------------
diff --git a/hbase-backup/src/main/java/org/apache/hadoop/hbase/backup/BackupClientFactory.java b/hbase-backup/src/main/java/org/apache/hadoop/hbase/backup/BackupClientFactory.java
index 4c96229..e3abb60 100644
--- a/hbase-backup/src/main/java/org/apache/hadoop/hbase/backup/BackupClientFactory.java
+++ b/hbase-backup/src/main/java/org/apache/hadoop/hbase/backup/BackupClientFactory.java
@@ -38,8 +38,9 @@ public final class BackupClientFactory {
try {
String clsName = conf.get(TableBackupClient.BACKUP_CLIENT_IMPL_CLASS);
if (clsName != null) {
- Class<?> clientImpl = Class.forName(clsName);
- TableBackupClient client = (TableBackupClient) clientImpl.newInstance();
+ Class<? extends TableBackupClient> clientImpl;
+ clientImpl = Class.forName(clsName).asSubclass(TableBackupClient.class);
+ TableBackupClient client = clientImpl.getDeclaredConstructor().newInstance();
client.init(conn, backupId, request);
return client;
}
http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-build-configuration/pom.xml
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/pom.xml b/hbase-build-configuration/pom.xml
index ac98044..311b1c0 100644
--- a/hbase-build-configuration/pom.xml
+++ b/hbase-build-configuration/pom.xml
@@ -82,6 +82,7 @@
<compilerArgs>
<arg>-XepDisableWarningsInGeneratedCode</arg>
<arg>-Xep:FallThrough:OFF</arg> <!-- already in findbugs -->
+ <arg>-Xep:ClassNewInstance:ERROR</arg>
</compilerArgs>
<annotationProcessorPaths>
<path>
http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/coprocessor/AggregateImplementation.java
----------------------------------------------------------------------
diff --git a/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/coprocessor/AggregateImplementation.java b/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/coprocessor/AggregateImplementation.java
index 6beb3f6..c8badd3 100644
--- a/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/coprocessor/AggregateImplementation.java
+++ b/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/coprocessor/AggregateImplementation.java
@@ -27,6 +27,7 @@ import com.google.protobuf.RpcController;
import com.google.protobuf.Service;
import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Collections;
@@ -480,21 +481,19 @@ extends AggregateService implements RegionCoprocessor {
ColumnInterpreter<T,S,P,Q,R> constructColumnInterpreterFromRequest(
AggregateRequest request) throws IOException {
String className = request.getInterpreterClassName();
- Class<?> cls;
try {
- cls = Class.forName(className);
- ColumnInterpreter<T,S,P,Q,R> ci = (ColumnInterpreter<T, S, P, Q, R>) cls.newInstance();
+ ColumnInterpreter<T,S,P,Q,R> ci;
+ Class<?> cls = Class.forName(className);
+ ci = (ColumnInterpreter<T, S, P, Q, R>) cls.getDeclaredConstructor().newInstance();
+
if (request.hasInterpreterSpecificBytes()) {
ByteString b = request.getInterpreterSpecificBytes();
P initMsg = getParsedGenericInstance(ci.getClass(), 2, b);
ci.initialize(initMsg);
}
return ci;
- } catch (ClassNotFoundException e) {
- throw new IOException(e);
- } catch (InstantiationException e) {
- throw new IOException(e);
- } catch (IllegalAccessException e) {
+ } catch (ClassNotFoundException | InstantiationException | IllegalAccessException |
+ NoSuchMethodException | InvocationTargetException e) {
throw new IOException(e);
}
}
http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java
----------------------------------------------------------------------
diff --git a/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java
index 626deff..5cd87ae 100644
--- a/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java
+++ b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java
@@ -281,7 +281,8 @@ public class MultithreadedTableMapper<K2, V2> extends TableMapper<K2, V2> {
outer.getInputSplit());
Class<?> wrappedMapperClass = Class.forName("org.apache.hadoop.mapreduce.lib.map.WrappedMapper");
Method getMapContext = wrappedMapperClass.getMethod("getMapContext", MapContext.class);
- subcontext = (Context) getMapContext.invoke(wrappedMapperClass.newInstance(), mc);
+ subcontext = (Context) getMapContext.invoke(
+ wrappedMapperClass.getDeclaredConstructor().newInstance(), mc);
} catch (Exception ee) { // FindBugs: REC_CATCH_EXCEPTION
// rethrow as IOE
throw new IOException(e);
http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java
----------------------------------------------------------------------
diff --git a/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java
index add0985f..1795ce1 100644
--- a/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java
+++ b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java
@@ -22,6 +22,7 @@ import java.io.ByteArrayOutputStream;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@@ -300,17 +301,11 @@ public class TableSnapshotInputFormatImpl {
if (splitAlgoClassName == null)
return null;
try {
- return ((Class<? extends RegionSplitter.SplitAlgorithm>)
- Class.forName(splitAlgoClassName)).newInstance();
- } catch (ClassNotFoundException e) {
- throw new IOException("SplitAlgo class " + splitAlgoClassName +
- " is not found", e);
- } catch (InstantiationException e) {
- throw new IOException("SplitAlgo class " + splitAlgoClassName +
- " is not instantiable", e);
- } catch (IllegalAccessException e) {
- throw new IOException("SplitAlgo class " + splitAlgoClassName +
- " is not instantiable", e);
+ return Class.forName(splitAlgoClassName).asSubclass(RegionSplitter.SplitAlgorithm.class)
+ .getDeclaredConstructor().newInstance();
+ } catch (ClassNotFoundException | InstantiationException | IllegalAccessException |
+ NoSuchMethodException | InvocationTargetException e) {
+ throw new IOException("SplitAlgo class " + splitAlgoClassName + " is not found", e);
}
}
http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/Constraints.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/Constraints.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/Constraints.java
index 426e516..759d252 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/Constraints.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/Constraints.java
@@ -21,6 +21,7 @@ import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -593,14 +594,11 @@ public final class Constraints {
// add the constraint, now that we expect it to be valid.
Class<? extends Constraint> clazz = classloader.loadClass(key)
.asSubclass(Constraint.class);
- Constraint constraint = clazz.newInstance();
+ Constraint constraint = clazz.getDeclaredConstructor().newInstance();
constraint.setConf(conf);
constraints.add(constraint);
- } catch (ClassNotFoundException e1) {
- throw new IOException(e1);
- } catch (InstantiationException e1) {
- throw new IOException(e1);
- } catch (IllegalAccessException e1) {
+ } catch (InvocationTargetException | NoSuchMethodException | ClassNotFoundException |
+ InstantiationException | IllegalAccessException e1) {
throw new IOException(e1);
}
}
http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
index 7f17227..8c8c02c 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
@@ -20,6 +20,7 @@ package org.apache.hadoop.hbase.master;
import com.google.protobuf.Service;
import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.Set;
import org.apache.hadoop.conf.Configuration;
@@ -170,17 +171,22 @@ public class MasterCoprocessorHost
@Override
public MasterCoprocessor checkAndGetInstance(Class<?> implClass)
throws InstantiationException, IllegalAccessException {
- if (MasterCoprocessor.class.isAssignableFrom(implClass)) {
- return (MasterCoprocessor)implClass.newInstance();
- } else if (CoprocessorService.class.isAssignableFrom(implClass)) {
- // For backward compatibility with old CoprocessorService impl which don't extend
- // MasterCoprocessor.
- return new CoprocessorServiceBackwardCompatiblity.MasterCoprocessorService(
- (CoprocessorService)implClass.newInstance());
- } else {
- LOG.error(implClass.getName() + " is not of type MasterCoprocessor. Check the "
- + "configuration " + CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY);
- return null;
+ try {
+ if (MasterCoprocessor.class.isAssignableFrom(implClass)) {
+ return implClass.asSubclass(MasterCoprocessor.class).getDeclaredConstructor().newInstance();
+ } else if (CoprocessorService.class.isAssignableFrom(implClass)) {
+ // For backward compatibility with old CoprocessorService impl which don't extend
+ // MasterCoprocessor.
+ CoprocessorService cs;
+ cs = implClass.asSubclass(CoprocessorService.class).getDeclaredConstructor().newInstance();
+ return new CoprocessorServiceBackwardCompatiblity.MasterCoprocessorService(cs);
+ } else {
+ LOG.error("{} is not of type MasterCoprocessor. Check the configuration of {}",
+ implClass.getName(), CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY);
+ return null;
+ }
+ } catch (NoSuchMethodException | InvocationTargetException e) {
+ throw (InstantiationException) new InstantiationException(implClass.getName()).initCause(e);
}
}
http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ReplicationPeerManager.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ReplicationPeerManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ReplicationPeerManager.java
index 7620638..1e93373 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ReplicationPeerManager.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ReplicationPeerManager.java
@@ -310,10 +310,10 @@ public class ReplicationPeerManager {
String[] filters = filterCSV.split(",");
for (String filter : filters) {
try {
- Class.forName(filter).newInstance();
+ Class.forName(filter).getDeclaredConstructor().newInstance();
} catch (Exception e) {
throw new DoNotRetryIOException("Configured WALEntryFilter " + filter +
- " could not be created. Failing add/update " + "peer operation.", e);
+ " could not be created. Failing add/update peer operation.", e);
}
}
}
http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java
index 3efea4e..c559823 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java
@@ -20,6 +20,7 @@ package org.apache.hadoop.hbase.regionserver;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InterruptedIOException;
+import java.lang.reflect.InvocationTargetException;
import java.net.BindException;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
@@ -1185,11 +1186,13 @@ public class RSRpcServices implements HBaseRPCErrorHandler,
rowSizeWarnThreshold = rs.conf.getInt(BATCH_ROWS_THRESHOLD_NAME, BATCH_ROWS_THRESHOLD_DEFAULT);
RpcSchedulerFactory rpcSchedulerFactory;
try {
- Class<?> rpcSchedulerFactoryClass = rs.conf.getClass(
+ Class<?> cls = rs.conf.getClass(
REGION_SERVER_RPC_SCHEDULER_FACTORY_CLASS,
SimpleRpcSchedulerFactory.class);
- rpcSchedulerFactory = ((RpcSchedulerFactory) rpcSchedulerFactoryClass.newInstance());
- } catch (InstantiationException | IllegalAccessException e) {
+ rpcSchedulerFactory = cls.asSubclass(RpcSchedulerFactory.class)
+ .getDeclaredConstructor().newInstance();
+ } catch (NoSuchMethodException | InvocationTargetException |
+ InstantiationException | IllegalAccessException e) {
throw new IllegalArgumentException(e);
}
// Server to handle client requests.
@@ -3549,8 +3552,8 @@ public class RSRpcServices implements HBaseRPCErrorHandler,
for (RemoteProcedureRequest req : request.getProcList()) {
RSProcedureCallable callable;
try {
- callable =
- Class.forName(req.getProcClass()).asSubclass(RSProcedureCallable.class).newInstance();
+ callable = Class.forName(req.getProcClass()).asSubclass(RSProcedureCallable.class)
+ .getDeclaredConstructor().newInstance();
} catch (Exception e) {
regionServer.remoteProcedureComplete(req.getProcId(), e);
continue;
http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java
index 47b389a..b35f4fb 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java
@@ -22,6 +22,7 @@ import com.google.protobuf.Message;
import com.google.protobuf.Service;
import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -465,17 +466,22 @@ public class RegionCoprocessorHost
@Override
public RegionCoprocessor checkAndGetInstance(Class<?> implClass)
throws InstantiationException, IllegalAccessException {
- if (RegionCoprocessor.class.isAssignableFrom(implClass)) {
- return (RegionCoprocessor)implClass.newInstance();
- } else if (CoprocessorService.class.isAssignableFrom(implClass)) {
- // For backward compatibility with old CoprocessorService impl which don't extend
- // RegionCoprocessor.
- return new CoprocessorServiceBackwardCompatiblity.RegionCoprocessorService(
- (CoprocessorService)implClass.newInstance());
- } else {
- LOG.error(implClass.getName() + " is not of type RegionCoprocessor. Check the "
- + "configuration " + CoprocessorHost.REGION_COPROCESSOR_CONF_KEY);
- return null;
+ try {
+ if (RegionCoprocessor.class.isAssignableFrom(implClass)) {
+ return implClass.asSubclass(RegionCoprocessor.class).getDeclaredConstructor().newInstance();
+ } else if (CoprocessorService.class.isAssignableFrom(implClass)) {
+ // For backward compatibility with old CoprocessorService impl which don't extend
+ // RegionCoprocessor.
+ CoprocessorService cs;
+ cs = implClass.asSubclass(CoprocessorService.class).getDeclaredConstructor().newInstance();
+ return new CoprocessorServiceBackwardCompatiblity.RegionCoprocessorService(cs);
+ } else {
+ LOG.error("{} is not of type RegionCoprocessor. Check the configuration of {}",
+ implClass.getName(), CoprocessorHost.REGION_COPROCESSOR_CONF_KEY);
+ return null;
+ }
+ } catch (NoSuchMethodException | InvocationTargetException e) {
+ throw (InstantiationException) new InstantiationException(implClass.getName()).initCause(e);
}
}
http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java
index f4122ce..42a4e00 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java
@@ -19,6 +19,7 @@
package org.apache.hadoop.hbase.regionserver;
import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
import com.google.protobuf.Service;
@@ -82,17 +83,23 @@ public class RegionServerCoprocessorHost extends
@Override
public RegionServerCoprocessor checkAndGetInstance(Class<?> implClass)
throws InstantiationException, IllegalAccessException {
- if (RegionServerCoprocessor.class.isAssignableFrom(implClass)) {
- return (RegionServerCoprocessor)implClass.newInstance();
- } else if (SingletonCoprocessorService.class.isAssignableFrom(implClass)) {
- // For backward compatibility with old CoprocessorService impl which don't extend
- // RegionCoprocessor.
- return new CoprocessorServiceBackwardCompatiblity.RegionServerCoprocessorService(
- (SingletonCoprocessorService)implClass.newInstance());
- } else {
- LOG.error(implClass.getName() + " is not of type RegionServerCoprocessor. Check the "
- + "configuration " + CoprocessorHost.REGIONSERVER_COPROCESSOR_CONF_KEY);
- return null;
+ try {
+ if (RegionServerCoprocessor.class.isAssignableFrom(implClass)) {
+ return implClass.asSubclass(RegionServerCoprocessor.class).getDeclaredConstructor()
+ .newInstance();
+ } else if (SingletonCoprocessorService.class.isAssignableFrom(implClass)) {
+ // For backward compatibility with old CoprocessorService impl which don't extend
+ // RegionCoprocessor.
+ SingletonCoprocessorService tmp = implClass.asSubclass(SingletonCoprocessorService.class)
+ .getDeclaredConstructor().newInstance();
+ return new CoprocessorServiceBackwardCompatiblity.RegionServerCoprocessorService(tmp);
+ } else {
+ LOG.error("{} is not of type RegionServerCoprocessor. Check the configuration of {}",
+ implClass.getName(), CoprocessorHost.REGIONSERVER_COPROCESSOR_CONF_KEY);
+ return null;
+ }
+ } catch (NoSuchMethodException | InvocationTargetException e) {
+ throw (InstantiationException) new InstantiationException(implClass.getName()).initCause(e);
}
}
http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALCoprocessorHost.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALCoprocessorHost.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALCoprocessorHost.java
index 7b6182e..40d6d0f 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALCoprocessorHost.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALCoprocessorHost.java
@@ -21,6 +21,7 @@
package org.apache.hadoop.hbase.regionserver.wal;
import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
@@ -118,10 +119,14 @@ public class WALCoprocessorHost
}
@Override
- public WALCoprocessor checkAndGetInstance(Class<?> implClass)
- throws InstantiationException, IllegalAccessException {
+ public WALCoprocessor checkAndGetInstance(Class<?> implClass) throws IllegalAccessException,
+ InstantiationException {
if (WALCoprocessor.class.isAssignableFrom(implClass)) {
- return (WALCoprocessor)implClass.newInstance();
+ try {
+ return implClass.asSubclass(WALCoprocessor.class).getDeclaredConstructor().newInstance();
+ } catch (NoSuchMethodException | InvocationTargetException e) {
+ throw (InstantiationException) new InstantiationException(implClass.getName()).initCause(e);
+ }
} else {
LOG.error(implClass.getName() + " is not of type WALCoprocessor. Check the "
+ "configuration " + CoprocessorHost.WAL_COPROCESSOR_CONF_KEY);
http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSource.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSource.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSource.java
index 80d08ef..3480919 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSource.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSource.java
@@ -18,6 +18,7 @@
package org.apache.hadoop.hbase.replication.regionserver;
import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
@@ -242,12 +243,21 @@ public class ReplicationSource implements ReplicationSourceInterface {
rsServerHost = ((HRegionServer) server).getRegionServerCoprocessorHost();
}
String replicationEndpointImpl = replicationPeer.getPeerConfig().getReplicationEndpointImpl();
+
+ ReplicationEndpoint replicationEndpoint;
if (replicationEndpointImpl == null) {
- // Default to HBase inter-cluster replication endpoint
- replicationEndpointImpl = HBaseInterClusterReplicationEndpoint.class.getName();
+ // Default to HBase inter-cluster replication endpoint; skip reflection
+ replicationEndpoint = new HBaseInterClusterReplicationEndpoint();
+ } else {
+ try {
+ replicationEndpoint = Class.forName(replicationEndpointImpl)
+ .asSubclass(ReplicationEndpoint.class)
+ .getDeclaredConstructor()
+ .newInstance();
+ } catch (NoSuchMethodException | InvocationTargetException e) {
+ throw new IllegalArgumentException(e);
+ }
}
- ReplicationEndpoint replicationEndpoint =
- Class.forName(replicationEndpointImpl).asSubclass(ReplicationEndpoint.class).newInstance();
if (rsServerHost != null) {
ReplicationEndpoint newReplicationEndPoint =
rsServerHost.postCreateReplicationEndPoint(replicationEndpoint);
http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceFactory.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceFactory.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceFactory.java
index 93e8331..d613049 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceFactory.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceFactory.java
@@ -40,10 +40,9 @@ public class ReplicationSourceFactory {
String defaultReplicationSourceImpl =
isQueueRecovered ? RecoveredReplicationSource.class.getCanonicalName()
: ReplicationSource.class.getCanonicalName();
- @SuppressWarnings("rawtypes")
- Class c = Class.forName(
+ Class<?> c = Class.forName(
conf.get("replication.replicationsource.implementation", defaultReplicationSourceImpl));
- src = (ReplicationSourceInterface) c.newInstance();
+ src = c.asSubclass(ReplicationSourceInterface.class).getDeclaredConstructor().newInstance();
} catch (Exception e) {
LOG.warn("Passed replication source implementation throws errors, "
+ "defaulting to ReplicationSource",
http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorHost.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorHost.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorHost.java
index c541647..3cf2221 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorHost.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorHost.java
@@ -20,6 +20,8 @@ package org.apache.hadoop.hbase.coprocessor;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
+import java.lang.reflect.InvocationTargetException;
+
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Abortable;
import org.apache.hadoop.hbase.Coprocessor;
@@ -56,47 +58,61 @@ public class TestCoprocessorHost {
return this.aborted;
}
}
+
@Test
public void testDoubleLoadingAndPriorityValue() {
final Configuration conf = HBaseConfiguration.create();
- CoprocessorHost<RegionCoprocessor, CoprocessorEnvironment<RegionCoprocessor>> host =
- new CoprocessorHost<RegionCoprocessor, CoprocessorEnvironment<RegionCoprocessor>>(
- new TestAbortable()) {
- @Override
- public RegionCoprocessor checkAndGetInstance(Class<?> implClass)
- throws InstantiationException, IllegalAccessException {
- if(RegionCoprocessor.class.isAssignableFrom(implClass)) {
- return (RegionCoprocessor)implClass.newInstance();
- }
- return null;
- }
-
- final Configuration cpHostConf = conf;
-
- @Override
- public CoprocessorEnvironment<RegionCoprocessor> createEnvironment(
- final RegionCoprocessor instance, final int priority, int sequence, Configuration conf) {
- return new BaseEnvironment<RegionCoprocessor>(instance, priority, 0, cpHostConf);
- }
- };
final String key = "KEY";
final String coprocessor = "org.apache.hadoop.hbase.coprocessor.SimpleRegionObserver";
+
+ CoprocessorHost<RegionCoprocessor, CoprocessorEnvironment<RegionCoprocessor>> host;
+ host = new CoprocessorHostForTest<>(conf);
+
// Try and load a coprocessor three times
conf.setStrings(key, coprocessor, coprocessor, coprocessor,
SimpleRegionObserverV2.class.getName());
host.loadSystemCoprocessors(conf, key);
+
// Two coprocessors(SimpleRegionObserver and SimpleRegionObserverV2) loaded
Assert.assertEquals(2, host.coprocEnvironments.size());
+
// Check the priority value
- CoprocessorEnvironment simpleEnv = host.findCoprocessorEnvironment(
+ CoprocessorEnvironment<?> simpleEnv = host.findCoprocessorEnvironment(
SimpleRegionObserver.class.getName());
- CoprocessorEnvironment simpleEnv_v2 = host.findCoprocessorEnvironment(
+ CoprocessorEnvironment<?> simpleEnv_v2 = host.findCoprocessorEnvironment(
SimpleRegionObserverV2.class.getName());
+
assertNotNull(simpleEnv);
assertNotNull(simpleEnv_v2);
assertEquals(Coprocessor.PRIORITY_SYSTEM, simpleEnv.getPriority());
assertEquals(Coprocessor.PRIORITY_SYSTEM + 1, simpleEnv_v2.getPriority());
}
- public static class SimpleRegionObserverV2 extends SimpleRegionObserver {
+
+ public static class SimpleRegionObserverV2 extends SimpleRegionObserver { }
+
+ private static class CoprocessorHostForTest<E extends Coprocessor> extends
+ CoprocessorHost<E, CoprocessorEnvironment<E>> {
+ final Configuration cpHostConf;
+
+ public CoprocessorHostForTest(Configuration conf) {
+ super(new TestAbortable());
+ cpHostConf = conf;
+ }
+
+ @Override
+ public E checkAndGetInstance(Class<?> implClass)
+ throws InstantiationException, IllegalAccessException {
+ try {
+ return (E) implClass.getDeclaredConstructor().newInstance();
+ } catch (InvocationTargetException | NoSuchMethodException e) {
+ throw (InstantiationException) new InstantiationException().initCause(e);
+ }
+ }
+
+ @Override
+ public CoprocessorEnvironment<E> createEnvironment(final E instance, final int priority,
+ int sequence, Configuration conf) {
+ return new BaseEnvironment<>(instance, priority, 0, cpHostConf);
+ }
}
}