package squill.mgen; import static java.lang.String.format; import org.objectweb.asm.Type; import squill.mgen.ClassInspectionUtil.ClassInfo; import squill.mgen.ClassInspectionUtil.MethodInfo; import squill.mgen.naming.NamingStrategy; import squill.util.StringUtil; public class MapColumn { private final DbColumn col; private final NamingStrategy namingStrategy; private String overrideClassName; private boolean hasProperty = false; @SuppressWarnings("unchecked") public MapColumn(DbColumn col, NamingStrategy namingStrategy, ClassInfo modelClass) { this.col = col; this.namingStrategy = namingStrategy; if (modelClass != null) { // Class proposed by typemap Class clazz = TypeMap.getType(col); System.out.println("searching for getter: " + "get" + getPropertyName()); boolean hasGetter = modelClass.getMethods().keySet().contains("get" + getPropertyName()); if (hasGetter) { MethodInfo methodInfo = modelClass.getMethods().get("get" + getPropertyName()); // The classname used in existing bean String className = Type.getReturnType(methodInfo.getDesc()).getClassName(); if (!className.equals(clazz.getCanonicalName())) { overrideClassName = className; System.out.println("The class for property " + getPropertyName() + " was overridden by class " + overrideClassName + " from existing model"); } } boolean hasSetter = modelClass.getMethods().keySet().contains("set" + getPropertyName()); hasProperty = hasGetter && hasSetter; if (hasGetter ^ hasSetter) { System.err.println("The model class '" + modelClass.getName() + "' does defines only a getter or a setter for the property '" + getPropertyName() + "'."); } } } public String getName() { return col.getName(); } public String getJavaName() { return namingStrategy.getFieldName(col.getTable().getName(), col.getName()); } public String getPropertyName() { return StringUtil.capitalize(getJavaName()); } public String getJavaType() { return overrideClassName != null ? overrideClassName : TypeMap.getTypeString(col); } public boolean isHasProperty() { return hasProperty; } public String genGetterSetter() { final String propertyName = getPropertyName(); final String variableName = getJavaName(); final String variableType = getJavaType(); StringBuilder sb = new StringBuilder(200); sb.append(format(" public %s get%s() { return %s;}%n", variableType, propertyName, variableName)); sb.append(format(" public void set%s(%s %3$s) { this.%3$s = %3$s; }%n%n", propertyName, variableType, variableName)); return sb.toString(); } }