public String getColumnName() { return column.value(); }
@Table("") public abstract class Model { public static final String _ID = BaseColumns._ID; @Column(_ID) @PrimaryKey @AutoIncrement public Long id;
public String getForeignKeyClause() { StringBuilder builder = new StringBuilder(); if (isModel && annotations.containsKey(ForeignKey.class)) { ForeignKey foreignKey = (ForeignKey) annotations.get(ForeignKey.class); builder.append("FOREIGN KEY(").append(getColumnName()).append(") REFERENCES "); builder.append(modelTableName); if (foreignKey.foreignColumns().length > 0) { builder.append("("); builder.append(TextUtils.join(",", foreignKey.foreignColumns())); builder.append(")"); } if (!foreignKey.onDelete().equals(ReferentialAction.NONE)) { builder.append(" ON DELETE ").append(foreignKey.onDelete().keyword()); } if (!foreignKey.onUpdate().equals(ReferentialAction.NONE)) { builder.append(" ON UPDATE ").append(foreignKey.onUpdate().keyword()); } if (!foreignKey.deferrable().equals(ForeignKey.Deferrable.NONE)) { builder.append(" ").append(foreignKey.deferrable().keyword()); if (!foreignKey.deferrableTiming().equals(DeferrableTiming.NONE)) { builder.append(" ").append(foreignKey.deferrableTiming().keyword()); } } } return builder.toString(); }
public String getSchema() { StringBuilder builder = new StringBuilder(); builder.append(getColumnName()); builder.append(" "); builder.append(sqlType); if (annotations.containsKey(PrimaryKey.class)) { builder.append(" PRIMARY KEY"); } if (annotations.containsKey(AutoIncrement.class)) { builder.append(" AUTOINCREMENT"); } if (annotations.containsKey(NotNull.class)) { builder.append(" NOT NULL"); appendConflictClause(builder, ((NotNull) annotations.get(NotNull.class)).value()); } if (annotations.containsKey(Unique.class)) { builder.append(" UNIQUE"); appendConflictClause(builder, ((Unique) annotations.get(Unique.class)).value()); } if (annotations.containsKey(Check.class)) { builder.append(" CHECK (").append(((Check) annotations.get(Check.class)).value()).append(")"); } if (annotations.containsKey(Default.class)) { builder.append(" DEFAULT ").append(((Default) annotations.get(Default.class)).value()); } if (annotations.containsKey(Collate.class)) { builder.append(" COLLATE ").append(((Collate) annotations.get(Collate.class)).value().keyword()); } return builder.toString(); }
@Override public void writeSource(Writer writer, TypeElement element) throws IOException { final String simpleName = createSimpleName(element); final String modelSimpleName = element.getSimpleName().toString(); final String modelQualifiedName = element.getQualifiedName().toString(); final String tableName = element.getAnnotation(Table.class).value(); final Set<ColumnElement> columns = registry.getColumnElements(element); JavaWriter javaWriter = new JavaWriter(writer); javaWriter.setCompressingTypes(true); javaWriter.setIndent("\t"); javaWriter.emitSingleLineComment("Generated by Ollie. Do not modify!"); javaWriter.emitPackage("ollie"); writeImports(javaWriter, modelQualifiedName, columns); javaWriter.beginType(simpleName, "class", MODIFIERS, "ModelAdapter<" + modelSimpleName + ">"); writeGetModelType(javaWriter, modelSimpleName); writeGetTableName(javaWriter, tableName); writeGetSchema(javaWriter, tableName, columns); writeLoad(javaWriter, modelQualifiedName, columns); writeSave(javaWriter, modelQualifiedName, columns); writeDelete(javaWriter, modelQualifiedName, tableName); javaWriter.endType(); }
@Override public boolean validate(Element enclosingElement, Element element) { if (!element.getKind().equals(FIELD)) { messager.printMessage(ERROR, Errors.COLUMN_TYPE_ERROR, element); return false; } Table table = enclosingElement.getAnnotation(Table.class); if (!enclosingElement.getKind().equals(CLASS) || table == null) { messager.printMessage(ERROR, "@Column fields can only be enclosed by model classes.", element); return false; } Column column = element.getAnnotation(Column.class); Set<ColumnElement> existingColumns = registry.getColumnElements((TypeElement) enclosingElement); for (ColumnElement existingColumn : existingColumns) { if (existingColumn.getColumnName().equals(column.value())) { messager.printMessage(ERROR, Errors.COLUMN_DUPLICATE_ERROR + column.value(), element); return false; } } return true; } }
public ColumnElement(Registry registry, TypeElement enclosingType, VariableElement element) { this.element = element; this.column = element.getAnnotation(Column.class); this.enclosingType = enclosingType; this.deserializedType = registry.getElements().getTypeElement(element.asType().toString()); final TypeAdapterElement typeAdapterElement = registry.getTypeAdapterElement(deserializedType); final TypeElement modelElement = registry.getElements().getTypeElement("ollie.Model"); final DeclaredType modelType = registry.getTypes().getDeclaredType(modelElement); isModel = registry.getTypes().isAssignable(element.asType(), modelType); if (isModel) { final Table table = deserializedType.getAnnotation(Table.class); serializedType = registry.getElements().getTypeElement(Long.class.getName()); modelTableName = table.value(); } else if (typeAdapterElement != null) { serializedType = typeAdapterElement.getSerializedType(); } else { serializedType = deserializedType; } this.sqlType = SQL_TYPE_MAP.get(getSerializedQualifiedName()); List<? extends AnnotationMirror> annotationMirrors = element.getAnnotationMirrors(); for (AnnotationMirror annotationMirror : annotationMirrors) { try { Class annotationClass = Class.forName(annotationMirror.getAnnotationType().toString()); annotations.put(annotationClass, element.getAnnotation(annotationClass)); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }