/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.venky.swf.menu;
import java.util.Set;
import com.venky.core.util.ObjectUtil;
import com.venky.swf.db.Database;
import com.venky.swf.db.annotations.model.MENU;
import com.venky.swf.db.model.Model;
import com.venky.swf.db.model.User;
import com.venky.swf.db.model.reflection.ModelReflector;
import com.venky.swf.db.table.Table;
import com.venky.swf.path.Path;
import com.venky.swf.path._IPath;
import com.venky.swf.views.controls.model.ModelAwareness;
import com.venky.swf.views.controls.page.Menu;
/**
*
* @author venky
*/
public class DefaultMenuBuilder implements _IMenuBuilder{
public Menu createAppMenu(_IPath path) {
Menu appmenu = new Menu();
User user = (User)path.getSessionUser();
if (user != null){
createUserMenu(path,appmenu,user);
}
createApplicationMenu(path,appmenu,user);
return appmenu;
}
protected void createUserMenu(_IPath path, Menu appmenu, User user){
Menu userMenu = userMenu(path,appmenu,user);
userMenu.createMenuItem("Signout", "/logout");
}
protected void createApplicationMenu(_IPath path,Menu appmenu, User user){
Set<String> tableNames = Database.getTableNames();
for (String tableName : tableNames){
Table<?> table = Database.getTable(tableName);
addMenuItem(path,user,appmenu, table);
}
return ;
}
protected Menu userMenu(_IPath path, Menu appmenu, User user){
Menu userMenu = appmenu.getSubmenu(user.getLongName());
_IPath userPath = path.getModelAccessPath(User.class);
if (userPath.canAccessControllerAction("edit", String.valueOf(user.getId()))){
userMenu.createMenuItem("Settings", "/users/edit/" +user.getId());
}else if (userPath.canAccessControllerAction("show", String.valueOf(user.getId()))){
userMenu.createMenuItem("Settings", "/users/show/" +user.getId());
}
return userMenu;
}
protected void addMenuItem(_IPath path,User user, Menu appMenu, Table<?> table){
Class<? extends Model> modelClass = table.getModelClass();
if (modelClass == null){
return; //Seems like some internal table of the db.
}
ModelReflector<? extends Model> ref = ModelReflector.instance(modelClass);
MENU menu = ref.getAnnotation(MENU.class);
if (menu == null) {
return ;
}
String menuName= menu.value();
if (ObjectUtil.isVoid(menuName)){
return;
}
_IPath modelAccessPath = path.getModelAccessPath(modelClass);
if (modelAccessPath.canAccessControllerAction("index")){
Menu subMenu = appMenu.getSubmenu(menuName);
String modelName = new ModelAwareness((Path) modelAccessPath, null).getLiteral(modelClass.getSimpleName());
subMenu.createMenuItem(modelName, modelAccessPath.controllerPath() + "/index");
}
}
}