EmbASP-CSharp
Mapper.cs
2 using System;
3 using System.Collections.Generic;
4 using System.Reflection;
5 
7 {
8  public abstract class Mapper
9  {
10  protected internal readonly IDictionary<string, Type> predicateClass = new Dictionary<string, Type>();
11  protected internal readonly IDictionary<Type, IDictionary<string, MethodInfo>> classSetterMethod = new Dictionary<Type, IDictionary<string, MethodInfo>>();
12 
13  protected internal abstract string GetActualString(string predicate, Dictionary<int, object> parametersMap);
14 
15  public virtual Type GetClass(string predicate)
16  {
17  if (predicateClass.ContainsKey(predicate))
18  return predicateClass[predicate];
19  return null;
20  }
21 
22  public virtual object GetObject(string @string)
23  {
24  string predicate = GetId(@string);
25  if (predicate is null)
26  return null;
27 
28  // Not exist mapping between the predicate and the class
29  Type cl = GetClass(predicate);
30  if (cl == null)
31  return null;
32 
33  string[] parameters = GetParam(@string);
34  if (parameters == null)
35  return null;
36 
37  object obj = System.Activator.CreateInstance(cl);
38  PopulateObject(cl, parameters, obj);
39  return obj;
40  }
41 
42  protected internal abstract string GetId(string @string);
43 
44  protected internal abstract string[] GetParam(string @string);
45 
46  public virtual string GetString(object obj)
47  {
48  string predicate = RegisterClass(obj.GetType());
49 
50  Dictionary<int, object> parametersMap = new Dictionary<int, object>();
51  foreach (FieldInfo field in obj.GetType().GetFields(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance))
52  {
53  // TODO fix isSynthetic
54  //if (field.isSynthetic)
55  //{
56  // continue;
57  //}
58  if (Attribute.IsDefined(field, typeof(Param)))
59  {
60  string nameMethod = "get" + char.ToUpper(field.Name[0]) + field.Name.Substring(1);
61  object value = obj.GetType().GetMethod(nameMethod).Invoke(obj, new object[] { });
62 
63  var attr = field.GetCustomAttribute(typeof(Param));
64  Param pAttr = attr as Param;
65  parametersMap[pAttr.value] = value;
66  }
67  }
68  return GetActualString(predicate, parametersMap);
69  }
70 
71  private void PopulateObject(Type cl, string[] parameters, object obj)
72  {
73  foreach (FieldInfo field in cl.GetFields(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance))
74  {
75  if (Attribute.IsDefined(field, typeof(Param)))
76  {
77  var attr = field.GetCustomAttribute(typeof(Param));
78  Param pAttr = attr as Param;
79  int term = pAttr.value;
80  string nameMethod = "set" + char.ToUpper(field.Name[0]) + field.Name.Substring(1);
81  MethodBase method = classSetterMethod[cl][nameMethod];
82 
83  if (method.GetParameters()[0].ParameterType.ToString().Equals(typeof(int).FullName))
84  method.Invoke(obj, new object[] { Convert.ToInt32(parameters[term]) });
85  else if (method.GetParameters()[0].ParameterType.ToString().Equals(typeof(SymbolicConstant).FullName))
86  method.Invoke(obj, new object[] { new SymbolicConstant(parameters[term]) });
87  else
88  method.Invoke(obj, new object[] { parameters[term] });
89  }
90  }
91  }
92 
93  public virtual string RegisterClass(Type cl)
94  {
95  Attribute annotation = cl.GetCustomAttribute(typeof(Id));
96  if (annotation == null)
97  throw new IllegalAnnotationException();
98 
99  string predicate = ((Id)annotation).value;
100  if (predicate.Contains(" "))
101  throw new ObjectNotValidException();
102 
103  predicateClass[predicate] = cl;
104  IDictionary<string, MethodInfo> namesMethods = new Dictionary<string, MethodInfo>();
105  foreach (MethodInfo method in cl.GetMethods())
106  if (method.Name.StartsWith("set"))
107  namesMethods[method.Name] = method;
108  classSetterMethod[cl] = namesMethods;
109  return predicate;
110  }
111 
112  public virtual void UnregisterClass(Type cl)
113  {
114  Attribute annotation = cl.GetCustomAttribute(typeof(Id));
115  if (annotation == null)
116  throw new IllegalAnnotationException();
117 
118  string predicate = ((Id)annotation).value;
119  predicateClass.Remove(predicate);
120  classSetterMethod.Remove(cl);
121  }
122  }
123 }
it.unical.mat.embasp.languages
Definition: AnswerSet.cs:5
it.unical.mat.embasp.languages.Mapper
Definition: Mapper.cs:8
EmbASP.it.unical
Definition: SymbolicConstant.cs:1
it.unical.mat.embasp.languages.Param
Definition: Param.cs:6
it.unical.mat.embasp.languages.Id
Definition: Id.cs:6
EmbASP.it.unical.mat.embasp.languages
Definition: SymbolicConstant.cs:1
EmbASP.it.unical.mat
Definition: SymbolicConstant.cs:1
EmbASP.it
Definition: SymbolicConstant.cs:1
it.unical.mat.embasp.languages.IllegalAnnotationException
Definition: IllegalAnnotationException.cs:5
it.unical.mat.embasp.languages.ObjectNotValidException
Definition: ObjectNotValidException.cs:5
EmbASP
Definition: SymbolicConstant.cs:1
EmbASP.it.unical.mat.embasp.languages.asp.SymbolicConstant
Definition: SymbolicConstant.cs:3
EmbASP.it.unical.mat.embasp
Definition: SymbolicConstant.cs:1
EmbASP.it.unical.mat.embasp.languages.asp
Definition: SymbolicConstant.cs:1