Coverage Report - org.kuali.student.contract.model.util.DictionaryParentSetter
 
Classes in this File Line Coverage Branch Coverage Complexity
DictionaryParentSetter
0%
0/40
0%
0/28
6.5
 
 1  
 /*
 2  
  * To change this template, choose Tools | Templates
 3  
  * and open the template in the editor.
 4  
  */
 5  
 package org.kuali.student.contract.model.util;
 6  
 
 7  
 import java.util.List;
 8  
 
 9  
 import org.kuali.student.contract.exception.DictionaryExecutionException;
 10  
 import org.kuali.student.contract.model.Dictionary;
 11  
 import org.kuali.student.contract.model.DictionaryModel;
 12  
 import org.kuali.student.contract.model.Field;
 13  
 import org.kuali.student.contract.model.XmlType;
 14  
 
 15  
 /**
 16  
  *
 17  
  * @author nwright
 18  
  */
 19  
 public class DictionaryParentSetter
 20  
 {
 21  
 
 22  
  private DictionaryModel model;
 23  
  private ModelFinder finder;
 24  
 
 25  
  public DictionaryParentSetter (DictionaryModel model)
 26  0
  {
 27  0
   this.model = model;
 28  0
   this.finder = new ModelFinder (model);
 29  0
  }
 30  
 
 31  
  public void set ()
 32  
  {
 33  0
   for (int i = 1; i < model.getDictionary ().size (); i ++)
 34  
   {
 35  0
    Dictionary child = model.getDictionary ().get (i);
 36  0
    Dictionary parent = calcParent (i, child);
 37  0
    child.setParent (parent);
 38  
   }
 39  0
  }
 40  
 
 41  
  private Dictionary calcParent (int index, Dictionary child)
 42  
  {
 43  
   // if first field the parent is by default null
 44  
   // course.official
 45  0
   if (index == 0)
 46  
   {
 47  0
    return null;
 48  
   }
 49  
   // if first field of the defnition of a new main type
 50  
   // then the parent is null
 51  
   // i.e. program.official is the start of a new cluInfo definition
 52  0
   XmlType xmlType = finder.findXmlType (child.getXmlObject ());
 53  0
   if (xmlType == null)
 54  
   {
 55  0
    throw new DictionaryExecutionException ("child.getXmlObject ()=" + child.getXmlObject ());
 56  
   }
 57  0
   if (xmlType.hasOwnCreateUpdate ())
 58  
   {
 59  0
    List<Field> fields = finder.findFields (child.getXmlObject ());
 60  0
    if (fields.get (0).getShortName ().equalsIgnoreCase (child.getShortName ()))
 61  
    {
 62  0
     return null;
 63  
    }
 64  
   }
 65  0
   Dictionary prev = model.getDictionary ().get (index - 1);
 66  
   // if this is just another field on same object as prev
 67  
   // then they have the same parent
 68  
   // course.official.no                     cluIdentifierInfo
 69  
   // course.official.transcriptTitle        cluIdentifierInfo    << this has the same parent as previous
 70  0
   if (prev.getXmlObject ().equalsIgnoreCase (child.getXmlObject ()))
 71  
   {
 72  0
    return prev.getParent ();
 73  
   }
 74  
   // objects are different so check if we are going down or up
 75  
   // if going down the hierarchy
 76  0
   Field prevField = finder.findField (prev);
 77  0
   if (prevField == null)
 78  
   {
 79  0
    throw new DictionaryExecutionException
 80  
     ("Could not find field associated with dictionary entry with id =" + prev.getId ());
 81  
   }
 82  
   // going down heirarchy if this sub-object is the same type of the previous field
 83  
   // because that means this field is  the 1st field of the sub-type definition
 84  0
   if (calcType (prevField.getXmlType ()).equalsIgnoreCase (child.getXmlObject ()))
 85  
   {
 86  
    // loop back to find the first (default) definition for that field -- that is the real parent
 87  
    // not the state override
 88  
    // course.desc                <<<< Make this the parent
 89  
    // course.desc.draft.private
 90  
    // course.desc.template
 91  
    // course.desc.draft.public   <<<< not this
 92  
    // course.desc.plain          <<<< of this
 93  0
    for (int i = index - 2; i > -1; i --)
 94  
    {
 95  0
     Dictionary prev2 = model.getDictionary ().get (i);
 96  0
     if (prev2.getXmlObject ().equalsIgnoreCase (prev.getXmlObject ()))
 97  
     {
 98  0
      if (prev2.getShortName ().equalsIgnoreCase (prev.getShortName ()))
 99  
      {
 100  0
       prev = prev2;
 101  0
       continue;
 102  
      }
 103  
     }
 104  
     break;
 105  
    }
 106  0
    return prev;
 107  
   }
 108  
   // we are popping up from down in the heirarchy
 109  
   // have to go back to find the previous item at the same level
 110  
   // course.desc                                              cluInfo
 111  
   // course.desc.draft.private                  cluInfo
 112  
   // course.desc.template                              cluInfo
 113  
   // course.desc.draft.public                   cluInfo       << use this parent
 114  
   // course.desc.plain                                 richTextInfo
 115  
   // course.desc.plain.draft.private            richTextInfo
 116  
   // course.desc.plain.draft.public             richTextInfo
 117  
   // course.desc.formatted                      richTextInfo
 118  
   // course.desc.formatted.draft.private        richTextInfo
 119  
   // course.desc.formatted.draft.public         richTextInfo
 120  
   // course.rationale                                  cluInfo       << as this field's parent
 121  0
   for (int i = index - 1; i > -1; i --)
 122  
   {
 123  0
    Dictionary dict = model.getDictionary ().get (i);
 124  0
    if (dict.getXmlObject ().equalsIgnoreCase (child.getXmlObject ()))
 125  
    {
 126  0
     return dict.getParent ();
 127  
    }
 128  
   }
 129  0
   throw new DictionaryExecutionException ("dictionary entry " + child.getId ()
 130  
    + " could not calculate the parent");
 131  
  }
 132  
 
 133  
  private String calcType (String type)
 134  
  {
 135  0
   if (type.endsWith ("List"))
 136  
   {
 137  0
    type = type.substring (0, type.length () - "List".length ());
 138  
   }
 139  
 
 140  0
   return type;
 141  
  }
 142  
 
 143  
 }