Package alt.jiapi.reflect

Examples of alt.jiapi.reflect.InstructionFactory


            // silly stuff for longs/doubles in JVMs
            // maxLocalsInOtherList--;
           
            InstructionList newList = new InstructionList();
           
            InstructionFactory factory = new InstructionFactory();
            for(int i = 0; i < advice.size(); i++) {
                Instruction ins = advice.get(i);
                newList.add(ins);
                switch(ins.getOpcode()) {
                    // -- ALOAD family --------------------------------------
                    case Opcodes.ALOAD_0:
                        newList.replace(i, factory.aload(maxLocalsInOtherList));
                        break;
                    case Opcodes.ALOAD_1:
                        newList.replace(i, factory.aload(maxLocalsInOtherList + 1));
                        break;
                    case Opcodes.ALOAD_2:
                        newList.replace(i, factory.aload(maxLocalsInOtherList + 2));
                        break;
                    case Opcodes.ALOAD_3:
                        newList.replace(i, factory.aload(maxLocalsInOtherList + 3));
                        break;
                    case Opcodes.ALOAD:
                        // Handle this differently. This
                        // form of handling does not break exception table
                        // So, we minimize damage by handling this differently
                        ins.getBytes()[1] += (byte)maxLocalsInOtherList;
                        break;
                    case Opcodes.ASTORE_0:
                        newList.replace(i, factory.astore(maxLocalsInOtherList));
                        break;
                    case Opcodes.ASTORE_1:
                        newList.replace(i, factory.astore(maxLocalsInOtherList + 1));
                        break;
                    case Opcodes.ASTORE_2:
                        newList.replace(i, factory.astore(maxLocalsInOtherList + 2));
                        break;
                    case Opcodes.ASTORE_3:
                        newList.replace(i, factory.astore(maxLocalsInOtherList + 3));
                        break;
                    case Opcodes.ASTORE:
                        // Handle this differently. This
                        // form of handling does not break exception table
                        // So, we minimize damage by handling this differently
                        ins.getBytes()[1] += (byte)maxLocalsInOtherList;
                        break;

                    // -- ILOAD family --------------------------------------
                    case Opcodes.ILOAD_0:
                        newList.replace(i, factory.iload(maxLocalsInOtherList));
                        break;
                    case Opcodes.ILOAD_1:
                        newList.replace(i, factory.iload(maxLocalsInOtherList + 1));
                        break;
                    case Opcodes.ILOAD_2:
                        newList.replace(i, factory.iload(maxLocalsInOtherList + 2));
                        break;
                    case Opcodes.ILOAD_3:
                        newList.replace(i, factory.iload(maxLocalsInOtherList + 3));
                        break;
                    case Opcodes.ILOAD:
                        // Handle this differently. This
                        // form of handling does not break exception table
                        // So, we minimize damage by handling this differently
                        ins.getBytes()[1] += (byte)maxLocalsInOtherList;
                        break;
                    case Opcodes.ISTORE_0:
                        newList.replace(i, factory.istore(maxLocalsInOtherList));
                        break;
                    case Opcodes.ISTORE_1:
                        newList.replace(i, factory.istore(maxLocalsInOtherList + 1));
                        break;
                    case Opcodes.ISTORE_2:
                        newList.replace(i, factory.istore(maxLocalsInOtherList + 2));
                        break;
                    case Opcodes.ISTORE_3:
                        newList.replace(i, factory.istore(maxLocalsInOtherList + 3));
                        break;
                    case Opcodes.ISTORE:
                        // Handle this differently. This
                        // form of handling does not break exception table
                        // So, we minimize damage by handling this differently
                        ins.getBytes()[1] += (byte)maxLocalsInOtherList;
                        break;

                    // -- DLOAD family --------------------------------------
                    case Opcodes.DLOAD_0:
                        newList.replace(i, factory.dload(maxLocalsInOtherList));
                        break;
                    case Opcodes.DLOAD_1:
                        newList.replace(i, factory.dload(maxLocalsInOtherList + 1));
                        break;
                    case Opcodes.DLOAD_2:
                        newList.replace(i, factory.dload(maxLocalsInOtherList + 2));
                        break;
                    case Opcodes.DLOAD_3:
                        newList.replace(i, factory.dload(maxLocalsInOtherList + 3));
                        break;
                    case Opcodes.DLOAD:
                        // Handle this differently. This
                        // form of handling does not break exception table
                        // So, we minimize damage by handling this differently
                        ins.getBytes()[1] += (byte)maxLocalsInOtherList;
                        break;
                    case Opcodes.DSTORE_0:
                        newList.replace(i, factory.dstore(maxLocalsInOtherList));
                        break;
                    case Opcodes.DSTORE_1:
                        newList.replace(i, factory.dstore(maxLocalsInOtherList + 1));
                        break;
                    case Opcodes.DSTORE_2:
                        newList.replace(i, factory.dstore(maxLocalsInOtherList + 2));
                        break;
                    case Opcodes.DSTORE_3:
                        newList.replace(i, factory.dstore(maxLocalsInOtherList + 3));
                        break;
                    case Opcodes.DSTORE:
                        // Handle this differently. This
                        // form of handling does not break exception table
                        // So, we minimize damage by handling this differently
                        ins.getBytes()[1] += (byte)maxLocalsInOtherList;
                        break;

                    // -- LLOAD family --------------------------------------
                    case Opcodes.LLOAD_0:
                        newList.replace(i, factory.lload(maxLocalsInOtherList));
                        break;
                    case Opcodes.LLOAD_1:
                        newList.replace(i, factory.lload(maxLocalsInOtherList + 1));
                        break;
                    case Opcodes.LLOAD_2:
                        newList.replace(i, factory.lload(maxLocalsInOtherList + 2));
                        break;
                    case Opcodes.LLOAD_3:
                        newList.replace(i, factory.lload(maxLocalsInOtherList + 3));
                        break;
                    case Opcodes.LLOAD:
                        // Handle this differently. This
                        // form of handling does not break exception table
                        // So, we minimize damage by handling this differently
                        ins.getBytes()[1] += (byte)maxLocalsInOtherList;
                        break;
                    case Opcodes.LSTORE_0:
                        newList.replace(i, factory.lstore(maxLocalsInOtherList));
                        break;
                    case Opcodes.LSTORE_1:
                        newList.replace(i, factory.lstore(maxLocalsInOtherList + 1));
                        break;
                    case Opcodes.LSTORE_2:
                        newList.replace(i, factory.lstore(maxLocalsInOtherList + 2));
                        break;
                    case Opcodes.LSTORE_3:
                        newList.replace(i, factory.lstore(maxLocalsInOtherList + 3));
                        break;
                    case Opcodes.LSTORE:
                        // Handle this differently. This
                        // form of handling does not break exception table
                        // So, we minimize damage by handling this differently
                        ins.getBytes()[1] += (byte)maxLocalsInOtherList;
                        break;
                       
                    // -- FLOAD family --------------------------------------
                    case Opcodes.FLOAD_0:
                        newList.replace(i, factory.fload(maxLocalsInOtherList));
                        break;
                    case Opcodes.FLOAD_1:
                        newList.replace(i, factory.fload(maxLocalsInOtherList + 1));
                        break;
                    case Opcodes.FLOAD_2:
                        newList.replace(i, factory.fload(maxLocalsInOtherList + 2));
                        break;
                    case Opcodes.FLOAD_3:
                        newList.replace(i, factory.fload(maxLocalsInOtherList + 3));
                        break;
                    case Opcodes.FLOAD:
                        // Handle this differently. This
                        // form of handling does not break exception table
                        // So, we minimize damage by handling this differently
                        ins.getBytes()[1] += (byte)maxLocalsInOtherList;
                        break;
                    case Opcodes.FSTORE_0:
                        newList.replace(i, factory.fstore(maxLocalsInOtherList));
                        break;
                    case Opcodes.FSTORE_1:
                        newList.replace(i, factory.fstore(maxLocalsInOtherList + 1));
                        break;
                    case Opcodes.FSTORE_2:
                        newList.replace(i, factory.fstore(maxLocalsInOtherList + 2));
                        break;
                    case Opcodes.FSTORE_3:
                        newList.replace(i, factory.fstore(maxLocalsInOtherList + 3));
                        break;
                    case Opcodes.FSTORE:
                        // Handle this differently. This
                        // form of handling does not break exception table
                        // So, we minimize damage by handling this differently
View Full Code Here


         * Process all the advice triggers found from advice() method,
         * such as a call to getHotSpotName()
         */
        private void processAdviceTriggers(InstructionList il, HotSpot hs) {
           
            InstructionFactory factory = il.getInstructionFactory();
            // Search for calls to possible trigger methods in
            // advice method.
            HotSpotLocator hsl = new HotSpotLocator(il, Opcodes.INVOKEVIRTUAL);

            HotSpot[] triggerCandidates = hsl.getHotSpots();
            for (int i = 0; i < triggerCandidates.length; i++) {
                Invocation inv =
                    (Invocation)triggerCandidates[i].getHotSpotInstruction();

                if (!inv.getClassName().equals(adviceMethod.getDeclaringClass().getName())) {
                    // Process only calls to HotSpotAdvice class
                    continue;
                }

                // Index of the trigger instruction
                int idx = il.indexOf(inv);

                // Following assumes, that trigger call is
                // void-void method.
                // First, we remove a call to Advice class...
                InstructionList view = il.createView(idx-1, idx + 1);
    view.clear();

                // ...then we replace, that call with trigger action
                // instructions.
                if ("getHotSpotName".equals(inv.getMethodName())) {
                    view.add(factory.pushConstant(hs.getName()));
                }
                else if ("getArguments".equals(inv.getMethodName())) {
                    // NOT IMPLEMENTED
                    // This needs some further thinking before implementing
                }
                else if ("getInstrumentedObject".equals(inv.getMethodName())) {
        JiapiMethod jm = il.getDeclaringMethod();
        int modifiers = jm.getModifiers();
        if (Modifier.isStatic(modifiers)) {
      // Static methods do not have reference to 'this'
      //view.add(factory.pushNull());
      view.add(factory.pushConstant(jm.getDeclaringClass().getName()));
      view.add(factory.invoke(Modifier.STATIC, "java.lang.Class", "forName", new Signature("java.lang.Class", new String[] {"java.lang.String"})));
        }
        else {
      view.add(factory.aload(0));
        }
                    // NOT IMPLEMENTED
                    // This needs some further thinking before implementing
                }
            }
View Full Code Here

    /**
     * @return an Invocation to constructor of primitive wrapper
     */
    private Instruction handlePrimitiveType(String type, InstructionList il) {
        InstructionFactory f = il.getInstructionFactory();
        String cName = null;
        Signature s = new Signature("void", new String[]{ type });

        if ("int".equals(type)) {
            cName = "java.lang.Integer";
        }
        else if ("long".equals(type)) {
            cName = "java.lang.Long";
        }
        else if ("char".equals(type)) {
            cName = "java.lang.Character";
        }
        else if ("boolean".equals(type)) {
            cName = "java.lang.Boolean";
        }
        else if ("byte".equals(type)) {
            cName = "java.lang.Byte";
        }
        else if ("float".equals(type)) {
            cName = "java.lang.Float";
        }
        else if ("double".equals(type)) {
            cName = "java.lang.Double";
        }

         il.add(f.newClass(cName));
         il.add(f.dup());
         Instruction ins = f.invoke(Modifier.PUBLIC, cName, "<init>", s);
         return ins;
    }
View Full Code Here

    }


    private void handleReturnValue(InstructionList il, Invocation ins) {
        // Convert return value if needed.
        InstructionFactory factory = il.getInstructionFactory();
        String rType = ins.getReturnType();

        if ("int".equals(rType)) {
            try {
                JiapiClass jc = new Loader().loadClass("java.lang.Integer");
                JiapiMethod jm =
                    jc.getDeclaredMethod("intValue", new String[0]);

                il.add(factory.cast("java.lang.Integer"));
                il.add(factory.invoke(jm));
            }
            catch(Exception e) {
                e.printStackTrace();
            }
        }
        else if ("long".equals(rType)) {
            try {
                JiapiClass jc = new Loader().loadClass("java.lang.Long");
                JiapiMethod jm =
                    jc.getDeclaredMethod("longValue", new String[0]);

                il.add(factory.cast("java.lang.Long"));
                il.add(factory.invoke(jm));
            }
            catch(Exception e) {
                e.printStackTrace();
            }
        }
        else if ("char".equals(rType)) {
            try {
                JiapiClass jc = new Loader().loadClass("java.lang.Character");
                JiapiMethod jm =
                    jc.getDeclaredMethod("charValue", new String[0]);

                il.add(factory.cast("java.lang.Character"));
                il.add(factory.invoke(jm));
            }
            catch(Exception e) {
                e.printStackTrace();
            }
        }
        else if ("boolean".equals(rType)) {
            try {
                JiapiClass jc = new Loader().loadClass("java.lang.Boolean");
                JiapiMethod jm =
                    jc.getDeclaredMethod("booleanValue", new String[0]);

                il.add(factory.cast("java.lang.Boolean"));
                il.add(factory.invoke(jm));
            }
            catch(Exception e) {
                e.printStackTrace();
            }
        }
        else if ("byte".equals(rType)) {
            try {
                JiapiClass jc = new Loader().loadClass("java.lang.Byte");
                JiapiMethod jm =
                    jc.getDeclaredMethod("byteValue", new String[0]);

                il.add(factory.cast("java.lang.Byte"));
                il.add(factory.invoke(jm));
            }
            catch(Exception e) {
                e.printStackTrace();
            }
        }
        else if ("float".equals(rType)) {
            try {
                JiapiClass jc = new Loader().loadClass("java.lang.Float");
                JiapiMethod jm =
                    jc.getDeclaredMethod("floatValue", new String[0]);

                il.add(factory.cast("java.lang.Float"));
                il.add(factory.invoke(jm));
            }
            catch(Exception e) {
                e.printStackTrace();
            }
        }
        else if ("double".equals(rType)) {
            try {
                JiapiClass jc = new Loader().loadClass("java.lang.Double");
                JiapiMethod jm =
                    jc.getDeclaredMethod("doubleValue", new String[0]);

                il.add(factory.cast("java.lang.Double"));
                il.add(factory.invoke(jm));
            }
            catch(Exception e) {
                e.printStackTrace();
            }
        }
        else if ("void".equals(rType)){
            // Pop out the return value(probably null) of
            // the invocation handler if it was a 'void' method
            il.add(new Instruction(new byte[]{Opcodes.POP}));
        }
        else { // Cast to correct Object
            il.add(factory.cast(ins.getReturnType()));
        }
    }
View Full Code Here

        }
    }


    private void addClassForNameInstructions(String name, InstructionList il) {
        InstructionFactory f = il.getInstructionFactory();

        InstructionList nl = il.createEmptyList();
       
        // NOTE: We do not create exception handlers for
        //       Class.forName(...) invocation.
        //       However, we use this to get Class of the running object,
        //       so its Class is allways found.
        try {
            nl.add(f.pushConstant(name));
            nl.add(f.invoke(Modifier.STATIC, "java.lang.Class",
                            "forName", new Signature("java.lang.Class",
                                                     new String[] {"java.lang.String"})));
        }
        catch(Exception e) {
            e.printStackTrace();
            il.add(f.pushNull());
        }

        il.add(nl);
    }
