Skip to content

Commit

Permalink
Implement new JNIField accessor model: allow support for separate get…
Browse files Browse the repository at this point in the history
…ter/setter methods for individual fields.
  • Loading branch information
calin-iorgulescu committed Oct 17, 2018
1 parent 5f52fee commit 8f464d0
Show file tree
Hide file tree
Showing 8 changed files with 150 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

import org.fusesource.hawtjni.generator.model.JNIClass;
import org.fusesource.hawtjni.generator.model.JNIField;
import org.fusesource.hawtjni.generator.model.JNIFieldAccessor;
import org.fusesource.hawtjni.generator.model.JNIMethod;
import org.fusesource.hawtjni.generator.model.JNIParameter;
import org.fusesource.hawtjni.generator.model.JNIType;
Expand Down Expand Up @@ -189,9 +190,7 @@ private void generateConstantsInitializer(JNIMethod method) {
boolean allowConversion = !type.equals(type64);

String simpleName = type.getSimpleName();
String accessor = field.getAccessor();
if (accessor == null || accessor.length() == 0)
accessor = field.getName();
JNIFieldAccessor accessor = field.getAccessor();

String fieldId = "(*env)->GetStaticFieldID(env, that, \""+field.getName()+"\", \""+type.getTypeSignature(allowConversion)+"\")";
if (isCPP) {
Expand All @@ -208,7 +207,7 @@ private void generateConstantsInitializer(JNIMethod method) {
if( field.isPointer() ) {
output("(intptr_t)");
}
output(accessor);
output(accessor.getter());
output(");");

} else if (type.isArray()) {
Expand Down Expand Up @@ -238,7 +237,7 @@ private void generateConstantsInitializer(JNIMethod method) {
} else {
output("ArrayRegion(env, lpObject1, 0, sizeof(");
}
output(accessor);
output(accessor.getter());
output(")");
if (!componentType.isType("byte")) {
output(" / sizeof(");
Expand All @@ -248,7 +247,7 @@ private void generateConstantsInitializer(JNIMethod method) {
output(", (");
output(type.getTypeSignature4(allowConversion, false));
output(")");
output(accessor);
output(accessor.getter());
outputln(");");
output("\t}");
} else {
Expand All @@ -268,7 +267,7 @@ private void generateConstantsInitializer(JNIMethod method) {
output("\tif (lpObject1 != NULL) set");
output(simpleName);
output("Fields(env, lpObject1, &lpStruct->");
output(accessor);
output(accessor.getter());
outputln(");");
output("\t}");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -286,13 +286,20 @@ void generateGetFields(JNIClass clazz) {
}
JNIType type = field.getType(), type64 = field.getType64();
String simpleName = type.getSimpleName();
String accessor = field.getAccessor();
if (accessor == null || accessor.length() == 0)
accessor = field.getName();
JNIFieldAccessor accessor = field.getAccessor();
output("\t");
if (type.isPrimitive()) {
output("\tlpStruct->");
output(accessor);
output(" = ");
if (!accessor.isNonMemberSetter())
output("lpStruct->");
if (accessor.isMethodSetter()) {
String setterStart = accessor.setter().split("\\(")[0];
output(setterStart + "(");
if (accessor.isNonMemberSetter())
output("lpStruct, ");
} else {
output(accessor.setter());
output(" = ");
}
output(field.getCast());
if( field.isPointer() ) {
output("(intptr_t)");
Expand All @@ -311,7 +318,10 @@ void generateGetFields(JNIClass clazz) {
output(field.getDeclaringClass().getSimpleName());
output("Fc.");
output(field.getName());
output(");");
output(")");
if (accessor.isMethodSetter())
output(")");
output(";");
} else if (type.isArray()) {
JNIType componentType = type.getComponentType(), componentType64 = type64.getComponentType();
if (componentType.isPrimitive()) {
Expand All @@ -336,11 +346,13 @@ void generateGetFields(JNIClass clazz) {
}
output(componentType.getTypeSignature1(!componentType.equals(componentType64)));
if (isCPP) {
output("ArrayRegion(lpObject1, 0, sizeof(lpStruct->");
output("ArrayRegion(lpObject1, 0, sizeof(");
} else {
output("ArrayRegion(env, lpObject1, 0, sizeof(lpStruct->");
output("ArrayRegion(env, lpObject1, 0, sizeof(");
}
output(accessor);
if (!accessor.isNonMemberGetter())
output("lpStruct->");
output(accessor.getter());
output(")");
if (!componentType.isType("byte")) {
output(" / sizeof(");
Expand All @@ -349,8 +361,10 @@ void generateGetFields(JNIClass clazz) {
}
output(", (");
output(type.getTypeSignature4(!type.equals(type64), false));
output(")lpStruct->");
output(accessor);
output(")");
if (!accessor.isNonMemberGetter())
output("lpStruct->");
output(accessor.getter());
outputln(");");
output("\t}");
} else {
Expand All @@ -370,7 +384,7 @@ void generateGetFields(JNIClass clazz) {
output("\tif (lpObject1 != NULL) get");
output(simpleName);
output("Fields(env, lpObject1, &lpStruct->");
output(accessor);
output(accessor.getter());
outputln(");");
output("\t}");
}
Expand Down Expand Up @@ -441,9 +455,7 @@ void generateSetFields(JNIClass clazz) {
boolean allowConversion = !type.equals(type64);

String simpleName = type.getSimpleName();
String accessor = field.getAccessor();
if (accessor == null || accessor.length() == 0)
accessor = field.getName();
JNIFieldAccessor accessor = field.getAccessor();
if (type.isPrimitive()) {
if (isCPP) {
output("\tenv->Set");
Expand All @@ -464,7 +476,9 @@ void generateSetFields(JNIClass clazz) {
if( field.isPointer() ) {
output("(intptr_t)");
}
output("lpStruct->"+accessor);
if (!accessor.isNonMemberGetter())
output("lpStruct->");
output(accessor.getter());
output(");");
} else if (type.isArray()) {
JNIType componentType = type.getComponentType(), componentType64 = type64.getComponentType();
Expand All @@ -490,11 +504,13 @@ void generateSetFields(JNIClass clazz) {
}
output(componentType.getTypeSignature1(!componentType.equals(componentType64)));
if (isCPP) {
output("ArrayRegion(lpObject1, 0, sizeof(lpStruct->");
output("ArrayRegion(lpObject1, 0, sizeof(");
} else {
output("ArrayRegion(env, lpObject1, 0, sizeof(lpStruct->");
output("ArrayRegion(env, lpObject1, 0, sizeof(");
}
output(accessor);
if (!accessor.isNonMemberGetter())
output("lpStruct->");
output(accessor.getter());
output(")");
if (!componentType.isType("byte")) {
output(" / sizeof(");
Expand All @@ -503,8 +519,10 @@ void generateSetFields(JNIClass clazz) {
}
output(", (");
output(type.getTypeSignature4(allowConversion, false));
output(")lpStruct->");
output(accessor);
output(")");
if (!accessor.isNonMemberGetter())
output("lpStruct->");
output(accessor.getter());
outputln(");");
output("\t}");
} else {
Expand All @@ -524,7 +542,7 @@ void generateSetFields(JNIClass clazz) {
output("\tif (lpObject1 != NULL) set");
output(simpleName);
output("Fields(env, lpObject1, &lpStruct->");
output(accessor);
output(accessor.getter());
outputln(");");
output("\t}");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public interface JNIField {
public JNIType getType64();

public JNIClass getDeclaringClass();
public String getAccessor();
public JNIFieldAccessor getAccessor();
public String getCast();
public String getConditional();
public boolean ignore();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.fusesource.hawtjni.generator.model;

/**
* @author <a href="mailto:calin.iorgulescu@gmail.com">Calin Iorgulescu</a>
*/
public interface JNIFieldAccessor {
public String getter();

public String setter();

public boolean isNonMemberGetter();

public boolean isNonMemberSetter();

public boolean isMethodGetter();

public boolean isMethodSetter();

}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import java.util.Arrays;
import java.util.HashSet;

import org.apache.commons.lang.StringUtils;
import org.fusesource.hawtjni.runtime.FieldFlag;
import org.fusesource.hawtjni.runtime.JniField;
import org.fusesource.hawtjni.runtime.T32;
Expand All @@ -33,6 +34,7 @@ public class ReflectField implements JNIField {
private JniField annotation;
private HashSet<FieldFlag> flags;
private boolean allowConversion;
private ReflectFieldAccessor accessor;

public ReflectField(ReflectClass parent, Field field) {
this.parent = parent;
Expand Down Expand Up @@ -78,8 +80,8 @@ public JNIType getType64() {
return type.asType64(allowConversion);
}

public String getAccessor() {
return annotation == null ? "" : annotation.accessor();
public JNIFieldAccessor getAccessor() {
return accessor;
}

public String getCast() {
Expand Down Expand Up @@ -128,8 +130,19 @@ private void lazyLoad() {
this.type = new ReflectType(field.getType());
this.annotation = this.field.getAnnotation(JniField.class);
this.flags = new HashSet<FieldFlag>();
this.accessor = new ReflectFieldAccessor(this.field.getName());
if( this.annotation!=null ) {
this.flags.addAll(Arrays.asList(this.annotation.flags()));
if (!StringUtils.isEmpty(this.annotation.accessor())) {
this.accessor = new ReflectFieldAccessor(this.annotation.accessor());
} else if (!StringUtils.isEmpty(this.annotation.getter()) &&
!StringUtils.isEmpty(this.annotation.setter())) {
this.accessor = new ReflectFieldAccessor(
this.annotation.getter(),
this.flags.contains(GETTER_NONMEMBER),
this.annotation.setter(),
this.flags.contains(SETTER_NONMEMBER));
}
}

allowConversion = this.field.getAnnotation(T32.class)!=null;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package org.fusesource.hawtjni.generator.model;

/**
* @author <a href="mailto:calin.iorgulescu@gmail.com">Calin Iorgulescu</a>
*/
public class ReflectFieldAccessor implements JNIFieldAccessor {

private String getter;
private String setter;
private boolean nonMemberGetter;
private boolean nonMemberSetter;

public ReflectFieldAccessor(String value) {
this.getter = this.setter = value;
this.nonMemberGetter = this.nonMemberSetter = false;
}

public ReflectFieldAccessor(String getter, boolean nonMemberGetter, String setter, boolean nonMemberSetter) {
this.getter = getter;
this.nonMemberGetter = nonMemberGetter;
this.setter = setter;
this.nonMemberSetter = nonMemberSetter;
}

public String getter() {
return getter;
}

public String setter() {
return setter;
}

public boolean isNonMemberGetter() {
return nonMemberGetter;
}

public boolean isNonMemberSetter() {
return nonMemberSetter;
}

public boolean isMethodGetter() {
return getter.contains("(");
}

public boolean isMethodSetter() {
return setter.contains("(");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,22 @@ public enum FieldFlag {
* Indicate that the field is a pointer.
*/
POINTER_FIELD,


/**
* Indicate that the getter method used is not part of
* the structure. Useful for using wrappers to access
* certain structure fields.
*
* Only useful when the getter is declared explicitly.
*/
GETTER_NONMEMBER,

/**
* Indicate that the setter method used is not part of
* the structure. Useful for using wrappers to access
* certain structure fields.
*
* Only useful when the setter is declared explicitly.
*/
SETTER_NONMEMBER,
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@

String cast() default "";
String accessor() default "";
String getter() default "";
String setter() default "";
String conditional() default "";
FieldFlag[] flags() default {};

Expand Down

0 comments on commit 8f464d0

Please sign in to comment.