1 30 31 34 package com.nightlabs.inheritance; 35 36 import java.lang.reflect.Field ; 37 import java.lang.reflect.Modifier ; 38 import java.util.ArrayList ; 39 import java.util.Iterator ; 40 41 import org.apache.log4j.Logger; 42 43 46 public class InheritenceManager 47 { 48 public static final Logger LOGGER = Logger.getLogger(InheritenceManager.class); 49 50 public InheritenceManager() { } 51 52 protected void callPreInherit(Inheritable obj) 53 { 54 if (!(obj instanceof InheritanceCallbacks)) 55 return; 56 57 ((InheritanceCallbacks)obj).preInherit(); 58 } 59 60 protected void callPostInherit(Inheritable obj) 61 { 62 if (!(obj instanceof InheritanceCallbacks)) 63 return; 64 65 ((InheritanceCallbacks)obj).postInherit(); 66 } 67 68 public void inheritAllFields(Inheritable mother, Inheritable child) 69 { 70 callPreInherit(mother); 71 callPreInherit(child); 72 73 Class clazz = mother.getClass(); 74 ArrayList allFields = new ArrayList (); 75 76 Class fcl = clazz; 77 while (fcl != Object .class) { 78 Field [] fields = fcl.getDeclaredFields(); 79 for (int i = 0; i < fields.length; ++i) 80 allFields.add(fields[i]); 81 82 fcl = fcl.getSuperclass(); 83 } 85 for (Iterator it = allFields.iterator(); it.hasNext(); ) { 86 Field f = (Field )it.next(); 87 88 if (Modifier.isStatic(f.getModifiers())) 89 continue; 90 91 FieldMetaData fmd = mother.getFieldMetaData(f.getName()); 92 if (fmd != null) 93 inheritField(mother, child, clazz, f, fmd); 94 } 96 callPostInherit(mother); 97 callPostInherit(child); 98 } 99 100 103 protected void inheritField( 104 Inheritable mother, Inheritable child, 105 Class motherClass, Field field, 106 FieldMetaData motherFieldMetaData) 107 { 108 LOGGER.debug("inheritField(...): mother=\""+mother+"\" child=\""+child+"\" field=\""+field.getName()+"\""); 109 110 Class childClass = child.getClass(); 111 if (!motherClass.isAssignableFrom(childClass)) 112 throw new IllegalArgumentException ("Child class is not identical to or inheriting the mother class!"); 113 114 FieldMetaData childFieldMetaData = child.getFieldMetaData(field.getName()); 115 if (childFieldMetaData == null) 116 throw new NullPointerException ("Child \""+child+"\" returned no FieldMetaData for field \""+field.getName()+"\"!"); 117 118 119 if ((motherFieldMetaData.getWritableByChildren() & FieldMetaData.WRITABLEBYCHILDREN_YES) > 0) { 120 121 if ((childFieldMetaData.getWritableByChildren() & FieldMetaData.WRITABLEBYCHILDREN_YES) == 0 && 122 (childFieldMetaData.getWritableByChildren() & FieldMetaData.WRITABLEBYCHILDREN_INHERITED) > 0) 123 { 124 childFieldMetaData.setWritableByChildren( 125 (byte)(FieldMetaData.WRITABLEBYCHILDREN_YES | FieldMetaData.WRITABLEBYCHILDREN_INHERITED)); 126 } 127 128 childFieldMetaData.setWritable(true); 129 } 130 else { 131 if (childFieldMetaData.isWritable()) 132 childFieldMetaData.setWritable(false); 133 134 if (childFieldMetaData.getWritableByChildren() == FieldMetaData.WRITABLEBYCHILDREN_YES) 135 childFieldMetaData.setWritableByChildren((byte)(FieldMetaData.WRITABLEBYCHILDREN_NO | FieldMetaData.WRITABLEBYCHILDREN_INHERITED)); 136 137 if (!childFieldMetaData.isValueInherited()) 138 childFieldMetaData.setValueInherited(true); } 140 141 if (childFieldMetaData.isValueInherited()) { 142 FieldInheriter fieldInheriter = child.getFieldInheriter(field.getName()); 143 if (fieldInheriter == null) 144 throw new NullPointerException ("fieldInheriter must not be null!"); 145 fieldInheriter.copyFieldValue( 146 mother, child, motherClass, childClass, field, motherFieldMetaData, childFieldMetaData 147 ); 148 } 149 } 150 } 151 | Popular Tags |