JIMS: plug extraction 46/11946/1
Calixte DENIZET [Fri, 5 Jul 2013 09:15:41 +0000 (11:15 +0200)]
Change-Id: Ibcab55341aaa2a0f74360e416fcac97c20dc85f8

scilab/modules/external_objects_java/src/cpp/ScilabJavaEnvironment.cpp
scilab/modules/external_objects_java/src/java/org/scilab/modules/external_objects_java/ScilabJavaArray.java
scilab/modules/external_objects_java/src/java/org/scilab/modules/external_objects_java/ScilabJavaObject.java
scilab/modules/external_objects_java/src/jni/ScilabJavaObject.cpp
scilab/modules/external_objects_java/src/jni/ScilabJavaObject.hxx
scilab/modules/external_objects_java/src/jni/ScilabObjects.giws.xml

index 921ae8a..aba4a48 100644 (file)
@@ -181,41 +181,8 @@ int ScilabJavaEnvironment::extract(int id, int * args, int argsSize)
         writeLog("extract", "Extraction on object %d with arguments: %s.", id, os.str().c_str());
     }
 
-    /*    PyObject * obj = scope.getObject(id);
-        if (!obj)
-        {
-            throw ScilabJavaException(__LINE__, __FILE__, gettext("Invalid object with id %d"), id);
-        }
-
-        if (PyDict_Check(obj))
-        {
-            if (argsSize != 1)
-            {
-                throw ScilabJavaException(__LINE__, __FILE__, gettext("Cannot extract more than one element from a dictionary"));
-            }
-
-            PyObject * key = scope.getObject(*args);
-            if (!obj)
-            {
-                throw ScilabJavaException(__LINE__, __FILE__, gettext("Invalid key object"));
-            }
-
-            if (!PyDict_Contains(obj, key))
-            {
-                throw ScilabJavaException(__LINE__, __FILE__, gettext("Invalid key"));
-            }
-
-            PyObject * value = PyDict_GetItem(obj, key);
-       Py_INCREF(value);
-
-            int ret = scope.addObject(value);
-            writeLog("extract", "returned id: %d.", ret);
-
-            return ret;
-            }
-    */
-
-    throw ScilabJavaException(__LINE__, __FILE__, gettext("Cannot extract from Java object"));
+    JavaVM * vm = getScilabJavaVM();
+    return ScilabJavaObject::extract(vm, id, args, argsSize);
 }
 
 void ScilabJavaEnvironment::insert(int id, int * args, int argsSize)
@@ -622,45 +589,9 @@ int ScilabJavaEnvironment::getfieldtype(int id, const char * fieldName)
 {
     writeLog("getfieldtype", "Get the type of the field %s on object with id %d.", fieldName, id);
 
-    if ((!helper.getShowPrivate() && *fieldName == '_') || *fieldName == '\0')
-    {
-        writeLog("getfieldtype", "Return NONE.");
-        return -1;
-    }
-    /*
-        PyObject * obj = scope.getObject(id);
-        if (!obj)
-        {
-            throw ScilabJavaException(__LINE__, __FILE__, gettext("Invalid object with id %d"), id);
-        }
-
-        if (!PyObject_HasAttrString(obj, fieldName))
-        {
-            writeLog("getfieldtype", "Return NONE.");
-            return -1;
-        }
-
-        PyObject * field = PyObject_GetAttrString(obj, fieldName);
-        if (!field)
-        {
-            writeLog("getfieldtype", "Return NONE.");
-            return -1;
-        }
+    JavaVM * vm = getScilabJavaVM();
 
-        if (PyCallable_Check(field))
-        {
-            Py_DECREF(field);
-            writeLog("getfieldtype", "Return METHOD.");
-            return 0;
-        }
-        else
-        {
-            Py_DECREF(field);
-            writeLog("getfieldtype", "Return FIELD.");
-            return 1;
-        }
-    */
-    return 0;
+    return ScilabJavaObject::getFieldType(vm, id, fieldName);
 }
 
 int ScilabJavaEnvironment::getarrayelement(int id, int * index, int length)
index 43a4f15..ea06087 100644 (file)
@@ -15,6 +15,7 @@ package org.scilab.modules.external_objects_java;
 import java.lang.reflect.Array;
 import java.lang.reflect.Method;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.logging.Level;
 
