11.10 Map
This commit is contained in:
105
src/annotations/database/TableCreationProcessorFactory.java
Normal file
105
src/annotations/database/TableCreationProcessorFactory.java
Normal file
@@ -0,0 +1,105 @@
|
||||
//: annotations/database/TableCreationProcessorFactory.java
|
||||
// The database example using Visitor.
|
||||
// {Exec: apt -factory
|
||||
// annotations.database.TableCreationProcessorFactory
|
||||
// database/Member.java -s database}
|
||||
package annotations.database;
|
||||
import com.sun.mirror.apt.*;
|
||||
import com.sun.mirror.declaration.*;
|
||||
import com.sun.mirror.util.*;
|
||||
import java.util.*;
|
||||
import static com.sun.mirror.util.DeclarationVisitors.*;
|
||||
|
||||
public class TableCreationProcessorFactory
|
||||
implements AnnotationProcessorFactory {
|
||||
public AnnotationProcessor getProcessorFor(
|
||||
Set<AnnotationTypeDeclaration> atds,
|
||||
AnnotationProcessorEnvironment env) {
|
||||
return new TableCreationProcessor(env);
|
||||
}
|
||||
public Collection<String> supportedAnnotationTypes() {
|
||||
return Arrays.asList(
|
||||
"annotations.database.DBTable",
|
||||
"annotations.database.Constraints",
|
||||
"annotations.database.SQLString",
|
||||
"annotations.database.SQLInteger");
|
||||
}
|
||||
public Collection<String> supportedOptions() {
|
||||
return Collections.emptySet();
|
||||
}
|
||||
private static class TableCreationProcessor
|
||||
implements AnnotationProcessor {
|
||||
private final AnnotationProcessorEnvironment env;
|
||||
private String sql = "";
|
||||
public TableCreationProcessor(
|
||||
AnnotationProcessorEnvironment env) {
|
||||
this.env = env;
|
||||
}
|
||||
public void process() {
|
||||
for(TypeDeclaration typeDecl :
|
||||
env.getSpecifiedTypeDeclarations()) {
|
||||
typeDecl.accept(getDeclarationScanner(
|
||||
new TableCreationVisitor(), NO_OP));
|
||||
sql = sql.substring(0, sql.length() - 1) + ");";
|
||||
System.out.println("creation SQL is :\n" + sql);
|
||||
sql = "";
|
||||
}
|
||||
}
|
||||
private class TableCreationVisitor
|
||||
extends SimpleDeclarationVisitor {
|
||||
public void visitClassDeclaration(
|
||||
ClassDeclaration d) {
|
||||
DBTable dbTable = d.getAnnotation(DBTable.class);
|
||||
if(dbTable != null) {
|
||||
sql += "CREATE TABLE ";
|
||||
sql += (dbTable.name().length() < 1)
|
||||
? d.getSimpleName().toUpperCase()
|
||||
: dbTable.name();
|
||||
sql += " (";
|
||||
}
|
||||
}
|
||||
public void visitFieldDeclaration(
|
||||
FieldDeclaration d) {
|
||||
String columnName = "";
|
||||
if(d.getAnnotation(SQLInteger.class) != null) {
|
||||
SQLInteger sInt = d.getAnnotation(
|
||||
SQLInteger.class);
|
||||
// Use field name if name not specified
|
||||
if(sInt.name().length() < 1) {
|
||||
columnName = d.getSimpleName().toUpperCase();
|
||||
} else {
|
||||
columnName = sInt.name();
|
||||
}
|
||||
sql += "\n " + columnName + " INT" +
|
||||
getConstraints(sInt.constraints()) + ",";
|
||||
}
|
||||
if(d.getAnnotation(SQLString.class) != null) {
|
||||
SQLString sString = d.getAnnotation(
|
||||
SQLString.class);
|
||||
// Use field name if name not specified.
|
||||
if(sString.name().length() < 1) {
|
||||
columnName = d.getSimpleName().toUpperCase();
|
||||
} else {
|
||||
columnName = sString.name();
|
||||
}
|
||||
sql += "\n " + columnName + " VARCHAR(" +
|
||||
sString.value() + ")" +
|
||||
getConstraints(sString.constraints()) + ",";
|
||||
}
|
||||
}
|
||||
private String getConstraints(Constraints con) {
|
||||
String constraints = "";
|
||||
if(!con.allowNull()) {
|
||||
constraints += " NOT NULL";
|
||||
}
|
||||
if(con.primaryKey()) {
|
||||
constraints += " PRIMARY KEY";
|
||||
}
|
||||
if(con.unique()) {
|
||||
constraints += " UNIQUE";
|
||||
}
|
||||
return constraints;
|
||||
}
|
||||
}
|
||||
}
|
||||
} ///:~
|
||||
Reference in New Issue
Block a user