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())));

Reply via email to