package test.basic.type; public class TypeReader { // // private static final Log log = LogFactory.getLog(TypeReader.class); // // final Store<String, Type> types; // final CtClass clzScala; // // TypeReader(Store<String, Type> types, CtClass scala) { // this.types = types; // this.clzScala = scala; // } // // Type fillFrom(CtClass clz, Type type) throws ClassNotFoundException, NotFoundException { // Object an = null; // an = clz.getAnnotation(DisplayName.class); // log.debug(type.name); // if (an != null) { // log.trace("DisplayName Annotation: " + an); // log.trace("DisplayName Annotation Value: " + ((DisplayName) an).value()); // type.displayName = ((DisplayName) an).value(); // } else { // type.displayName = type.getName(); // } // // log.trace("Start Prase - " + type.name); // log.trace("DisplayName: " + type.displayName); // // // type.displayName = (an = clz.getAnnotation(DisplayName.class)) != // // null ? ((DisplayName) an).value() : clz // // .getName(); // // // // Handle Frame Type // // boolean frameType = clz.getAnnotation(FrameType.class) != null; // // type.master = Type.Master; // // if (clz.getFields().length < 1) { // if (clz.isPrimitive() || clz.subtypeOf(clzScala)) { // type.master = Type.Scala; // } else { // type.master = Type.Underlying; // } // type.standalone = false; // return type; // } // // log.trace("DeclaringClass: " + clz.getDeclaringClass()); // if (clz.getDeclaringClass() != null) { // type.master = Type.Eembedded; // type.declaringType = types.readData(clz.getDeclaringClass().getName()); // type.standalone = false; // } else { // type.standalone = true; // } // // if (clz.getAnnotation(Master.class) != null) { // type.master = Type.Master; // } else if (clz.getAnnotation(Sequence.class) != null) { // type.master = Type.Sequence; // } else if (clz.getAnnotation(Attribute.class) != null) { // type.master = Type.Attribute; // } // log.trace("master: " + type.master); // // if (clz.getAnnotation(Dependent.class) != null) { // type.standalone = false; // type.master = Type.Eembedded; // } // // log.trace("standalone: " + type.standalone); // // // Construct type // CtField[] cfs = clz.getFields(); // // // type = types.get(name); // // log.trace("Fields length: " + cfs.length); // List<Field> fs = type.fields; // for (int i = 0; i < cfs.length; i++) { // if (!Modifier.isStatic(cfs[i].getModifiers())) { // fs.add(readTo(type, cfs[i])); // } // } // // int countKey = 0; // for (Field f : fs) { // if (f.importance == Field.PrimaryKey) // countKey++; // } // log.trace("Before resign countKey: " + countKey); // // // 如果没有Key的话,按字段名称寻找PrimaryKey中定义的可以默认作为Key的字段 // if (countKey <= 0 && (an = PrimaryKey.class.getAnnotation(AutoWireByName.class)) != null) { // String autoWire = ((AutoWireByName) an).value(); // for (Field f : fs) { // if (f.name.indexOf(autoWire) > 0) { // f.importance = Field.PrimaryKey; // countKey++; // continue; // } // } // } // // log.trace("After resign by AutoWireByName countKey: " + countKey); // // // 如果没有Key的话,并且是独立实体的话,设定第一个字段为Key // if (fs.size() > 0 && type.standalone) { // if (countKey <= 0) { // fs.get(0).importance = Field.PrimaryKey; // } // } // // return type; // } // // protected Field readTo(Type resideType, CtField ctField) throws ClassNotFoundException, NotFoundException { // Object an = null; // // // if (ctField.getName().equals("this$0")) { // // } // // String name = ctField.getName(); // log.trace("Start parse: " + name); // // String displayName = (an = ctField.getAnnotation(DisplayName.class)) != null ? ((DisplayName) an).value() // : name; // // log.trace("displayName: " + displayName); // /* Handle type */ // CtClass fieldTypeClazz = ctField.getType(); // // Type fieldType = null; // boolean array = false; // // /* construct field */ // if (fieldTypeClazz.isArray()) { // log.trace("Is Array :" + fieldTypeClazz.getComponentType().getName()); // array = true; // fieldType = types.readData(fieldTypeClazz.getComponentType().getName()); // } else if (fieldTypeClazz.getName().equals(java.util.List.class.getName()) // || fieldTypeClazz.getName().equals(noc.lang.List.class.getName())) { // log.trace("Is Generic field :" + fieldTypeClazz.getName()); // // Generic field // array = true; // fieldType = types.readData(decorateActualTypeArguments(ctField).get(0)); // } else { // log.trace("Normal :" + fieldTypeClazz.getName()); // fieldType = types.readData(fieldTypeClazz.getName()); // } // // if (ctField.hasAnnotation(RealType.class)) { // fieldType = types.readData(((RealType) ctField.getAnnotation(RealType.class)).value().getName()); // log.trace("change type to defined RealType :" + fieldType); // } // // assert fieldType != null; // // Field field = new Field(name, fieldType); // field.array = array; // field.displayName = displayName; // // if (fieldType == resideType) { // field.refer = Field.Cascade; // } else if (fieldType.master == Type.Scala) { // field.refer = Field.Scala; // } else if (check(ctField, fieldType.name, Inline.class)) { // field.refer = Field.Inline; // } else { // field.refer = Field.Reference; // } // if (ctField.hasAnnotation(Reference.class)) // field.refer = Field.Reference; // // if (check(ctField, fieldTypeClazz, Important.class)) // field.importance = Field.Important; // if (check(ctField, fieldTypeClazz, Core.class)) // field.importance = Field.Core; // if (ctField.hasAnnotation(PrimaryKey.class)) // field.importance = Field.PrimaryKey; // // return field; // } // // protected boolean check(CtField ctField, String typeName, Class<? extends Annotation> anClz) // throws ClassNotFoundException, NotFoundException { // boolean succeed = false; // Annotation an = null; // // an = anClz.getAnnotation(AutoWireByName.class); // if (an != null) { // AutoWireByName au = (AutoWireByName) an; // if (au.value().indexOf(ctField.getName() + ";") >= 0) { // succeed = true; // } // } // // an = anClz.getAnnotation(AutoWireByType.class); // if (an != null) { // AutoWireByType au = (AutoWireByType) an; // for (Class<?> c : au.value()) { // if (c.getName().equalsIgnoreCase(typeName)) { // succeed = true; // } // } // } // // succeed = ctField.getAnnotation(anClz) != null ? true : succeed; // // return succeed; // } // // protected boolean check(CtClass ctClass, String typeName, Class<? extends Annotation> anClz) // throws ClassNotFoundException, NotFoundException { // boolean succeed = false; // Annotation an = null; // // an = anClz.getAnnotation(AutoWireByName.class); // if (an != null) { // AutoWireByName au = (AutoWireByName) an; // if (au.value().indexOf(ctClass.getName() + ";") >= 0) { // succeed = true; // } // } // // an = anClz.getAnnotation(AutoWireByType.class); // if (an != null) { // AutoWireByType au = (AutoWireByType) an; // for (Class<?> c : au.value()) { // if (c.getName().equalsIgnoreCase(typeName)) { // succeed = true; // } // } // } // // succeed = ctClass.getAnnotation(anClz) != null ? true : succeed; // // return succeed; // } // // protected boolean check(CtField ctField, CtClass ctType, Class<? extends Annotation> anClz) // throws ClassNotFoundException, NotFoundException { // boolean succeed = false; // Annotation an = null; // // an = anClz.getAnnotation(AutoWireByName.class); // if (an != null) { // AutoWireByName au = (AutoWireByName) an; // if (au.value().indexOf(ctField.getName() + ";") >= 0) { // succeed = true; // } // } // // an = anClz.getAnnotation(AutoWireByType.class); // if (an != null) { // AutoWireByType au = (AutoWireByType) an; // for (Class<?> c : au.value()) { // if (c.getName().equalsIgnoreCase(ctType.getName())) { // succeed = true; // } // } // } // // succeed = ctType.getAnnotation(anClz) != null ? true : succeed; // succeed = ctField.getAnnotation(anClz) != null ? true : succeed; // // return succeed; // } // // protected ArrayList<String> decorateActualTypeArguments(CtField v) { // // log.trace("v.getFieldInfo().getName()" + v.getFieldInfo().getName()); // // SignatureAttribute s = (SignatureAttribute) v.getFieldInfo().getAttribute(SignatureAttribute.tag); // assert s != null; // // String sig = s.getSignature(); // ArrayList<String> params = new ArrayList<String>(); // // int pos = 0; // // assert sig.charAt(pos) == 'L'; // // pos++; // // int start = pos; // while (sig.charAt(++pos) != '<') // ; // // String typename = sig.substring(start, pos).replace('/', '.'); // // assert typename.equals(noc.lang.List.class.getName()) || typename.equals(java.util.List.class.getName()); // pos++; // // do { // String pam; // if (sig.charAt(pos) != 'L') // break; // // pos++; // // start = pos; // while (sig.charAt(++pos) != ';') // ; // // pam = sig.substring(start, pos).replace('/', '.'); // params.add(pam); // pos++; // } while (sig.charAt(pos) != '>'); // // return params; // } }