Bijection et Eclipse RCP
Par dgirard le jeudi, août 17 2006, - a19s - Lien permanent
Seam apporte une notion intéressante : la bijection.
Je pense utiliser cette notion dans EDF pour faire du databinding sur des composites SWT en utilisant les annotations. Voici un premier exemple de code qui illustre le concept. J'ai dans l'idée d'utiliser OGNL comme outil EL.

Le main :
import edf.inout.Context;
public class Main {
public static void main(String[] args) {
Form form = new Form();
Context context = new Context();
context.put("name", "Toto");
context.put("surname", "Bimbo");
form.injectFields(context);
System.out.println(form.name);
System.out.println(form.surname);
}
}
Un bean :
public class Form extends InOut {
@In
public String name;
public String surname = "Lala";
}
Le résultat
Toto
Lala
La classe utilitaire :
package edf.inout;
import java.lang.reflect.Field;
import java.util.HashSet;
import java.util.Set;
public class InOut {
public void injectFields(Context context) {
for (Field field : this.getInFields())
{
String name =
field.getName();
setFieldValue(this,
field, name, context.get(name));
}
}
private void setFieldValue(Object bean, Field field,
String name, Object value) {
try {
field.set(bean,
value);
} catch (Exception e) {
throw new
IllegalArgumentException("could not set field value: "
+ getAttributeMessage(name), e);
}
}
private String getAttributeMessage(String attributeName)
{
return attributeName;
}
private Set<Field> getInFields() {
Set<Field> inFields = new
HashSet<Field>();
for (Field field :
this.getClass().getDeclaredFields()) {
if
(field.isAnnotationPresent(In.class)) {
inFields.add(field);
}
}
return inFields;
}
}
Un exemple de contexte :
package edf.inout;
import java.util.HashMap;
import java.util.Map;
public class Context {
private Map<String, Object> context;
public Context() {
context = new HashMap<String,
Object>();
}
public Object get(String key) {
return context.get(key);
}
public void put(String key, Object value) {
context.put(key, value);
}
}