View Javadoc

1   package org.kuali.student.common.dictionary.service.impl;
2   
3   import java.util.ArrayList;
4   import java.util.Arrays;
5   import java.util.List;
6   
7   import org.kuali.student.common.dictionary.dto.FieldDefinition;
8   import org.kuali.student.common.dictionary.dto.ObjectStructureDefinition;
9   
10  public class Dictionary2BeanComparer
11  {
12  
13  
14   private String className;
15   private ObjectStructureDefinition osDict;
16  
17   public Dictionary2BeanComparer (String className, ObjectStructureDefinition osDict)
18   {
19    this.className = className;
20    this.osDict = osDict;
21   }
22  
23  
24   public List<String> compare ()
25   {
26    if (className == null)
27    {
28     return Arrays.asList (osDict.getName () + " does not have a corresponding java class");
29    }
30    Class<?> clazz = null;
31    try
32    {
33     clazz = Class.forName (className);
34    }
35    catch (ClassNotFoundException ex)
36    {
37     return Arrays.asList (className + " does not have a corresponding java class");
38    }
39    ObjectStructureDefinition osBean = new Bean2DictionaryConverter (clazz).convert ();
40    return compare (osDict, osBean);
41  
42   }
43  
44   private List<String> compare (ObjectStructureDefinition osDict,
45                                 ObjectStructureDefinition osBean)
46   {
47    List<String> discrepancies = new ArrayList ();
48    compareAddDiscrepancy (discrepancies, "Java class name", osDict.getName (), osBean.getName ());
49    compareAddDiscrepancy (discrepancies, "Has meta data?", osDict.isHasMetaData (), osBean.isHasMetaData ());
50    compareAddDiscrepancy (discrepancies, "Business object class", osDict.getBusinessObjectClass (), osBean.getBusinessObjectClass ());
51    for (FieldDefinition fdDict : osDict.getAttributes ())
52    {
53     FieldDefinition fdBean = findField (fdDict.getName (), osBean);
54     if (fdBean == null)
55     {
56      if ( ! fdDict.isDynamic ())
57      {
58       discrepancies.add ("Field " + fdDict.getName () + " does not exist in the corresponding java class");
59      }
60      continue;
61     }
62     compareAddDiscrepancy (discrepancies, fdDict.getName () + " dataType", fdDict.getDataType (), fdBean.getDataType ());
63     compareAddDiscrepancy (discrepancies, fdDict.getName () + " maxOccurs", fdDict.getMaxOccurs (), fdBean.getMaxOccurs ());
64    }
65     for (FieldDefinition fdBean : osBean.getAttributes ())
66    {
67     FieldDefinition fdDict = findField (fdBean.getName (), osDict);
68     if (fdDict == null)
69     {
70      discrepancies.add ("Field " + fdBean.getName () + " missing from the dictictionary");
71      continue;
72     }
73    }
74    return discrepancies;
75   }
76  
77   private FieldDefinition findField (String name, ObjectStructureDefinition os)
78   {
79    for (FieldDefinition fd : os.getAttributes ())
80    {
81     if (name.equals (fd.getName ()))
82     {
83      return fd;
84     }
85    }
86    return null;
87   }
88  
89   private void compareAddDiscrepancy (List<String> discrepancies, String field, boolean value1,
90                                 boolean value2)
91   {
92    String discrep = compare (field, value1, value2);
93    if (discrep != null)
94    {
95     discrepancies.add (discrep);
96    }
97   }
98  
99   private void compareAddDiscrepancy (List<String> discrepancies, String field, Object value1,
100                                Object value2)
101  {
102   String discrep = compare (field, value1, value2);
103   if (discrep != null)
104   {
105    discrepancies.add (discrep);
106   }
107  }
108 
109   private String compare (String field, boolean value1, boolean value2)
110  {
111   if (value1)
112   {
113    if (value2)
114    {
115     return null;
116    }
117   }
118   if ( ! value1)
119   {
120    if ( ! value2)
121    {
122     return null;
123    }
124   }
125   return field + " inconsistent: dictionary='" + value1 + "', java class='" + value2 + "'";
126  }
127 
128  private String compare (String field, Object value1, Object value2)
129  {
130   if (value1 == null)
131   {
132    if (value2 == null)
133    {
134     return null;
135    }
136   }
137   else
138   {
139    if (value1.equals (value2))
140    {
141     return null;
142    }
143   }
144   return field + " inconsistent: dictionary='" + value1 + "'], java class='" + value2 + "'";
145  }
146 }