package cz.cvut.fel.adaptiverestfulapi.meta;
import cz.cvut.fel.adaptiverestfulapi.meta.configuration.Variable;
import cz.cvut.fel.adaptiverestfulapi.meta.model.*;
import cz.cvut.fel.adaptiverestfulapi.meta.reflection.Triplet;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
public class TestInspectionListener implements ModelInspectionListener, ConfigurationInspectionListener {
@Override
public Entity entity(Class clazz) {
return new Entity(clazz.getName(), clazz);
}
@Override
public Property property(Triplet<Field, Method, Method> triplet, Entity entity, Set<Entity> entities) {
Field field = triplet.a;
Method getter = triplet.b;
Method setter = triplet.c;
if (field != null) {
if (field.getName().equalsIgnoreCase("description")) {
return new Attribute(this.propertyName(field), getter, setter, String.class);
} else if (field.getName().equalsIgnoreCase("name")) {
return new Attribute(this.propertyName(field), getter, setter, String.class);
} else if (field.getName().equalsIgnoreCase("startedAt")) {
return new Attribute(this.propertyName(field), getter, setter, Date.class);
} else if (field.getName().equalsIgnoreCase("project")) {
return new Relationship(this.propertyName(field), getter, setter, field.getDeclaringClass().getPackage().getName() + ".Project", RelationshipType.ToOne);
} else if (field.getName().equalsIgnoreCase("issues")) {
return new Relationship(this.propertyName(field), getter, setter, field.getDeclaringClass().getPackage().getName() + ".Issue", RelationshipType.ToMany);
}
}
if (getter != null && setter != null) {
if (getter.getName().equalsIgnoreCase("isStarted") && setter.getName().equalsIgnoreCase("setStarted")) {
return new Attribute(this.propertyName(getter, "started"), getter, setter, Boolean.class);
}
return null;
} else if (getter != null) {
if (getter.getName().equalsIgnoreCase("getLocalizedDescription")) {
return new Attribute(this.propertyName(getter, "localizedDescription"), getter, null, String.class);
}
return null;
} else if (setter != null) {
if (setter.getName().equalsIgnoreCase("setLowerCasedName")) {
return new Attribute(this.propertyName(setter, "lowerCasedName"), null, setter, String.class);
}
return null;
} else {
return null;
}
}
private String propertyName(Field field) {
return field.getDeclaringClass().getName() + "." + field.getName();
}
private String propertyName(Method method, String name) {
return method.getDeclaringClass().getName() + "." + name;
}
@Override
public List<Variable> configuration() {
List<Variable> variables = new LinkedList<>();
variables.add(new Variable("Serialization", "JSON"));
return variables;
}
@Override
public List<Variable> configuration(Model model) {
List<Variable> variables = new LinkedList<>();
variables.add(new Variable("ABC", "a"));
return variables;
}
@Override
public List<Variable> configuration(Entity entity) {
List<Variable> variables = new LinkedList<>();
return variables;
}
@Override
public List<Variable> configuration(Attribute attribute) {
List<Variable> variables = new LinkedList<>();
if (attribute.getName().endsWith("description")) {
variables.add(new Variable("ABC", "z"));
}
return variables;
}
@Override
public List<Variable> configuration(Relationship relationship) {
List<Variable> variables = new LinkedList<>();
return variables;
}
}