Repository: ignite Updated Branches: refs/heads/ignite-2308 [created] 42a6a8c27
2308: added test, added comments. Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/922a4dae Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/922a4dae Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/922a4dae Branch: refs/heads/ignite-2308 Commit: 922a4daecadbd8b1485683274c36a86153f78f8e Parents: e298eab Author: iveselovskiy <[email protected]> Authored: Wed Dec 30 22:47:31 2015 +0300 Committer: iveselovskiy <[email protected]> Committed: Wed Dec 30 22:47:31 2015 +0300 ---------------------------------------------------------------------- .../hadoop/fs/v1/IgniteHadoopFileSystem.java | 1 + .../processors/hadoop/HadoopClassLoader.java | 591 +++++++++++++++---- .../hadoop/HadoopClassLoaderTest.java | 109 +++- .../hadoop/cls/CircularDependencyHadoop.java | 14 + .../hadoop/cls/CircularDependencyNoHadoop.java | 9 + .../hadoop/cls/DependencyNoHadoop.java | 9 + .../processors/hadoop/cls/HadoopCasting.java | 23 + .../hadoop/cls/HadoopClassAnnotation.java | 10 + .../hadoop/cls/HadoopConstructorInvocation.java | 13 + .../HadoopDeclaredCheckedExceptionInMethod.java | 13 + .../HadoopDeclaredRuntimeExceptionInMethod.java | 13 + .../processors/hadoop/cls/HadoopExtends.java | 10 + .../processors/hadoop/cls/HadoopField.java | 13 + .../processors/hadoop/cls/HadoopImplements.java | 19 + .../hadoop/cls/HadoopInitializer.java | 14 + .../processors/hadoop/cls/HadoopInnerClass.java | 15 + .../hadoop/cls/HadoopLocalVariableType.java | 20 + .../hadoop/cls/HadoopMethodAnnotation.java | 12 + .../hadoop/cls/HadoopMethodInvocation.java | 13 + .../hadoop/cls/HadoopMethodParameter.java | 13 + .../hadoop/cls/HadoopMethodReturnType.java | 13 + .../processors/hadoop/cls/HadoopOuterClass.java | 20 + .../hadoop/cls/HadoopParameterAnnotation.java | 11 + .../hadoop/cls/HadoopStaticField.java | 11 + .../hadoop/cls/HadoopStaticInitializer.java | 16 + .../processors/hadoop/cls/NoHadoop.java | 7 + .../testsuites/IgniteHadoopTestSuite.java | 3 + 27 files changed, 875 insertions(+), 140 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/922a4dae/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/v1/IgniteHadoopFileSystem.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/v1/IgniteHadoopFileSystem.java b/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/v1/IgniteHadoopFileSystem.java index 5dce67f..a72452b 100644 --- a/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/v1/IgniteHadoopFileSystem.java +++ b/modules/hadoop/src/main/java/org/apache/ignite/hadoop/fs/v1/IgniteHadoopFileSystem.java @@ -328,6 +328,7 @@ public class IgniteHadoopFileSystem extends FileSystem { if (initSecondary) { Map<String, String> props = paths.properties(); + //Object payload0 = paths.getPayload(getClass().getClassLoader()); String secUri = props.get(SECONDARY_FS_URI); String secConfPath = props.get(SECONDARY_FS_CONFIG_PATH); http://git-wip-us.apache.org/repos/asf/ignite/blob/922a4dae/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 f12af46..89a55e4 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 @@ -40,13 +40,16 @@ import org.apache.ignite.internal.util.typedef.internal.S; import org.jetbrains.annotations.Nullable; import org.jsr166.ConcurrentHashMap8; import org.objectweb.asm.AnnotationVisitor; +import org.objectweb.asm.Attribute; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.FieldVisitor; +import org.objectweb.asm.Handle; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; +import org.objectweb.asm.Type; import org.objectweb.asm.commons.Remapper; import org.objectweb.asm.commons.RemappingClassAdapter; @@ -125,10 +128,14 @@ public class HadoopClassLoader extends URLClassLoader { * @return {@code true} if we need to check this class. */ private static boolean isHadoopIgfs(String cls) { - String ignitePackagePrefix = "org.apache.ignite"; - int len = ignitePackagePrefix.length(); + String ignitePackPrefix = "org.apache.ignite"; - return cls.startsWith(ignitePackagePrefix) && (cls.indexOf("igfs.", len) != -1 || cls.indexOf(".fs.", len) != -1 || cls.indexOf("hadoop.", len) != -1); + int len = ignitePackPrefix.length(); + + return cls.startsWith(ignitePackPrefix) + && (cls.indexOf("igfs.", len) != -1 + || cls.indexOf(".fs.", len) != -1 + || cls.indexOf("hadoop.", len) != -1); } /** @@ -295,169 +302,527 @@ public class HadoopClassLoader extends URLClassLoader { final AtomicBoolean hasDeps = new AtomicBoolean(); - rdr.accept(new ClassVisitor(Opcodes.ASM4) { - AnnotationVisitor av = new AnnotationVisitor(Opcodes.ASM4) { - // TODO - }; + Collector c = new Collector(hasDeps, visited); - FieldVisitor fv = new FieldVisitor(Opcodes.ASM4) { - @Override public AnnotationVisitor visitAnnotation(String desc, boolean b) { - onType(desc); + AnnotationVisitor annotationVisitor = new CollectingAnnotationVisitor(c); - return av; - } - }; + MethodVisitor methVisitor = new CollectingMethodVisitor(c, annotationVisitor); - MethodVisitor mv = new MethodVisitor(Opcodes.ASM4) { - @Override public AnnotationVisitor visitAnnotation(String desc, boolean b) { - onType(desc); + FieldVisitor fieldVisitor = new CollectingFieldVisitor(c, annotationVisitor); - return av; - } + ClassVisitor clsVisitor = new CollectingClassVisitor(c, annotationVisitor, methVisitor, fieldVisitor); - @Override public AnnotationVisitor visitParameterAnnotation(int i, String desc, boolean b) { - onType(desc); + rdr.accept(clsVisitor, 0); - return av; - } + if (hasDeps.get()) // We already know that we have dependencies, no need to check parent. + return true; - @Override public AnnotationVisitor visitAnnotationDefault() { - return av; - } + // Here we are known to not have any dependencies but possibly we have a parent which has them. + int idx = clsName.lastIndexOf('$'); - @Override public void visitFieldInsn(int i, String owner, String name, String desc) { - onType(owner); - onType(desc); - } + if (idx == -1) // No parent class. + return false; - @Override public void visitFrame(int i, int i2, Object[] locTypes, int i3, Object[] stackTypes) { - for (Object o : locTypes) { - if (o instanceof String) - onType((String)o); - } + String parentCls = clsName.substring(0, idx); - for (Object o : stackTypes) { - if (o instanceof String) - onType((String)o); - } - } + if (visited.contains(parentCls)) + return false; - @Override public void visitLocalVariable(String name, String desc, String signature, Label lb, - Label lb2, int i) { - onType(desc); - } + Boolean res = cache.get(parentCls); - @Override public void visitMethodInsn(int i, String owner, String name, String desc) { - onType(owner); - } + if (res == null) + res = hasExternalDependencies(parentCls, visited); - @Override public void visitMultiANewArrayInsn(String desc, int dim) { - onType(desc); - } + return res; + } - @Override public void visitTryCatchBlock(Label lb, Label lb2, Label lb3, String e) { - onType(e); - } - }; + /** + * Implement business logic of the dependency analysis. + * Keeps the necessary state. + */ + private class Collector { + /** Attribute gets 'true' if the positive answer is found. */ + final AtomicBoolean hasDeps; + + /** Collection of visited class names to prevent infinite loops in case of + * circular dependencies. */ + final Set<String> visited; + + /** + * Constructor. + * + * @param hasDeps has dependencies initial value. + * @param visitedSet visited set initial value. + */ + Collector(AtomicBoolean hasDeps, Set<String> visitedSet) { + this.hasDeps = hasDeps; + + this.visited = visitedSet; + } - void onClass(String depCls) { - assert validateClassName(depCls) : depCls; + /** + * Answers if the model travers should be finished. + * + * @return If it is done. + */ + boolean isDone() { + return hasDeps.get(); + } - if (depCls.startsWith("java.")) // Filter out platform classes. - return; + /** + * Processes a method descriptor + * @param methDesc The method desc String. + */ + void onMethodsDesc(final String methDesc) { + // Process method return type: + onType(Type.getReturnType(methDesc)); - if (visited.contains(depCls)) - return; + if (isDone()) + return; - Boolean res = cache.get(depCls); + // Process method argument types: + for (Type t: Type.getArgumentTypes(methDesc)) { + onType(t); - if (res == Boolean.TRUE || (res == null && hasExternalDependencies(depCls, visited))) - hasDeps.set(true); + if (isDone()) + return; } + } - void onType(String type) { - if (type == null) - return; + /** + * Processes dependencies of a class. + * + * @param depCls The class name as dot-notated FQN. + */ + void onClass(final String depCls) { + assert depCls.indexOf('/') == -1 : depCls; // class name should be fully converted to dot notation. + assert depCls.charAt(0) != 'L' : depCls; + assert validateClassName(depCls) : depCls; - int off = 0; + if (depCls.startsWith("java.") || depCls.startsWith("javax.")) // Filter out platform classes. + return; - while (type.charAt(off) == '[') - off++; // Handle arrays. + if (visited.contains(depCls)) + return; - if (off != 0) - type = type.substring(off); + Boolean res = cache.get(depCls); - if (type.length() == 1) - return; // Get rid of primitives. + if (res == Boolean.TRUE + || (res == null && hasExternalDependencies(depCls, visited))) + hasDeps.set(true); + } - if (type.charAt(type.length() - 1) == ';') { - assert type.charAt(0) == 'L' : type; + /** + * Analyses dependencies of given type. + * + * @param t The type to process. + */ + void onType(Type t) { + if (t == null) + return; - type = type.substring(1, type.length() - 1); - } + int sort = t.getSort(); - type = type.replace('/', '.'); + switch (sort) { + case Type.ARRAY: + onType(t.getElementType()); - onClass(type); + break; + + case Type.OBJECT: + onClass(t.getClassName()); + + break; } + } - @Override public void visit(int i, int i2, String name, String signature, String superName, - String[] ifaces) { - onType(superName); + /** + * Analyses dependencies of given object type. + * + * @param objType The object type to process. + */ + void onInternalTypeName(String objType) { + if (objType == null) + return; - if (ifaces != null) { - for (String iface : ifaces) - onType(iface); - } + assert objType.length() > 1 : objType; + + if (objType.charAt(0) == '[') + // handle array. In this case this is a type descriptor notation, like "[Ljava/lang/Object;" + onType(objType); + else { + assert objType.indexOf('.') == -1 : objType; // Must be slash-separated FQN. + + String clsName = objType.replace('/', '.'); // Convert it to dot notation. + + onClass(clsName); // Process. } + } - @Override public AnnotationVisitor visitAnnotation(String desc, boolean visible) { - onType(desc); + /** + * Type description analyser. + * + * @param desc The description. + */ + void onType(String desc) { + if (!F.isEmpty(desc)) { + if (desc.length() <= 1) + return; // Optimization: filter out primitive types in early stage. - return av; + Type t = Type.getType(desc); + + onType(t); } + } + } + + /** + * Annotation visitor. + */ + static class CollectingAnnotationVisitor extends AnnotationVisitor { + /** */ + final Collector c; + + /** + * + * @param c The collector. + */ + CollectingAnnotationVisitor(Collector c) { + super(Opcodes.ASM4); + + this.c = c; + } + + /** {@inheritDoc} */ + @Override public AnnotationVisitor visitAnnotation(String name, String desc) { + if (c.isDone()) + return null; + + c.onType(desc); + + return this; + } + + /** {@inheritDoc} */ + @Override public void visitEnum(String name, String desc, String val) { + if (c.isDone()) + return; + + c.onType(desc); + } + + /** {@inheritDoc} */ + @Override public AnnotationVisitor visitArray(String name) { + return this; + } + + /** {@inheritDoc} */ + @Override public void visit(String name, Object val) { + if (val instanceof Type) + c.onType((Type)val); + } + + /** {@inheritDoc} */ + @Override public void visitEnd() { + // noop + } + } + + /** + * Field visitor. + */ + static class CollectingFieldVisitor extends FieldVisitor { + /** */ + private final Collector c; + + /** */ + private final AnnotationVisitor av; + + /** + * Constructor. + */ + CollectingFieldVisitor(Collector c, AnnotationVisitor av) { + super(Opcodes.ASM4); + + this.c = c; + + this.av = av; + } + + /** {@inheritDoc} */ + @Override public AnnotationVisitor visitAnnotation(String desc, boolean visible) { + if (c.isDone()) + return null; + + c.onType(desc); + + return av; + } + + /** {@inheritDoc} */ + @Override public void visitAttribute(Attribute attr) { + // noop + } + + /** {@inheritDoc} */ + @Override public void visitEnd() { + // noop + } + } - @Override public void visitInnerClass(String name, String outerName, String innerName, int i) { - onType(name); + /** + * Class visitor. + */ + static class CollectingClassVisitor extends ClassVisitor { + /** */ + private final Collector c; + + /** */ + private final AnnotationVisitor av; + + /** */ + private final MethodVisitor mv; + + /** */ + private final FieldVisitor fv; + + /** + * Constructor. + */ + CollectingClassVisitor(Collector c, AnnotationVisitor av, MethodVisitor mv, FieldVisitor fv) { + super(Opcodes.ASM4); + + this.c = c; + this.av = av; + this.mv = mv; + this.fv = fv; + } + + /** {@inheritDoc} */ + @Override public void visit(int i, int i2, String name, String signature, String superName, + String[] ifaces) { + if (c.isDone()) + return; + + c.onInternalTypeName(superName); + + if (c.isDone()) + return; + + if (ifaces != null) { + for (String iface : ifaces) { + c.onInternalTypeName(iface); + + if (c.isDone()) + return; + } } + } + + /** {@inheritDoc} */ + @Override public AnnotationVisitor visitAnnotation(String desc, boolean visible) { + if (c.isDone()) + return null; - @Override public FieldVisitor visitField(int i, String name, String desc, String signature, Object val) { - onType(desc); + c.onType(desc); + + return av; + } + + /** {@inheritDoc} */ + @Override public void visitInnerClass(String name, String outerName, String innerName, int i) { + if (c.isDone()) + return; + + c.onInternalTypeName(name); + } - return fv; + /** {@inheritDoc} */ + @Override public FieldVisitor visitField(int i, String name, String desc, String signature, Object val) { + if (c.isDone()) + return null; + + c.onType(desc); + + return fv; + } + + /** {@inheritDoc} */ + @Override public MethodVisitor visitMethod(int i, String name, String desc, String signature, + String[] exceptions) { + if (c.isDone()) + return null; + + c.onMethodsDesc(desc); + + // Process declared method exceptions: + if (exceptions != null) { + for (String e : exceptions) + c.onInternalTypeName(e); } - @Override public MethodVisitor visitMethod(int i, String name, String desc, String signature, - String[] exceptions) { - if (exceptions != null) { - for (String e : exceptions) - onType(e); + return mv; + } + } + + /** + * Method visitor. + */ + static class CollectingMethodVisitor extends MethodVisitor { + /** */ + private final Collector c; + + /** */ + private final AnnotationVisitor av; + + /** + * Constructor. + * + * @param c The collector. + * @param av The annotation visitor. + */ + CollectingMethodVisitor(Collector c, AnnotationVisitor av) { + super(Opcodes.ASM4); + + this.c = c; + this.av = av; + } + + /** {@inheritDoc} */ + @Override public AnnotationVisitor visitAnnotation(String desc, boolean visible) { + if (c.isDone()) + return null; + + c.onType(desc); + + return av; + } + + /** {@inheritDoc} */ + @Override public AnnotationVisitor visitParameterAnnotation(int i, String desc, boolean b) { + if (c.isDone()) + return null; + + c.onType(desc); + + return av; + } + + /** {@inheritDoc} */ + @Override public AnnotationVisitor visitAnnotationDefault() { + return av; + } + + /** {@inheritDoc} */ + @Override public void visitFieldInsn(int opcode, String owner, String name, String desc) { + if (c.isDone()) + return; + + c.onInternalTypeName(owner); + + if (c.isDone()) + return; + + c.onType(desc); + } + + /** {@inheritDoc} */ + @Override public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) { + if (c.isDone()) + return; + + c.onMethodsDesc(desc); + + if (c.isDone()) + return; + + if (bsmArgs != null) { + for (Object b: bsmArgs) { + if (b instanceof Type) + c.onType((Type) b); + + if (c.isDone()) + return; } + } + } - return mv; + /** {@inheritDoc} */ + @Override public void visitFrame(int type, int nLoc, Object[] locTypes, int nStack, + Object[] stackTypes) { + // TODO: not sure we need that to detect dependencies. This seems to be superfluous. + // Optimizations: + // 1) Do not consider frames that are exactly equal to the previous; + // 2) Return if local and stack arrays are empty ('nLock' and 'nStack' correspond to the number + // of non-null array elements). + if (type == Opcodes.F_SAME || (nLoc == 0 && nStack == 0)) + return; + + if (c.isDone()) + return; + + for (Object o : locTypes) { + if (o instanceof String) + c.onInternalTypeName((String) o); + + if (c.isDone()) + return; } - }, 0); - if (hasDeps.get()) // We already know that we have dependencies, no need to check parent. - return true; + for (Object o : stackTypes) { + if (o instanceof String) + c.onInternalTypeName((String) o); - // Here we are known to not have any dependencies but possibly we have a parent which have them. - int idx = clsName.lastIndexOf('$'); + if (c.isDone()) + return; + } + } - if (idx == -1) // No parent class. - return false; + /** {@inheritDoc} */ + @Override public void visitLocalVariable(String name, String desc, String signature, Label lb, + Label lb2, int i) { + if (c.isDone()) + return; - String parentCls = clsName.substring(0, idx); + c.onType(desc); + } - if (visited.contains(parentCls)) - return false; + /** {@inheritDoc} */ + @Override public void visitMethodInsn(int i, String owner, String name, String desc) { + if (c.isDone()) + return; - Boolean res = cache.get(parentCls); + c.onInternalTypeName(owner); - if (res == null) - res = hasExternalDependencies(parentCls, visited); + if (c.isDone()) + return; - return res; + c.onMethodsDesc(desc); + } + + /** {@inheritDoc} */ + @Override public void visitMultiANewArrayInsn(String desc, int dim) { + if (c.isDone()) + return; + + c.onType(desc); + } + + /** {@inheritDoc} */ + @Override public void visitTryCatchBlock(Label start, Label end, Label hndl, String typeStr) { + if (c.isDone()) + return; + + c.onInternalTypeName(typeStr); + } + + /** {@inheritDoc} */ + @Override public void visitTypeInsn(int opcode, String type) { + if (c.isDone()) + return; + + c.onInternalTypeName(type); + } } /** http://git-wip-us.apache.org/repos/asf/ignite/blob/922a4dae/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 085dd45..e878d9a 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 @@ -17,53 +17,108 @@ package org.apache.ignite.internal.processors.hadoop; +import java.util.HashSet; +import javax.security.auth.AuthPermission; import junit.framework.TestCase; +import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.mapreduce.Job; +import org.apache.ignite.internal.processors.hadoop.cls.CircularDependencyHadoop; +import org.apache.ignite.internal.processors.hadoop.cls.CircularDependencyNoHadoop; +import org.apache.ignite.internal.processors.hadoop.cls.DependencyNoHadoop; +import org.apache.ignite.internal.processors.hadoop.cls.HadoopCasting; +import org.apache.ignite.internal.processors.hadoop.cls.HadoopClassAnnotation; +import org.apache.ignite.internal.processors.hadoop.cls.HadoopConstructorInvocation; +import org.apache.ignite.internal.processors.hadoop.cls.HadoopDeclaredCheckedExceptionInMethod; +import org.apache.ignite.internal.processors.hadoop.cls.HadoopDeclaredRuntimeExceptionInMethod; +import org.apache.ignite.internal.processors.hadoop.cls.HadoopExtends; +import org.apache.ignite.internal.processors.hadoop.cls.HadoopField; +import org.apache.ignite.internal.processors.hadoop.cls.HadoopImplements; +import org.apache.ignite.internal.processors.hadoop.cls.HadoopInitializer; +import org.apache.ignite.internal.processors.hadoop.cls.HadoopInnerClass; +import org.apache.ignite.internal.processors.hadoop.cls.HadoopLocalVariableType; +import org.apache.ignite.internal.processors.hadoop.cls.HadoopMethodAnnotation; +import org.apache.ignite.internal.processors.hadoop.cls.HadoopMethodInvocation; +import org.apache.ignite.internal.processors.hadoop.cls.HadoopMethodParameter; +import org.apache.ignite.internal.processors.hadoop.cls.HadoopMethodReturnType; +import org.apache.ignite.internal.processors.hadoop.cls.HadoopOuterClass; +import org.apache.ignite.internal.processors.hadoop.cls.HadoopParameterAnnotation; +import org.apache.ignite.internal.processors.hadoop.cls.HadoopStaticField; +import org.apache.ignite.internal.processors.hadoop.cls.HadoopStaticInitializer; +import org.apache.ignite.internal.processors.hadoop.cls.NoHadoop; /** * */ public class HadoopClassLoaderTest extends TestCase { /** */ - HadoopClassLoader ldr = new HadoopClassLoader(null, "test"); + final HadoopClassLoader ldr = new HadoopClassLoader(null, "test"); /** * @throws Exception If failed. */ public void testClassLoading() throws Exception { - assertNotSame(Test1.class, ldr.loadClass(Test1.class.getName())); - assertNotSame(Test2.class, ldr.loadClass(Test2.class.getName())); - assertSame(Test3.class, ldr.loadClass(Test3.class.getName())); - } + assertNotSame(CircularDependencyHadoop.class, ldr.loadClass(CircularDependencyHadoop.class.getName())); + assertNotSame(CircularDependencyNoHadoop.class, ldr.loadClass(CircularDependencyNoHadoop.class.getName())); -// public void testDependencySearch() { -// assertTrue(ldr.hasExternalDependencies(Test1.class.getName(), new HashSet<String>())); -// assertTrue(ldr.hasExternalDependencies(Test2.class.getName(), new HashSet<String>())); -// } + assertSame(NoHadoop.class, ldr.loadClass(NoHadoop.class.getName())); + } /** * */ - private static class Test1 { - /** */ - Test2 t2; + public void testDependencySearch() { + // Various positive cases of Hadoop classes dependency: + final Class[] positiveClasses = { + // Hadoop class itself: + Configuration.class, + // Class for that org.apache.ignite.internal.processors.hadoop.HadoopClassLoader.isHadoopIgfs returns true: + HadoopUtils.class, - /** */ - Job[][] jobs = new Job[4][4]; - } + HadoopStaticField.class, + HadoopCasting.class, + HadoopClassAnnotation.class, + HadoopConstructorInvocation.class, + HadoopDeclaredCheckedExceptionInMethod.class, + HadoopDeclaredRuntimeExceptionInMethod.class, + HadoopExtends.class, + HadoopField.class, + HadoopImplements.class, + HadoopInitializer.class, - /** - * - */ - private static abstract class Test2 { - /** */ - abstract Test1 t1(); - } + // TODO: actually the 2 below classes do not depend on Hadoop, should not be detected as such. + // TODO: but for now they are, so this behavior is asserted in test: + HadoopInnerClass.class, + HadoopOuterClass.InnerNoHadoop.class, - /** - * - */ - private static class Test3 { - // No-op. + HadoopLocalVariableType.class, + HadoopMethodAnnotation.class, + HadoopMethodInvocation.class, + HadoopMethodParameter.class, + HadoopMethodReturnType.class, + HadoopParameterAnnotation.class, + HadoopStaticField.class, + HadoopStaticInitializer.class, + + DependencyNoHadoop.class, + CircularDependencyHadoop.class, + CircularDependencyNoHadoop.class, + }; + + for (Class c: positiveClasses) + assertTrue(c.getName(), + ldr.hasExternalDependencies(c.getName(), new HashSet<String>())); + + // Negative cases: + final Class[] negativeClasses = { + // java.lang.*: + Object.class, + // javax.*: + AuthPermission.class, + NoHadoop.class, + }; + + for (Class c: negativeClasses) + assertFalse(c.getName(), + ldr.hasExternalDependencies(c.getName(), new HashSet<String>())); } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/922a4dae/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/CircularDependencyHadoop.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/CircularDependencyHadoop.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/CircularDependencyHadoop.java new file mode 100644 index 0000000..02df9be --- /dev/null +++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/CircularDependencyHadoop.java @@ -0,0 +1,14 @@ +package org.apache.ignite.internal.processors.hadoop.cls; + +import org.apache.hadoop.mapreduce.Job; + +/** + * Class has a direct Hadoop dependency and a circular dependency on another class. + */ +public class CircularDependencyHadoop { + /** */ + Job[][] jobs = new Job[4][4]; + + /** */ + private CircularDependencyNoHadoop y; +} http://git-wip-us.apache.org/repos/asf/ignite/blob/922a4dae/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/CircularDependencyNoHadoop.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/CircularDependencyNoHadoop.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/CircularDependencyNoHadoop.java new file mode 100644 index 0000000..0f9b543 --- /dev/null +++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/CircularDependencyNoHadoop.java @@ -0,0 +1,9 @@ +package org.apache.ignite.internal.processors.hadoop.cls; + +/** + * Does not have direct Hadoop dependency, but has a circular + */ +public class CircularDependencyNoHadoop { + /** */ + private CircularDependencyHadoop x; +} http://git-wip-us.apache.org/repos/asf/ignite/blob/922a4dae/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/DependencyNoHadoop.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/DependencyNoHadoop.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/DependencyNoHadoop.java new file mode 100644 index 0000000..f13f1ce --- /dev/null +++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/DependencyNoHadoop.java @@ -0,0 +1,9 @@ +package org.apache.ignite.internal.processors.hadoop.cls; + +/** + * Has a unidirected dependency on Hadoop-dependent class. + */ +public class DependencyNoHadoop { + /** */ + HadoopField x; +} http://git-wip-us.apache.org/repos/asf/ignite/blob/922a4dae/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopCasting.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopCasting.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopCasting.java new file mode 100644 index 0000000..39a58f6 --- /dev/null +++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopCasting.java @@ -0,0 +1,23 @@ +package org.apache.ignite.internal.processors.hadoop.cls; + +import org.apache.hadoop.fs.FileSystem; + +/** + * Class contains casting to a Hadoop type. + */ +public abstract class HadoopCasting <T> { + /** */ + public abstract T create(); + + /** */ + public void consume(T t) { + // noop + } + + /** */ + void test(HadoopCasting<FileSystem> c) { + FileSystem fs = c.create(); + + c.consume(fs); + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/922a4dae/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopClassAnnotation.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopClassAnnotation.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopClassAnnotation.java new file mode 100644 index 0000000..ff18f82 --- /dev/null +++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopClassAnnotation.java @@ -0,0 +1,10 @@ +package org.apache.ignite.internal.processors.hadoop.cls; + +import org.apache.hadoop.classification.InterfaceAudience; + +/** + * Class has Hadoop annotation. + */ [email protected] +public class HadoopClassAnnotation { +} http://git-wip-us.apache.org/repos/asf/ignite/blob/922a4dae/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopConstructorInvocation.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopConstructorInvocation.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopConstructorInvocation.java new file mode 100644 index 0000000..c7ac886 --- /dev/null +++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopConstructorInvocation.java @@ -0,0 +1,13 @@ +package org.apache.ignite.internal.processors.hadoop.cls; + +import org.apache.hadoop.conf.Configuration; + +/** + * Invokes a Hadoop type constructor. + */ +public class HadoopConstructorInvocation { + /** */ + private void foo() { + Object x = new Configuration(); + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/922a4dae/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopDeclaredCheckedExceptionInMethod.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopDeclaredCheckedExceptionInMethod.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopDeclaredCheckedExceptionInMethod.java new file mode 100644 index 0000000..b9890f1 --- /dev/null +++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopDeclaredCheckedExceptionInMethod.java @@ -0,0 +1,13 @@ +package org.apache.ignite.internal.processors.hadoop.cls; + +import org.apache.hadoop.fs.ChecksumException; + +/** + * Method declares a checked Hadoop Exception. + */ +public class HadoopDeclaredCheckedExceptionInMethod { + /** */ + void foo() throws ChecksumException { + // noop + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/922a4dae/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopDeclaredRuntimeExceptionInMethod.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopDeclaredRuntimeExceptionInMethod.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopDeclaredRuntimeExceptionInMethod.java new file mode 100644 index 0000000..9c8c000 --- /dev/null +++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopDeclaredRuntimeExceptionInMethod.java @@ -0,0 +1,13 @@ +package org.apache.ignite.internal.processors.hadoop.cls; + +import org.apache.hadoop.HadoopIllegalArgumentException; + +/** + * Method declares a runtime Hadoop Exception. + */ +public class HadoopDeclaredRuntimeExceptionInMethod { + /** */ + void foo() throws HadoopIllegalArgumentException { + // noop + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/922a4dae/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopExtends.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopExtends.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopExtends.java new file mode 100644 index 0000000..f0a082e --- /dev/null +++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopExtends.java @@ -0,0 +1,10 @@ +package org.apache.ignite.internal.processors.hadoop.cls; + +import org.apache.hadoop.fs.LocalFileSystem; + +/** + * Class extends a Hadoop class. + */ +public class HadoopExtends extends LocalFileSystem { + // noop +} http://git-wip-us.apache.org/repos/asf/ignite/blob/922a4dae/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopField.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopField.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopField.java new file mode 100644 index 0000000..ccdeb0e --- /dev/null +++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopField.java @@ -0,0 +1,13 @@ +package org.apache.ignite.internal.processors.hadoop.cls; + +import org.apache.hadoop.conf.Configuration; + +/** + * Has a Hadoop field. + */ +public class HadoopField { + /** + * + */ + private Configuration conf; +} http://git-wip-us.apache.org/repos/asf/ignite/blob/922a4dae/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopImplements.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopImplements.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopImplements.java new file mode 100644 index 0000000..a143e85 --- /dev/null +++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopImplements.java @@ -0,0 +1,19 @@ +package org.apache.ignite.internal.processors.hadoop.cls; + +import org.apache.hadoop.conf.Configurable; +import org.apache.hadoop.conf.Configuration; + +/** + * Implements a Hadoop interface. + */ +public class HadoopImplements implements Configurable { + /** {@inheritDoc} */ + @Override public void setConf(Configuration conf) { + // noop + } + + /** {@inheritDoc} */ + @Override public Configuration getConf() { + return null; + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/922a4dae/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopInitializer.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopInitializer.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopInitializer.java new file mode 100644 index 0000000..f153e57 --- /dev/null +++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopInitializer.java @@ -0,0 +1,14 @@ +package org.apache.ignite.internal.processors.hadoop.cls; + +/** + * Has a field initialized with an expression invoking Hadoop method. + */ +public class HadoopInitializer { + /** */ + private final Object x = org.apache.hadoop.fs.FileSystem.getDefaultUri(null); + + /** */ + HadoopInitializer() throws Exception { + // noop + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/922a4dae/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopInnerClass.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopInnerClass.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopInnerClass.java new file mode 100644 index 0000000..15d0a4a --- /dev/null +++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopInnerClass.java @@ -0,0 +1,15 @@ +package org.apache.ignite.internal.processors.hadoop.cls; + +import org.apache.hadoop.conf.Configurable; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.AbstractFileSystem; + +/** + * Has a *static* inner class depending on Hadoop. + */ +public class HadoopInnerClass { + /** */ + private static abstract class Foo implements Configurable { + // nothing + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/922a4dae/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopLocalVariableType.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopLocalVariableType.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopLocalVariableType.java new file mode 100644 index 0000000..a82909c --- /dev/null +++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopLocalVariableType.java @@ -0,0 +1,20 @@ +package org.apache.ignite.internal.processors.hadoop.cls; + +import org.apache.hadoop.conf.Configuration; + +/** + * Has a local variable of Hadoop type. + */ +public class HadoopLocalVariableType { + /** */ + void foo() { + Configuration c = null; + + moo(c); + } + + /** */ + void moo(Object x) { + + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/922a4dae/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopMethodAnnotation.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopMethodAnnotation.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopMethodAnnotation.java new file mode 100644 index 0000000..b62677b --- /dev/null +++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopMethodAnnotation.java @@ -0,0 +1,12 @@ +package org.apache.ignite.internal.processors.hadoop.cls; + +/** + * Method has a Hadoop annotation. + */ +public class HadoopMethodAnnotation { + /** */ + @org.apache.hadoop.classification.InterfaceStability.Unstable + void foo() { + // noop + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/922a4dae/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopMethodInvocation.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopMethodInvocation.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopMethodInvocation.java new file mode 100644 index 0000000..85a1e49 --- /dev/null +++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopMethodInvocation.java @@ -0,0 +1,13 @@ +package org.apache.ignite.internal.processors.hadoop.cls; + +import org.apache.hadoop.fs.FileSystem; + +/** + * Method contains a Hadoop type method invocation. + */ +public class HadoopMethodInvocation { + /** */ + void foo(FileSystem fs) { + fs.getChildFileSystems(); + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/922a4dae/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopMethodParameter.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopMethodParameter.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopMethodParameter.java new file mode 100644 index 0000000..427b771 --- /dev/null +++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopMethodParameter.java @@ -0,0 +1,13 @@ +package org.apache.ignite.internal.processors.hadoop.cls; + +import org.apache.hadoop.conf.Configuration; + +/** + * Contains a formal parameter of Hadoop type. + */ +public class HadoopMethodParameter { + /** */ + protected void paramaterMethod(Configuration c) { + // noop + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/922a4dae/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopMethodReturnType.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopMethodReturnType.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopMethodReturnType.java new file mode 100644 index 0000000..afb883d --- /dev/null +++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopMethodReturnType.java @@ -0,0 +1,13 @@ +package org.apache.ignite.internal.processors.hadoop.cls; + +import org.apache.hadoop.fs.FileSystem; + +/** + * Contains a method return value of Hadoop type. + */ +public class HadoopMethodReturnType { + /** */ + FileSystem fsMethod() { + return null; + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/922a4dae/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopOuterClass.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopOuterClass.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopOuterClass.java new file mode 100644 index 0000000..8a453d7 --- /dev/null +++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopOuterClass.java @@ -0,0 +1,20 @@ +package org.apache.ignite.internal.processors.hadoop.cls; + +import org.apache.hadoop.conf.Configuration; + +/** + * Outer class depends on Hadoop, but Inner *static* one does not. + */ +public class HadoopOuterClass { + /** */ + Configuration c; + + /** */ + public static class InnerNoHadoop { + /** */ + int x; + + /** */ + void foo() {} + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/922a4dae/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopParameterAnnotation.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopParameterAnnotation.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopParameterAnnotation.java new file mode 100644 index 0000000..03da8e2 --- /dev/null +++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopParameterAnnotation.java @@ -0,0 +1,11 @@ +package org.apache.ignite.internal.processors.hadoop.cls; + +/** + * Has a paramater annotated with a Hadoop annotation. + */ +public class HadoopParameterAnnotation { + /** */ + void foo(@org.apache.hadoop.classification.InterfaceStability.Stable Object annotatedParam) { + // noop + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/922a4dae/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopStaticField.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopStaticField.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopStaticField.java new file mode 100644 index 0000000..fd11093 --- /dev/null +++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopStaticField.java @@ -0,0 +1,11 @@ +package org.apache.ignite.internal.processors.hadoop.cls; + +import org.apache.hadoop.fs.FileSystem; + +/** + * Has a static field of Hadoop type. + */ +public class HadoopStaticField { + /** */ + static FileSystem fs; +} http://git-wip-us.apache.org/repos/asf/ignite/blob/922a4dae/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopStaticInitializer.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopStaticInitializer.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopStaticInitializer.java new file mode 100644 index 0000000..022493b --- /dev/null +++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/HadoopStaticInitializer.java @@ -0,0 +1,16 @@ +package org.apache.ignite.internal.processors.hadoop.cls; + +import java.util.List; +import org.apache.hadoop.fs.FileSystem; + +/** + * Uses Hadoop type in a static initializer. + */ +public class HadoopStaticInitializer { + /** */ + static final List x; + + static { + x = FileSystem.getAllStatistics(); + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/922a4dae/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/NoHadoop.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/NoHadoop.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/NoHadoop.java new file mode 100644 index 0000000..8bd13f9 --- /dev/null +++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/cls/NoHadoop.java @@ -0,0 +1,7 @@ +package org.apache.ignite.internal.processors.hadoop.cls; + +/** + * Class that does not anyhow depend on Hadoop. + */ +public class NoHadoop { +} http://git-wip-us.apache.org/repos/asf/ignite/blob/922a4dae/modules/hadoop/src/test/java/org/apache/ignite/testsuites/IgniteHadoopTestSuite.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/testsuites/IgniteHadoopTestSuite.java b/modules/hadoop/src/test/java/org/apache/ignite/testsuites/IgniteHadoopTestSuite.java index 6641bc8..1831085 100644 --- a/modules/hadoop/src/test/java/org/apache/ignite/testsuites/IgniteHadoopTestSuite.java +++ b/modules/hadoop/src/test/java/org/apache/ignite/testsuites/IgniteHadoopTestSuite.java @@ -54,6 +54,7 @@ import org.apache.ignite.igfs.IgniteHadoopFileSystemLoopbackExternalPrimarySelfT import org.apache.ignite.igfs.IgniteHadoopFileSystemLoopbackExternalSecondarySelfTest; import org.apache.ignite.igfs.IgniteHadoopFileSystemSecondaryFileSystemInitializationSelfTest; import org.apache.ignite.igfs.IgniteHadoopFileSystemSecondaryModeSelfTest; +import org.apache.ignite.internal.processors.hadoop.HadoopClassLoaderTest; import org.apache.ignite.internal.processors.hadoop.HadoopCommandLineTest; import org.apache.ignite.internal.processors.hadoop.HadoopDefaultMapReducePlannerSelfTest; import org.apache.ignite.internal.processors.hadoop.HadoopFileSystemsTest; @@ -95,6 +96,8 @@ public class IgniteHadoopTestSuite extends TestSuite { TestSuite suite = new TestSuite("Ignite Hadoop MR Test Suite"); + suite.addTest(new TestSuite(ldr.loadClass(HadoopClassLoaderTest.class.getName()))); + suite.addTest(new TestSuite(ldr.loadClass(HadoopIgfs20FileSystemLoopbackPrimarySelfTest.class.getName()))); suite.addTest(new TestSuite(ldr.loadClass(HadoopIgfsDualSyncSelfTest.class.getName())));
