Fixed Table's use of deprecated isAccessible, finishing parseInto.

Fixed the Table's use of the deprected isAccessible, finishing the parseInto method in the process in order to test taht the new implementation is "correct". Note that there is not a published API for this method on processing.org so it is unclear if the interface's intended behavior was maintained. See https://processing.github.io/processing-javadocs/core/processing/data/Table.html#parseInto-java.lang.Object-java.lang.String-.
This commit is contained in:
Sam Pottinger
2019-11-25 14:47:12 -08:00
parent 9361bfc2da
commit 2dd098eb4b
2 changed files with 61 additions and 16 deletions
+22 -16
View File
@@ -1038,7 +1038,7 @@ public class Table {
// Class sketchClass = sketch.getClass();
Class<?> sketchClass = enclosingObject.getClass();
targetField = sketchClass.getDeclaredField(fieldName);
// PApplet.println("found " + targetField);
// PApplet.println("found " + targetField);
Class<?> targetArray = targetField.getType();
if (!targetArray.isArray()) {
// fieldName is not an array
@@ -1053,20 +1053,20 @@ public class Table {
}
// Object enclosingObject = sketch;
// PApplet.println("enclosing obj is " + enclosingObject);
// PApplet.println("enclosing obj is " + enclosingObject);
Class<?> enclosingClass = target.getEnclosingClass();
Constructor<?> con = null;
try {
if (enclosingClass == null) {
con = target.getDeclaredConstructor(); //new Class[] { });
// PApplet.println("no enclosing class");
// PApplet.println("no enclosing class");
} else {
con = target.getDeclaredConstructor(new Class[] { enclosingClass });
// PApplet.println("enclosed by " + enclosingClass.getName());
// PApplet.println("enclosed by " + enclosingClass.getName());
}
if (!con.isAccessible()) {
// System.out.println("setting constructor to public");
if (!con.canAccess(null)) {
// System.out.println("setting constructor to public");
con.setAccessible(true);
}
} catch (SecurityException e) {
@@ -1080,14 +1080,9 @@ public class Table {
for (Field field : fields) {
String name = field.getName();
if (getColumnIndex(name, false) != -1) {
// System.out.println("found field " + name);
if (!field.isAccessible()) {
// PApplet.println(" changing field access");
field.setAccessible(true);
}
inuse.add(field);
} else {
// System.out.println("skipping field " + name);
// System.out.println("skipping field " + name);
}
}
@@ -1099,12 +1094,23 @@ public class Table {
//item = target.newInstance();
item = con.newInstance();
} else {
item = con.newInstance(new Object[] { enclosingObject });
item = con.newInstance(enclosingObject);
}
// Only needed once
if (index == 0) {
for (Field field : inuse) {
if (!field.canAccess(item)) {
// PApplet.println(" changing field access");
field.setAccessible(true);
}
}
}
//Object item = defaultCons.newInstance(new Object[] { });
for (Field field : inuse) {
String name = field.getName();
//PApplet.println("gonna set field " + name);
// PApplet.println("gonna set field " + name);
if (field.getType() == String.class) {
field.set(item, row.getString(name));
@@ -1151,8 +1157,8 @@ public class Table {
// list.add(item);
Array.set(outgoing, index++, item);
}
if (!targetField.isAccessible()) {
// PApplet.println("setting target field to public");
if (!targetField.canAccess(enclosingObject)) {
// PApplet.println("setting target field to public");
targetField.setAccessible(true);
}
// Set the array in the sketch
+39
View File
@@ -0,0 +1,39 @@
package processing.data;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
public class TableTest {
class Person {
public String name;
public int age;
public Person() {
name = "";
age = -1;
}
}
Person[] people;
@Test
public void parseInto() {
Table table = new Table();
table.addColumn("name");
table.addColumn("age");
TableRow row = table.addRow();
row.setString("name", "Person1");
row.setInt("age", 30);
table.parseInto(this, "people");
Assert.assertEquals(people[0].name, "Person1");
Assert.assertEquals(people[0].age, 30);
}
}