ConstructorBlockBuilder<?> ctor = classBuilder.publicConstructor();
final Collection<MetaClass> pages = ClassScanner.getTypesAnnotatedWith(Page.class);
for (MetaClass pageClass : pages) {
if (!pageClass.isAssignableTo(Widget.class)) {
throw new GenerationException(
"Class " + pageClass.getFullyQualifiedName() + " is annotated with @Page, so it must be a subtype " +
"of Widget.");
}
Page annotation = pageClass.getAnnotation(Page.class);
String pageName = annotation.path().equals("") ? pageClass.getName() : annotation.path();
MetaClass prevPageWithThisName = pageNames.put(pageName, pageClass);
if (prevPageWithThisName != null) {
throw new GenerationException(
"Page names must be unique, but " + prevPageWithThisName + " and " + pageClass +
" are both named [" + pageName + "]");
}
Statement pageImplStmt = generateNewInstanceOfPageImpl(pageClass, pageName);
if (annotation.startingPage() == true) {
defaultPages.add(pageClass);
// need to assign the page impl to a variable and add it to the map twice
ctor.append(Stmt.declareFinalVariable("defaultPage", PageNode.class, pageImplStmt));
pageImplStmt = Variable.get("defaultPage");
ctor.append(
Stmt.nestedCall(Refs.get("pagesByName"))
.invoke("put", "", pageImplStmt));
}
else if (pageName.equals("")) {
throw new GenerationException(
"Page " + pageClass.getFullyQualifiedName() + " has an empty path. Only the" +
" page with startingPage=true is permitted to have an empty path.");
}
ctor.append(
Stmt.nestedCall(Refs.get("pagesByName"))
.invoke("put", pageName, pageImplStmt));
}
ctor.finish();
renderNavigationToDotFile(pageNames);
if (defaultPages.size() == 0) {
throw new GenerationException(
"No @Page classes have startingPage=true. Exactly one @Page class" +
" must be designated as the starting page.");
}
if (defaultPages.size() > 1) {
StringBuilder defaultPageList = new StringBuilder();
for (MetaClass mc : defaultPages) {
defaultPageList.append("\n ").append(mc.getFullyQualifiedName());
}
throw new GenerationException(
"Found more than one @Page with startingPage=true: " + defaultPageList +
"\nExactly one @Page class must be designated as the starting page.");
}
String out = classBuilder.toJavaString();