You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vo...@apache.org on 2016/01/04 08:25:46 UTC
[5/9] ignite git commit: IGNITE-2308: Refactoring.
IGNITE-2308: Refactoring.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/e6f4455c
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/e6f4455c
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/e6f4455c
Branch: refs/heads/ignite-2308
Commit: e6f4455c47ae9f832a7e96095ab8ab1ccb07b00a
Parents: dda6b27
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Mon Jan 4 10:01:21 2016 +0400
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Mon Jan 4 10:01:21 2016 +0400
----------------------------------------------------------------------
.../processors/hadoop/HadoopClassLoader.java | 229 ++++++++++---------
.../hadoop/HadoopClassLoaderTest.java | 5 +-
2 files changed, 122 insertions(+), 112 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/e6f4455c/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/HadoopClassLoader.java
----------------------------------------------------------------------
diff --git a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/HadoopClassLoader.java b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/HadoopClassLoader.java
index a2c9df4..010a6bd 100644
--- a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/HadoopClassLoader.java
+++ b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/HadoopClassLoader.java
@@ -30,7 +30,7 @@ import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
-import java.util.concurrent.atomic.AtomicBoolean;
+
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.internal.processors.hadoop.v2.HadoopDaemon;
import org.apache.ignite.internal.processors.hadoop.v2.HadoopNativeCodeLoader;
@@ -166,7 +166,7 @@ public class HadoopClassLoader extends URLClassLoader {
Boolean hasDeps = cache.get(name);
if (hasDeps == null) {
- hasDeps = hasExternalDependencies(name, new HashSet<String>());
+ hasDeps = hasExternalDependencies(name);
cache.put(name, hasDeps);
}
@@ -273,10 +273,30 @@ public class HadoopClassLoader extends URLClassLoader {
}
/**
+ * Check whether class has external dependencies on Hadoop.
+ *
+ * @param clsName Class name.
+ * @return {@code True} if class has external dependencies.
+ */
+ boolean hasExternalDependencies(String clsName) {
+ CollectingContext ctx = new CollectingContext();
+
+ ctx.annVisitor = new CollectingAnnotationVisitor(ctx);
+ ctx.mthdVisitor = new CollectingMethodVisitor(ctx, ctx.annVisitor);
+ ctx.fldVisitor = new CollectingFieldVisitor(ctx, ctx.annVisitor);
+ ctx.clsVisitor = new CollectingClassVisitor(ctx, ctx.annVisitor, ctx.mthdVisitor, ctx.fldVisitor);
+
+ return hasExternalDependencies(clsName, ctx);
+ }
+
+ /**
+ * Check whether class has external dependencies on Hadoop.
+ *
* @param clsName Class name.
+ * @param ctx Context.
* @return {@code true} If the class has external dependencies.
*/
- boolean hasExternalDependencies(String clsName, Set<String> visited) {
+ boolean hasExternalDependencies(String clsName, CollectingContext ctx) {
if (isHadoop(clsName)) // Hadoop must not be in classpath but Idea sucks, so filtering explicitly as external.
return true;
@@ -298,20 +318,11 @@ public class HadoopClassLoader extends URLClassLoader {
throw new RuntimeException("Failed to read class: " + clsName, e);
}
- visited.add(clsName);
-
- final AtomicBoolean hasDeps = new AtomicBoolean();
-
- Collector c = new Collector(hasDeps, visited);
+ ctx.visited.add(clsName);
- AnnotationVisitor annVisitor = new CollectingAnnotationVisitor(c);
- MethodVisitor mthdVisitor = new CollectingMethodVisitor(c, annVisitor);
- FieldVisitor fldVisitor = new CollectingFieldVisitor(c, annVisitor);
- ClassVisitor clsVisitor = new CollectingClassVisitor(c, annVisitor, mthdVisitor, fldVisitor);
+ rdr.accept(ctx.clsVisitor, 0);
- rdr.accept(clsVisitor, 0);
-
- if (hasDeps.get()) // We already know that we have dependencies, no need to check parent.
+ if (ctx.found()) // We already know that we have dependencies, no need to check parent.
return true;
// Here we are known to not have any dependencies but possibly we have a parent which has them.
@@ -322,13 +333,13 @@ public class HadoopClassLoader extends URLClassLoader {
String parentCls = clsName.substring(0, idx);
- if (visited.contains(parentCls))
+ if (ctx.visited.contains(parentCls))
return false;
Boolean res = cache.get(parentCls);
if (res == null)
- res = hasExternalDependencies(parentCls, visited);
+ res = hasExternalDependencies(parentCls, ctx);
return res;
}
@@ -423,7 +434,10 @@ public class HadoopClassLoader extends URLClassLoader {
* @return HADOOP_HOME Variable.
*/
@Nullable public static String hadoopHome() {
- return getEnv("HADOOP_PREFIX", getEnv("HADOOP_HOME", null));
+ return "C:\\Personal\\programs\\hadoop-2.6.0";
+
+ // TODO: FIX!
+ //return getEnv("HADOOP_PREFIX", getEnv("HADOOP_HOME", null));
}
/**
@@ -491,38 +505,34 @@ public class HadoopClassLoader extends URLClassLoader {
}
/**
- * Implement business logic of the dependency analysis.
- * Keeps the necessary state.
+ * Context for dependencies collection.
*/
- private class Collector {
- /** Attribute gets 'true' if the positive answer is found. */
- private final AtomicBoolean hasDeps;
+ private class CollectingContext {
+ /** Visited classes. */
+ private final Set<String> visited = new HashSet<>();
- /** Collection of visited class names to prevent infinite loops in case of
- * circular dependencies. */
- private final Set<String> visited;
+ /** Whether dependency found. */
+ private boolean found;
- /**
- * Constructor.
- *
- * @param hasDeps has dependencies initial value.
- * @param visited visited set initial value.
- */
- Collector(AtomicBoolean hasDeps, Set<String> visited) {
- assert hasDeps != null;
- assert visited != null;
+ /** Annotation visitor. */
+ private AnnotationVisitor annVisitor;
- this.hasDeps = hasDeps;
- this.visited = visited;
- }
+ /** Method visitor. */
+ private MethodVisitor mthdVisitor;
+
+ /** Field visitor. */
+ private FieldVisitor fldVisitor;
+
+ /** Class visitor. */
+ private ClassVisitor clsVisitor;
/**
* Answers if the model travers should be finished.
*
* @return If it is done.
*/
- boolean isDone() {
- return hasDeps.get();
+ boolean found() {
+ return found;
}
/**
@@ -533,14 +543,14 @@ public class HadoopClassLoader extends URLClassLoader {
// Process method return type:
onType(Type.getReturnType(methDesc));
- if (isDone())
+ if (found())
return;
// Process method argument types:
for (Type t: Type.getArgumentTypes(methDesc)) {
onType(t);
- if (isDone())
+ if (found())
return;
}
}
@@ -563,8 +573,8 @@ public class HadoopClassLoader extends URLClassLoader {
Boolean res = cache.get(depCls);
- if (res == Boolean.TRUE || (res == null && hasExternalDependencies(depCls, visited)))
- hasDeps.set(true);
+ if (res == Boolean.TRUE || (res == null && hasExternalDependencies(depCls, this)))
+ found = true;
}
/**
@@ -636,48 +646,49 @@ public class HadoopClassLoader extends URLClassLoader {
*/
private static class CollectingAnnotationVisitor extends AnnotationVisitor {
/** */
- final Collector c;
+ final CollectingContext ctx;
/**
+ * Annotation visitor.
*
- * @param c The collector.
+ * @param ctx The collector.
*/
- CollectingAnnotationVisitor(Collector c) {
+ CollectingAnnotationVisitor(CollectingContext ctx) {
super(Opcodes.ASM4);
- this.c = c;
+ this.ctx = ctx;
}
/** {@inheritDoc} */
@Override public AnnotationVisitor visitAnnotation(String name, String desc) {
- if (c.isDone())
+ if (ctx.found())
return null;
- c.onType(desc);
+ ctx.onType(desc);
return this;
}
/** {@inheritDoc} */
@Override public void visitEnum(String name, String desc, String val) {
- if (c.isDone())
+ if (ctx.found())
return;
- c.onType(desc);
+ ctx.onType(desc);
}
/** {@inheritDoc} */
@Override public AnnotationVisitor visitArray(String name) {
- return c.isDone() ? null : this;
+ return ctx.found() ? null : this;
}
/** {@inheritDoc} */
@Override public void visit(String name, Object val) {
- if (c.isDone())
+ if (ctx.found())
return;
if (val instanceof Type)
- c.onType((Type)val);
+ ctx.onType((Type)val);
}
/** {@inheritDoc} */
@@ -691,7 +702,7 @@ public class HadoopClassLoader extends URLClassLoader {
*/
private static class CollectingFieldVisitor extends FieldVisitor {
/** Collector. */
- private final Collector c;
+ private final CollectingContext ctx;
/** Annotation visitor. */
private final AnnotationVisitor av;
@@ -699,21 +710,21 @@ public class HadoopClassLoader extends URLClassLoader {
/**
* Constructor.
*/
- CollectingFieldVisitor(Collector c, AnnotationVisitor av) {
+ CollectingFieldVisitor(CollectingContext ctx, AnnotationVisitor av) {
super(Opcodes.ASM4);
- this.c = c;
+ this.ctx = ctx;
this.av = av;
}
/** {@inheritDoc} */
@Override public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
- if (c.isDone())
+ if (ctx.found())
return null;
- c.onType(desc);
+ ctx.onType(desc);
- return c.isDone() ? null : av;
+ return ctx.found() ? null : av;
}
/** {@inheritDoc} */
@@ -732,7 +743,7 @@ public class HadoopClassLoader extends URLClassLoader {
*/
private static class CollectingClassVisitor extends ClassVisitor {
/** Collector. */
- private final Collector c;
+ private final CollectingContext ctx;
/** Annotation visitor. */
private final AnnotationVisitor av;
@@ -746,15 +757,15 @@ public class HadoopClassLoader extends URLClassLoader {
/**
* Constructor.
*
- * @param c Collector.
+ * @param ctx Collector.
* @param av Annotation visitor.
* @param mv Method visitor.
* @param fv Field visitor.
*/
- CollectingClassVisitor(Collector c, AnnotationVisitor av, MethodVisitor mv, FieldVisitor fv) {
+ CollectingClassVisitor(CollectingContext ctx, AnnotationVisitor av, MethodVisitor mv, FieldVisitor fv) {
super(Opcodes.ASM4);
- this.c = c;
+ this.ctx = ctx;
this.av = av;
this.mv = mv;
this.fv = fv;
@@ -762,19 +773,19 @@ public class HadoopClassLoader extends URLClassLoader {
/** {@inheritDoc} */
@Override public void visit(int i, int i2, String name, String signature, String superName, String[] ifaces) {
- if (c.isDone())
+ if (ctx.found())
return;
- c.onInternalTypeName(superName);
+ ctx.onInternalTypeName(superName);
- if (c.isDone())
+ if (ctx.found())
return;
if (ifaces != null) {
for (String iface : ifaces) {
- c.onInternalTypeName(iface);
+ ctx.onInternalTypeName(iface);
- if (c.isDone())
+ if (ctx.found())
return;
}
}
@@ -782,47 +793,47 @@ public class HadoopClassLoader extends URLClassLoader {
/** {@inheritDoc} */
@Override public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
- if (c.isDone())
+ if (ctx.found())
return null;
- c.onType(desc);
+ ctx.onType(desc);
- return c.isDone() ? null : av;
+ return ctx.found() ? null : av;
}
/** {@inheritDoc} */
@Override public void visitInnerClass(String name, String outerName, String innerName, int i) {
- if (c.isDone())
+ if (ctx.found())
return;
- c.onInternalTypeName(name);
+ ctx.onInternalTypeName(name);
}
/** {@inheritDoc} */
@Override public FieldVisitor visitField(int i, String name, String desc, String signature, Object val) {
- if (c.isDone())
+ if (ctx.found())
return null;
- c.onType(desc);
+ ctx.onType(desc);
- return c.isDone() ? null : fv;
+ return ctx.found() ? null : fv;
}
/** {@inheritDoc} */
@Override public MethodVisitor visitMethod(int i, String name, String desc, String signature,
String[] exceptions) {
- if (c.isDone())
+ if (ctx.found())
return null;
- c.onMethodsDesc(desc);
+ ctx.onMethodsDesc(desc);
// Process declared method exceptions:
if (exceptions != null) {
for (String e : exceptions)
- c.onInternalTypeName(e);
+ ctx.onInternalTypeName(e);
}
- return c.isDone() ? null : mv;
+ return ctx.found() ? null : mv;
}
}
@@ -831,7 +842,7 @@ public class HadoopClassLoader extends URLClassLoader {
*/
private static class CollectingMethodVisitor extends MethodVisitor {
/** Collector. */
- private final Collector c;
+ private final CollectingContext ctx;
/** Annotation visitor. */
private final AnnotationVisitor av;
@@ -839,52 +850,52 @@ public class HadoopClassLoader extends URLClassLoader {
/**
* Constructor.
*
- * @param c Collector.
+ * @param ctx Collector.
* @param av Annotation visitor.
*/
- private CollectingMethodVisitor(Collector c, AnnotationVisitor av) {
+ private CollectingMethodVisitor(CollectingContext ctx, AnnotationVisitor av) {
super(Opcodes.ASM4);
- this.c = c;
+ this.ctx = ctx;
this.av = av;
}
/** {@inheritDoc} */
@Override public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
- if (c.isDone())
+ if (ctx.found())
return null;
- c.onType(desc);
+ ctx.onType(desc);
- return c.isDone() ? null : av;
+ return ctx.found() ? null : av;
}
/** {@inheritDoc} */
@Override public AnnotationVisitor visitParameterAnnotation(int i, String desc, boolean b) {
- if (c.isDone())
+ if (ctx.found())
return null;
- c.onType(desc);
+ ctx.onType(desc);
- return c.isDone() ? null : av;
+ return ctx.found() ? null : av;
}
/** {@inheritDoc} */
@Override public AnnotationVisitor visitAnnotationDefault() {
- return c.isDone() ? null : av;
+ return ctx.found() ? null : av;
}
/** {@inheritDoc} */
@Override public void visitFieldInsn(int opcode, String owner, String name, String desc) {
- if (c.isDone())
+ if (ctx.found())
return;
- c.onInternalTypeName(owner);
+ ctx.onInternalTypeName(owner);
- if (c.isDone())
+ if (ctx.found())
return;
- c.onType(desc);
+ ctx.onType(desc);
}
/** {@inheritDoc} */
@@ -900,47 +911,47 @@ public class HadoopClassLoader extends URLClassLoader {
/** {@inheritDoc} */
@Override public void visitLocalVariable(String name, String desc, String signature, Label lb,
Label lb2, int i) {
- if (c.isDone())
+ if (ctx.found())
return;
- c.onType(desc);
+ ctx.onType(desc);
}
/** {@inheritDoc} */
@Override public void visitMethodInsn(int i, String owner, String name, String desc) {
- if (c.isDone())
+ if (ctx.found())
return;
- c.onInternalTypeName(owner);
+ ctx.onInternalTypeName(owner);
- if (c.isDone())
+ if (ctx.found())
return;
- c.onMethodsDesc(desc);
+ ctx.onMethodsDesc(desc);
}
/** {@inheritDoc} */
@Override public void visitMultiANewArrayInsn(String desc, int dim) {
- if (c.isDone())
+ if (ctx.found())
return;
- c.onType(desc);
+ ctx.onType(desc);
}
/** {@inheritDoc} */
@Override public void visitTryCatchBlock(Label start, Label end, Label hndl, String typeStr) {
- if (c.isDone())
+ if (ctx.found())
return;
- c.onInternalTypeName(typeStr);
+ ctx.onInternalTypeName(typeStr);
}
/** {@inheritDoc} */
@Override public void visitTypeInsn(int opcode, String type) {
- if (c.isDone())
+ if (ctx.found())
return;
- c.onInternalTypeName(type);
+ ctx.onInternalTypeName(type);
}
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/e6f4455c/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopClassLoaderTest.java
----------------------------------------------------------------------
diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopClassLoaderTest.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopClassLoaderTest.java
index e878d9a..88f43b8 100644
--- a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopClassLoaderTest.java
+++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopClassLoaderTest.java
@@ -105,8 +105,7 @@ public class HadoopClassLoaderTest extends TestCase {
};
for (Class c: positiveClasses)
- assertTrue(c.getName(),
- ldr.hasExternalDependencies(c.getName(), new HashSet<String>()));
+ assertTrue(c.getName(), ldr.hasExternalDependencies(c.getName()));
// Negative cases:
final Class[] negativeClasses = {
@@ -119,6 +118,6 @@ public class HadoopClassLoaderTest extends TestCase {
for (Class c: negativeClasses)
assertFalse(c.getName(),
- ldr.hasExternalDependencies(c.getName(), new HashSet<String>()));
+ ldr.hasExternalDependencies(c.getName()));
}
}
\ No newline at end of file