1 15 package org.apache.tapestry.test; 16 17 import java.util.ArrayList ; 18 import java.util.HashMap ; 19 import java.util.Iterator ; 20 import java.util.List ; 21 import java.util.Map ; 22 23 import org.apache.commons.logging.Log; 24 import org.apache.commons.logging.LogFactory; 25 import org.apache.hivemind.ApplicationRuntimeException; 26 import org.apache.hivemind.ClassResolver; 27 import org.apache.hivemind.impl.DefaultClassResolver; 28 import org.apache.hivemind.service.ClassFactory; 29 import org.apache.hivemind.service.impl.ClassFactoryImpl; 30 import org.apache.hivemind.util.PropertyUtils; 31 import org.apache.tapestry.Tapestry; 32 import org.apache.tapestry.enhance.AbstractPropertyWorker; 33 import org.apache.tapestry.enhance.EnhancementOperationImpl; 34 import org.apache.tapestry.enhance.EnhancementWorker; 35 import org.apache.tapestry.services.ComponentConstructor; 36 import org.apache.tapestry.spec.ComponentSpecification; 37 38 55 public class Creator 56 { 57 private static final Log LOG = LogFactory.getLog(Creator.class); 58 59 62 private Map _constructors = new HashMap (); 63 64 private ClassFactory _classFactory = new ClassFactoryImpl(); 65 66 private ClassResolver _classResolver = new DefaultClassResolver(); 67 68 private List _workers = new ArrayList (); 69 70 { 71 74 _workers.add(new CreatePropertyWorker("messages")); 75 _workers.add(new CreatePropertyWorker("specification")); 76 77 81 _workers.add(new AbstractPropertyWorker()); 82 } 83 84 private ComponentConstructor createComponentConstructor(Class inputClass) 85 { 86 if (inputClass.isInterface() || inputClass.isPrimitive() || inputClass.isArray()) 87 throw new IllegalArgumentException (ScriptMessages.wrongTypeForEnhancement(inputClass)); 88 89 EnhancementOperationImpl op = new EnhancementOperationImpl(_classResolver, 90 new ComponentSpecification(), inputClass, _classFactory); 91 92 Iterator i = _workers.iterator(); 93 while (i.hasNext()) 94 { 95 EnhancementWorker worker = (EnhancementWorker) i.next(); 96 97 worker.performEnhancement(op, null); 98 } 99 100 return op.getConstructor(); 101 } 102 103 private ComponentConstructor getComponentConstructor(Class inputClass) 104 { 105 ComponentConstructor result = (ComponentConstructor) _constructors.get(inputClass); 106 107 if (result == null) 108 { 109 result = createComponentConstructor(inputClass); 110 111 _constructors.put(inputClass, result); 112 } 113 114 return result; 115 } 116 117 121 public Object newInstance(Class abstractClass) 122 { 123 ComponentConstructor constructor = getComponentConstructor(abstractClass); 124 125 try 126 { 127 return constructor.newInstance(); 128 } 129 catch (Exception ex) 130 { 131 throw new ApplicationRuntimeException(ScriptMessages.unableToInstantiate( 132 abstractClass, 133 ex)); 134 } 135 } 136 137 141 public Object newInstance(Class abstractClass, Map properties) 142 { 143 Object result = newInstance(abstractClass); 144 145 if (properties != null) 146 { 147 Iterator i = properties.entrySet().iterator(); 148 149 while (i.hasNext()) 150 { 151 Map.Entry e = (Map.Entry ) i.next(); 152 153 String propertyName = (String ) e.getKey(); 154 155 PropertyUtils.write(result, propertyName, e.getValue()); 156 } 157 } 158 159 return result; 160 } 161 162 166 167 public Object newInstance(Class abstractClass, Object [] properties) 168 { 169 Map propertyMap = Tapestry.convertArrayToMap(properties); 170 171 return newInstance(abstractClass, propertyMap); 172 } 173 } | Popular Tags |