rolecontroller.java

来自「anewssystem新闻发布系统集成使用了spring hibernate f」· Java 代码 · 共 223 行

JAVA
223
字号
package anni.asecurity.web;

import java.util.LinkedHashSet;
import java.util.List;

import anni.asecurity.domain.Menu;
import anni.asecurity.domain.Resource;
import anni.asecurity.domain.Role;

import anni.asecurity.manager.MenuManager;
import anni.asecurity.manager.ResourceManager;
import anni.asecurity.manager.RoleManager;

import anni.core.grid.LongGridController;

import anni.core.json.JsonUtils;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


/**
 * @author Lingo.
 * @since 2007年08月18日 下午 20时19分00秒578
 */
public class RoleController extends LongGridController<Role, RoleManager> {
    /** * logger. */
    private static Log logger = LogFactory.getLog(RoleController.class);

    /** * resource manager. */
    private ResourceManager resourceManager = null;

    /** * menu manager. */
    private MenuManager menuManager = null;

    /** * @param resourceManager Resource Manager. */
    public void setResourceManager(ResourceManager resourceManager) {
        this.resourceManager = resourceManager;
    }

    /** * @param menuManager MenuManager. */
    public void setMenuManager(MenuManager menuManager) {
        this.menuManager = menuManager;
    }

    /**
     * 显示角色对应的资源列表.
     *
     * @throws Exception 异常
     */
    public void getResources() throws Exception {
        logger.info(params());

        long roleId = getLongParam("roleId", 0L);
        Role role = getEntityDao().get(roleId);
        logger.info(roleId);

        List<Resource> resources = resourceManager.getAll();

        if (role != null) {
            for (Resource resource : resources) {
                if (role.getResources().contains(resource)) {
                    resource.setAuthorized(true);
                }
            }
        }

        JsonUtils.write(resources, response.getWriter(), getExcludes(),
            getDatePattern());
    }

    /**
     * 授权与撤消授权.
     *
     * @throws Exception 异常
     */
    public void auth() throws Exception {
        boolean isAuth = getBooleanParam("isAuth", false);
        String ids = getStrParam("ids", "");
        long roleId = getLongParam("roleId", 0L);
        Role role = getEntityDao().get(roleId);
        String[] arrays = ids.split(",");
        logger.info(roleId);
        logger.info(ids);

        if (role != null) {
            if (isAuth) {
                for (String id : arrays) {
                    Resource resource = resourceManager.get(Long.valueOf(
                                id));

                    if (!role.getResources().contains(resource)) {
                        role.getResources().add(resource);
                    }
                }
            } else {
                for (String id : arrays) {
                    Resource resource = resourceManager.get(Long.valueOf(
                                id));

                    if (role.getResources().contains(resource)) {
                        role.getResources().remove(resource);
                    }
                }
            }

            getEntityDao().save(role);
            getEntityDao().flush();

            // 修改资源
            for (String id : arrays) {
                Resource resource = resourceManager.get(Long.valueOf(id));

                getEntityDao().saveRoleInCache(resource);
            }
        }
    }

    /** * index. */
    public void index() {
        mv.setViewName("asecurity/role/index");
    }

    /**
     * 显示指定角色下可显示的菜单.
     *
     * @throws Exception 写入writer的时候,抛出异常
     */
    public void getMenuByRole() throws Exception {
        logger.info(params());

        long roleId = getLongParam("id", 0L);
        Role role = getEntityDao().get(roleId);
        List<Menu> list = menuManager.find(
                "from Menu where parent is null order by theSort asc,id desc");

        // 因为只有两级菜单,所以这里只需要写两个循环就可以判断哪些菜单被选中了
        // 不考虑多级情况,只从最直接的角度考虑
        for (Menu menu : list) {
            if (role.getMenus().contains(menu)) {
                menu.setChecked(true);

                for (Menu subMenu : menu.getChildren()) {
                    if (role.getMenus().contains(subMenu)) {
                        subMenu.setChecked(true);
                    }
                }
            }
        }

        // 现在checkbox tree的问题是无法在js里设置根节点,必须在json里做一个根节点
        // 如果不设置根节点,getChecked()方法返回的只有第一棵树的数据,疑惑中。
        // 为了他的限制,多写了下面这么多代码,真郁闷
        Menu root = new Menu();
        root.setId(0L);
        root.setName("选择菜单");
        root.setChildren(new LinkedHashSet<Menu>(list));
        root.setChecked(true);

        Menu[] menus = new Menu[] {root};

        JsonUtils.write(menus, response.getWriter(), getExcludes(),
            getDatePattern());
    }

    /**
     * 选择角色对应的菜单.
     *
     * @throws Exception 写入response可能抛出异常吧?
     */
    public void selectMenu() throws Exception {
        logger.info(params());

        long roleId = getLongParam("roleId", 0L);
        logger.info(roleId);

        Role role = getEntityDao().get(roleId);

        if (role == null) {
            response.getWriter().print("{success:false}");

            return;
        }

        role.getMenus().clear();

        String ids = getStrParam("ids", "");
        logger.info(ids);

        for (String str : ids.split(",")) {
            try {
                long id = Long.parseLong(str);
                logger.info(id);

                Menu menu = menuManager.get(id);
                logger.info(menu);

                if (menu != null) {
                    role.getMenus().add(menu);
                }
            } catch (Exception ex) {
                logger.info(ex);
            }
        }

        getEntityDao().save(role);

        response.getWriter().print("{success:true}");
    }

    /**
     * @return excludes.
     */
    @Override
    public String[] getExcludes() {
        return new String[] {
            "resources", "menus", "users", "roles", "parent", "parentId",
            "allowEdit", "draggable", "allowDelete", "allowChildren",
            "image", "root", "url", "theSort", "cls", "qtip"
        };
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?