View Full Code Here

    public void instrument(JiapiMethod jm) {
        JiapiClass clazz = jm.getDeclaringClass();
        JiapiField interceptor = getEventProducerField();
        InstructionList il = jm.getInstructionList();
        InstructionFactory factory = il.getInstructionFactory();

        HotSpotLocator hsl =
            new HotSpotLocator(il, new byte[]{Opcodes.GETSTATIC,
                                              Opcodes.GETFIELD});
        HotSpot[] hotSpots = hsl.getHotSpots();

        for (int i = 0; i < hotSpots.length; i++) {
            FieldAccess fa = (FieldAccess)hotSpots[i].getHotSpotInstruction();
            short opCode = fa.getOpcode();

            if (!match(fa.getClassName() + "." + fa.getFieldName())) {
                continue;
            }

            InstructionList hsList = hotSpots[i].getInstructionList();
            InstructionList nList = il.createEmptyList();

            boolean primitive = SignatureUtil.isPrimitive(fa.getTypeName());


            if (opCode == Opcodes.GETSTATIC ||
                opCode == Opcodes.GETFIELD) {
                nList.add(factory.getField(interceptor)); // Interceptor

                // NOTE: We could store Class into variable,
                //       and use getField() instead of Class.forName() call
                // Class or objref; 1st parameter to interceptor
                if (opCode == Opcodes.GETSTATIC) {
                    short lvIdx =
                        addClassForNameInstructions(fa.getClassName(), jm);
                    nList.add(factory.aload(lvIdx));
//                     addClassForNameInstructions(fa.getClassName(), nList);
//                     nList.add(factory.pushNull());
                }
                else {
                    //addClassForNameInstructions(fa.getClassName(), nList);
                    nList.add(hsList.get(0)); // objref
                }

                // Name of the field; 2nd parameter to interceptor
                nList.add(factory.pushConstant(fa.getFieldName()));

                // 3rd parameter; field value
                Instruction pIns = null;
                if (primitive) {
                    // Provide wrapper for primitive types
                    pIns = handlePrimitiveType(fa.getTypeName(), nList);
                }
                //nList.add(fa);
                //nList.add(hsList);
                nList.add(hotSpots[i].getInstructionList());

                if (pIns != null) {
                    nList.add(pIns);
                }

                // call Interceptor
                nList.add(factory.invoke(getMethod));

                handleReturnValue(nList, fa.getTypeName());
                //nList.add(factory.cast(fa.getTypeName()));

                hotSpots[i].getInstructionList()/* hsList*/.replace(nList);
 
View Full Code Here

     *
     * @return index of the local variable, where Class is stored
     */
    private short addClassForNameInstructions(String name, JiapiMethod jm) {
        InstructionList il = jm.getInstructionList();
        InstructionFactory f = il.getInstructionFactory();

        InstructionList nl = il.createEmptyList();
        short maxLocals = (short)jm.getMaxLocals();
       
        // NOTE: We do not create exception handlers for
        //       Class.forName(...) invocation.
        //       However, we use this to get Class of the running object,
        //       so its Class is allways found.
        try {
            nl.add(f.pushConstant(name));
            nl.add(f.invoke(Modifier.STATIC, "java.lang.Class",
                            "forName", new Signature("java.lang.Class",
                                                     new String[] {"java.lang.String"})));
            nl.add(f.astore(maxLocals));
        }
        catch(Exception e) {
            e.printStackTrace();
            il.add(f.pushNull());
        }

//         il.add(nl);
        il.insert(0, nl);

View Full Code Here



    private void handleReturnValue(InstructionList il, String rType) {
        // Convert return value if needed.
        InstructionFactory factory = il.getInstructionFactory();

        if ("int".equals(rType)) {
            try {
                JiapiClass jc = new Loader().loadClass("java.lang.Integer");
                JiapiMethod jm =
                    jc.getDeclaredMethod("intValue", new String[0]);

                il.add(factory.cast("java.lang.Integer"));
                il.add(factory.invoke(jm));
            }
            catch(Exception e) {
                e.printStackTrace();
            }
        }
        else if ("long".equals(rType)) {
            try {
                JiapiClass jc = new Loader().loadClass("java.lang.Long");
                JiapiMethod jm =
                    jc.getDeclaredMethod("longValue", new String[0]);

                il.add(factory.cast("java.lang.Long"));
                il.add(factory.invoke(jm));
            }
            catch(Exception e) {
                e.printStackTrace();
            }
        }
        else if ("char".equals(rType)) {
            try {
                JiapiClass jc = new Loader().loadClass("java.lang.Character");
                JiapiMethod jm =
                    jc.getDeclaredMethod("charValue", new String[0]);

                il.add(factory.cast("java.lang.Character"));
                il.add(factory.invoke(jm));
            }
            catch(Exception e) {
                e.printStackTrace();
            }
        }
        else if ("boolean".equals(rType)) {
            try {
                JiapiClass jc = new Loader().loadClass("java.lang.Boolean");
                JiapiMethod jm =
                    jc.getDeclaredMethod("booleanValue", new String[0]);

                il.add(factory.cast("java.lang.Boolean"));
                il.add(factory.invoke(jm));
            }
            catch(Exception e) {
                e.printStackTrace();
            }
        }
        else if ("byte".equals(rType)) {
            try {
                JiapiClass jc = new Loader().loadClass("java.lang.Byte");
                JiapiMethod jm =
                    jc.getDeclaredMethod("byteValue", new String[0]);

                il.add(factory.cast("java.lang.Byte"));
                il.add(factory.invoke(jm));
            }
            catch(Exception e) {
                e.printStackTrace();
            }
        }
        else if ("float".equals(rType)) {
            try {
                JiapiClass jc = new Loader().loadClass("java.lang.Float");
                JiapiMethod jm =
                    jc.getDeclaredMethod("floatValue", new String[0]);

                il.add(factory.cast("java.lang.Float"));
                il.add(factory.invoke(jm));
            }
            catch(Exception e) {
                e.printStackTrace();
            }
        }
        else if ("double".equals(rType)) {
            try {
                JiapiClass jc = new Loader().loadClass("java.lang.Double");
                JiapiMethod jm =
                    jc.getDeclaredMethod("doubleValue", new String[0]);

                il.add(factory.cast("java.lang.Double"));
                il.add(factory.invoke(jm));
            }
            catch(Exception e) {
                e.printStackTrace();
            }
        }
        else if ("void".equals(rType)){
            // Pop out the return value(probably null) of
            // the invocation handler if it was a 'void' method
            il.add(new Instruction(new byte[]{Opcodes.POP}));
        }
        else { // Cast to correct Object
            il.add(factory.cast(rType));
        }
    }
View Full Code Here

    /**
     * @return an Invocation to constructor of primitive wrapper
     */
    private Instruction handlePrimitiveType(String type, InstructionList il) {
        InstructionFactory f = il.getInstructionFactory();
        String cName = null;
        Signature s = new Signature("void", new String[]{ type });

        if ("int".equals(type)) {
            cName = "java.lang.Integer";
        }
        else if ("long".equals(type)) {
            cName = "java.lang.Long";
        }
        else if ("char".equals(type)) {
            cName = "java.lang.Character";
        }
        else if ("boolean".equals(type)) {
            cName = "java.lang.Boolean";
        }
        else if ("byte".equals(type)) {
            cName = "java.lang.Byte";
        }
        else if ("float".equals(type)) {
            cName = "java.lang.Float";
        }
        else if ("double".equals(type)) {
            cName = "java.lang.Double";
        }

         il.add(f.newClass(cName));
         il.add(f.dup());
         Instruction ins = f.invoke(Modifier.PUBLIC, cName, "<init>", s);
         return ins;
    }
View Full Code Here

    }

    public void instrument(JiapiMethod jm) {
        JiapiField interceptor = getEventProducerField();
        InstructionList il = jm.getInstructionList();
        InstructionFactory factory = il.getInstructionFactory();

        HotSpotLocator hsl =
            new HotSpotLocator(il,
                               new byte[]{Opcodes.GETSTATIC/*,Opcodes.PUTSTATIC*/});
        HotSpot[] hotSpots = hsl.getHotSpots();

        for (int i = 0; i < hotSpots.length; i++) {
            FieldAccess fa = (FieldAccess)hotSpots[i].getHotSpotInstruction();
           
            if (fa.getName().startsWith("__jiapi")) {
                continue;
            }

            if (!match(fa.getClassName() + "." + fa.getFieldName())) {
                continue;
            }

            // BUG: We cannot use reflection in this interceptor, since it
            // is allowed only for public fields.
            if (!isPublicField(fa)) {
                continue;
            }

            InstructionList hsList = hotSpots[i].getInstructionList();
            InstructionList nList = il.createEmptyList();

            nList.add(factory.getField(interceptor)); // Interceptor

            // Class or objref; 1st parameter to interceptor
            if ((fa.getOpcode() == Opcodes.GETSTATIC) ||
                (fa.getOpcode() == Opcodes.PUTSTATIC)) {
                addClassForNameInstructions(fa.getClassName(), nList);
            }
            else {
                nList.add(il.get(0)); // objref
            }

            // Name of the field; 2nd parameter to interceptor
            nList.add(factory.pushConstant(fa.getClassName() + "." +
                                           fa.getFieldName()));

            // call Interceptor
            if ((fa.getOpcode() == Opcodes.GETSTATIC) ||
                (fa.getOpcode() == Opcodes.GETFIELD)) {
                nList.add(factory.invoke(getMethod));
            }
            else {
                nList.add(il.get(1)); // value ???
                nList.add(factory.invoke(setMethod));
            }
           
            handleReturnValue(nList, fa.getTypeName());

            //nList.add(factory.cast(fa.getTypeName()));
View Full Code Here

TOP

Related Classes of alt.jiapi.reflect.InstructionFactory

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.