@@ -102,11 +103,18 @@ public class ScilabJavaArray {
         Object obj = array;
         for (int i = 0; i < index.length; i++) {
             if (obj != null && obj.getClass().isArray()) {
-                if (index[i] < Array.getLength(obj)) {
+                if (index[i] >= 0 && index[i] < Array.getLength(obj)) {
                     obj = Array.get(obj, index[i]);
                 } else {
                     throw new ScilabJavaException("Problem in retrieving " + i + "-th element: " + index[i] + ">" + (Array.getLength(obj) - 1));
                 }
+            } else if (obj instanceof List) {
+                List list = (List) obj;
+                if (index[i] >= 0 && index[i] < list.size()) {
+                    obj = list.get(index[i]);
+                } else {
+                    throw new ScilabJavaException("Problem in retrieving " + i + "-th element: " + index[i] + ">" + (list.size() - 1));
+                }
             } else {
                 throw new ScilabJavaException("Problem in retrieving " + i + "-th element: it is not an array");
             }
@@ -126,18 +134,25 @@ public class ScilabJavaArray {
         int i = 0;
         for (; i < index.length - 1; i++) {
             if (obj != null && obj.getClass().isArray()) {
-                if (index[i] < Array.getLength(obj)) {
+                if (index[i] >= 0 && index[i] < Array.getLength(obj)) {
                     obj = Array.get(obj, index[i]);
                 } else {
                     throw new ScilabJavaException("Problem in retrieving " + i + "-th element: " + index[i] + ">" + (Array.getLength(obj) - 1));
                 }
+            } else if (obj instanceof List) {
+                List list = (List) obj;
+                if (index[i] >= 0 && index[i] < list.size()) {
+                    obj = list.get(index[i]);
+                } else {
+                    throw new ScilabJavaException("Problem in retrieving " + i + "-th element: " + index[i] + ">" + (list.size() - 1));
+                }
             } else {
                 throw new ScilabJavaException("Problem in retrieving " + i + "-th element: it is not an array");
             }
         }
 
         if (obj != null && obj.getClass().isArray()) {
-            if (index[i] < Array.getLength(obj)) {
+            if (index[i] >= 0 && index[i] < Array.getLength(obj)) {
                 try {
                     Array.set(obj, index[i], x);
                 } catch (IllegalArgumentException e) {
@@ -146,6 +161,15 @@ public class ScilabJavaArray {
             } else {
                 throw new ScilabJavaException("Problem in setting " + index[i] + "-th element: " + index[i] + ">" + (Array.getLength(obj) - 1));
             }
+        } else if (obj instanceof List) {
+            List list = (List) obj;
+            if (index[i] >= 0 && index[i] < list.size()) {
+                list.set(index[i], x);
+            } else if (index[i] == list.size()) {
+                list.add(x);
+            } else {
+                throw new ScilabJavaException("Problem in retrieving " + i + "-th element: " + index[i] + ">" + (list.size() - 1));
+            }
         } else {
             throw new ScilabJavaException("Problem in retrieving " + i + "-th element: it is not an array");
         }
index 5f72fc2..e40a66a 100644 (file)
@@ -24,6 +24,7 @@ import java.nio.LongBuffer;
 import java.nio.ShortBuffer;
 import java.nio.ByteOrder;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import java.io.IOException;
@@ -539,6 +540,79 @@ public class ScilabJavaObject {
 
     /**
      * @param id the Java Object id
+     * @param args an array containing the id of the arguments
+     * @return the id of the invocation result
+     */
+    public static int extract(final int id, final int[] args) throws ScilabJavaException {
+        if (id > 0) {
+            if (debug) {
+                StringBuffer buf = new StringBuffer();
+                buf.append("(");
+                if (args.length > 0) {
+                    int i = 0;
+                    for (; i < args.length - 1; i++) {
+                        buf.append(Integer.toString(args[i]));
+                        buf.append(",");
+                    }
+                    buf.append(Integer.toString(args[i]));
+                }
+                buf.append(")");
+                logger.log(Level.INFO, "Extract in object id=" + id + " with arguments id=" + buf.toString());
+            }
+
+            for (int i = 0; i < args.length; i++) {
+                if (args[i] < 0 || arraySJO[args[i]] == null) {
+                    throw new ScilabJavaException("Invalid Java object at position " + i);
+                }
+            }
+
+            if (arraySJO[id] != null) {
+                Object o = arraySJO[id].object;
+                for (int i = 0; i < args.length; i++) {
+                    Object a = args[i] == 0 ? null : arraySJO[args[i]].object;
+                    if (o instanceof Map) {
+                        o = ((Map) o).get(a);
+                    } else if (o instanceof List) {
+                        List l = (List) o;
+                        int pos = -1;
+                        if (a instanceof Double) {
+                            pos = ((Double) a).intValue();
+                        } else if (a instanceof Integer) {
+                            pos = ((Integer) a).intValue();
+                        } else {
+                            pos = l.indexOf(a);
+                        }
+                        if (pos >= 0 || pos < l.size()) {
+                            o = l.get(pos);
+                        } else {
+                            throw new ScilabJavaException("Cannot get object at position " + (i + 1));
+                        }
+                    } else if (o.getClass().isArray()) {
+                        int pos = -1;
+                        if (a instanceof Double) {
+                            pos = ((Double) a).intValue();
+                        } else if (a instanceof Integer) {
+                            pos = ((Integer) a).intValue();
+                        }
+
+                        o = ScilabJavaArray.get(o, new int[] {pos});
+                    }
+                }
+
+                if (o == null) {
+                    return 0;
+                }
+
+                return new ScilabJavaObject(o).id;
+            }
+            throw new ScilabJavaException("Invalid Java object");
+        } else {
+            throw new ScilabJavaException("null is not an object");
+        }
+    }
+
+    /**
+     * @param id the Java Object id
      * @param className the target class name
      * @return the id of the cast result
      */
index 637702a..1cb85f4 100644 (file)
@@ -115,6 +115,7 @@ ScilabJavaObject::ScilabJavaObject(JavaVM * jvm_)
 
     /* Methods ID set to NULL */
     jintinvokejintintjstringjava_lang_StringjintArray_intintID = NULL;
+    jintextractjintintjintArray_intintID = NULL;
     voidinitScilabJavaObjectID = NULL;
     voidgarbageCollectID = NULL;
     jstringgetRepresentationjintintID = NULL;
@@ -221,6 +222,7 @@ ScilabJavaObject::ScilabJavaObject(JavaVM * jvm_, jobject JObj)
     }
     /* Methods ID set to NULL */
     jintinvokejintintjstringjava_lang_StringjintArray_intintID = NULL;
+    jintextractjintintjintArray_intintID = NULL;
     voidinitScilabJavaObjectID = NULL;
     voidgarbageCollectID = NULL;
     jstringgetRepresentationjintintID = NULL;
@@ -371,6 +373,45 @@ int ScilabJavaObject::invoke (JavaVM * jvm_, int id, char const* methodName, int
 
 }
 
+int ScilabJavaObject::extract (JavaVM * jvm_, int id, int const* args, int argsSize)
+{
+
+    JNIEnv * curEnv = NULL;
+    jvm_->AttachCurrentThread(reinterpret_cast<void **>(&curEnv), NULL);
+    jclass cls = curEnv->FindClass( className().c_str() );
+    if ( cls == NULL)
+    {
+        throw GiwsException::JniCallMethodException(curEnv);
+    }
+
+    jmethodID jintextractjintintjintArray_intintID = curEnv->GetStaticMethodID(cls, "extract", "(I[I)I" ) ;
+    if (jintextractjintintjintArray_intintID == NULL)
+    {
+        throw GiwsException::JniMethodNotFoundException(curEnv, "extract");
+    }
+
+    jintArray args_ = curEnv->NewIntArray( argsSize ) ;
+
+    if (args_ == NULL)
+    {
+        // check that allocation succeed
+        throw GiwsException::JniBadAllocException(curEnv);
+    }
+
+    curEnv->SetIntArrayRegion( args_, 0, argsSize, (jint*)(args) ) ;
+
+
+    jint res =  static_cast<jint>( curEnv->CallStaticIntMethod(cls, jintextractjintintjintArray_intintID , id, args_));
+    curEnv->DeleteLocalRef(args_);
+    curEnv->DeleteLocalRef(cls);
+    if (curEnv->ExceptionCheck())
+    {
+        throw GiwsException::JniCallMethodException(curEnv);
+    }
+    return res;
+
+}
+
 void ScilabJavaObject::initScilabJavaObject (JavaVM * jvm_)
 {
 
index 79f3825..20c6f46 100644 (file)
@@ -79,6 +79,7 @@ private:
 
 protected:
     jmethodID jintinvokejintintjstringjava_lang_StringjintArray_intintID; // cache method id
+    jmethodID jintextractjintintjintArray_intintID; // cache method id
     jmethodID voidinitScilabJavaObjectID; // cache method id
     jmethodID voidgarbageCollectID; // cache method id
     jmethodID jstringgetRepresentationjintintID; // cache method id
@@ -221,6 +222,8 @@ public:
     // Methods
     static int invoke(JavaVM * jvm_, int id, char const* methodName, int const* args, int argsSize);
 
+    static int extract(JavaVM * jvm_, int id, int const* args, int argsSize);
+
     static void initScilabJavaObject(JavaVM * jvm_);
 
     static void garbageCollect(JavaVM * jvm_);
index fce4770..b176f6a 100644 (file)
             <param type="int[]" name="args" />
         </method>
         
+        <method name="extract" returnType="int" modifier="static">
+            <param type="int" name="id" />
+            <param type="int[]" name="args" />
+        </method>
+        
         <method name="initScilabJavaObject" returnType="void" modifier="static" />
         
         <method name="garbageCollect" returnType="void" modifier="static" />