EmbASP-Java
Mapper.java
1 package it.unical.mat.embasp.languages;
2 
3 import java.lang.annotation.Annotation;
4 import java.lang.reflect.Field;
5 import java.lang.reflect.InvocationTargetException;
6 import java.lang.reflect.Method;
7 import java.util.HashMap;
8 import java.util.Map;
9 
10 import it.unical.mat.embasp.languages.asp.IllegalTermException;
11 import it.unical.mat.embasp.languages.asp.SymbolicConstant;
12 
18 public abstract class Mapper {
19 
20  protected final Map<String, Class<?>> predicateClass = new HashMap<>();
21 
22  protected final Map<Class<?>, Map<String, Method>> classSetterMethod = new HashMap<>();
23 
24  protected abstract String getActualString(String predicate, HashMap<Integer, Object> parametersMap) throws IllegalTermException;
25 
26  public Class<?> getClass(final String predicate) {
27  return predicateClass.get(predicate);
28  }
29 
39  public Object getObject(final String atom) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException,
40  SecurityException, InstantiationException {
41  final String predicate = getId(atom);
42 
43  if(predicate == null)
44  return null;
45 
46  final Class<?> cl = getClass(predicate);
47 
48  if(cl == null)
49  return null;
50 
51  final String[] parameters = getParam(atom);
52 
53  if(parameters == null)
54  return null;
55 
56  final Object object = cl.newInstance();
57 
58  populateObject(cl, parameters, object);
59 
60  return object;
61  }
62 
66  protected abstract String getId(final String atom);
67 
71  protected abstract String[] getParam(final String atom);
72 
82  public String getString(final Object obj) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException,
84  final String predicate = registerClass(obj.getClass());
85 
86  final HashMap<Integer, Object> parametersMap = new HashMap<>();
87  for (final Field field : obj.getClass().getDeclaredFields()) {
88  if (field.isSynthetic())
89  continue;
90  if (field.isAnnotationPresent(Param.class)) {
91  final Object value = obj.getClass().getMethod("get" + Character.toUpperCase(field.getName().charAt(0)) + field.getName().substring(1))
92  .invoke(obj);
93  parametersMap.put(field.getAnnotation(Param.class).value(), value);
94  }
95  }
96  return getActualString(predicate, parametersMap);
97  }
98 
99  private void populateObject(final Class<?> cl, final String[] parameters, final Object obj) throws IllegalAccessException, InvocationTargetException {
100  for (final Field field : cl.getDeclaredFields())
101  if (field.isAnnotationPresent(Param.class)) {
102 
103  final int term = field.getAnnotation(Param.class).value();
104  final String nameMethod = "set" + Character.toUpperCase(field.getName().charAt(0)) + field.getName().substring(1);
105  final Method method = classSetterMethod.get(cl).get(nameMethod);
106 
107  if (method.getParameterTypes()[0].getName().equals(int.class.getName())
108  || method.getParameterTypes()[0].getName().equals(Integer.class.getName()))
109  method.invoke(obj, Integer.valueOf(parameters[term]));
110  else if (method.getParameterTypes()[0].getName().equals(SymbolicConstant.class.getName()))
111  method.invoke(obj, new SymbolicConstant(parameters[term]));
112  else
113  method.invoke(obj, parameters[term]);
114 
115  }
116  }
117 
123  public String registerClass(final Class<?> cl) throws ObjectNotValidException, IllegalAnnotationException {
124 
125  final Annotation annotation = cl.getAnnotation(Id.class);
126 
127  if (annotation == null)
128  throw new IllegalAnnotationException();
129 
130  final String predicate = ((Id) annotation).value();
131 
132  if (predicate.contains(" "))
133  throw new ObjectNotValidException();
134 
135  // String predicate = cl.getAnnotation(Predicate.class).value();
136  predicateClass.put(predicate, cl);
137  final Map<String, Method> namesMethods = new HashMap<>();
138  for (final Method method : cl.getMethods())
139  if (method.getName().startsWith("set"))
140  namesMethods.put(method.getName(), method);
141  classSetterMethod.put(cl, namesMethods);
142  return predicate;
143  }
144 
145  public void unregisterClass(final Class<?> cl) throws IllegalAnnotationException {
146 
147  final Annotation annotation = cl.getAnnotation(Id.class);
148 
149  if (annotation == null)
150  throw new IllegalAnnotationException();
151 
152  final String predicate = ((Id) annotation).value();
153 
154  predicateClass.remove(predicate);
155  classSetterMethod.remove(cl);
156 
157  }
158 
159 }
it.unical.mat.embasp.languages.Mapper.getId
abstract String getId(final String atom)
it.unical.mat.embasp.languages.Mapper.getParam
abstract String[] getParam(final String atom)
it.unical.mat.embasp.languages.Mapper
Definition: Mapper.java:18
it.unical.mat.embasp.languages.Param
Definition: Param.java:10
it.unical.mat.embasp.languages.Mapper.registerClass
String registerClass(final Class<?> cl)
Definition: Mapper.java:123
it.unical.mat.embasp.languages.Mapper.getObject
Object getObject(final String atom)
Definition: Mapper.java:39
it.unical.mat.embasp.languages.asp.IllegalTermException
Definition: IllegalTermException.java:3
it.unical.mat.embasp.languages.Id
Definition: Id.java:10
it.unical.mat.embasp.languages.Mapper.getString
String getString(final Object obj)
Definition: Mapper.java:82
it.unical.mat.embasp.languages.asp.SymbolicConstant
Definition: SymbolicConstant.java:3
it.unical.mat.embasp.languages.IllegalAnnotationException
Definition: IllegalAnnotationException.java:3
it.unical.mat.embasp.languages.ObjectNotValidException
Definition: ObjectNotValidException.java:3