final File dotFile = new File(RebindUtils.getErraiCacheDir().getAbsolutePath(), "navgraph.gv");
PrintWriter out = null;
try {
out = new PrintWriter(dotFile);
out.println("digraph Navigation {");
final MetaClass transitionToType = MetaClassFactory.get(TransitionTo.class);
final MetaClass transitionAnchorType = MetaClassFactory.get(TransitionAnchor.class);
final MetaClass transitionAnchorFactoryType = MetaClassFactory.get(TransitionAnchorFactory.class);
final MetaClass transtionToRoleType = MetaClassFactory.get(TransitionToRole.class);
for (Map.Entry<String, MetaClass> entry : pages.entrySet()) {
String pageName = entry.getKey();
MetaClass pageClass = entry.getValue();
// entry for the node itself
out.print("\"" + pageName + "\"");
Page pageAnnotation = pageClass.getAnnotation(Page.class);
List<Class<? extends PageRole>> roles = Arrays.asList(pageAnnotation.role());
if (roles.contains(DefaultPage.class)) {
out.print(" [penwidth=3]");
}
out.println();
for (MetaField field : getAllFields(pageClass)) {
final MetaClass erasedFieldType = field.getType().getErased();
if (erasedFieldType.equals(transitionToType)
|| erasedFieldType.equals(transitionAnchorType)
|| erasedFieldType.equals(transitionAnchorFactoryType)
|| erasedFieldType.equals(transtionToRoleType)) {
final MetaType targetPageType;
if (erasedFieldType.equals(transtionToRoleType)) {
final MetaType uniquePageRoleType = field.getType().getParameterizedType().getTypeParameters()[0];
targetPageType = getPageWithRole(uniquePageRoleType, pageRoles);
}
else {
targetPageType = field.getType().getParameterizedType().getTypeParameters()[0];