de.forsthaus.webui.security.rolegroup.SecRolegroupCtrl.java Source code

Java tutorial

Introduction

Here is the source code for de.forsthaus.webui.security.rolegroup.SecRolegroupCtrl.java

Source

/**
 * Copyright 2010 the original author or authors.
 * 
 * This file is part of Zksample2. http://zksample2.sourceforge.net/
 *
 * Zksample2 is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * Zksample2 is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Zksample2.  If not, see <http://www.gnu.org/licenses/gpl.html>.
 */
package de.forsthaus.webui.security.rolegroup;

import java.io.Serializable;
import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.dao.DataAccessException;
import org.zkoss.zk.ui.Path;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zul.Borderlayout;
import org.zkoss.zul.Button;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.FieldComparator;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listcell;
import org.zkoss.zul.Listheader;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.Paging;
import org.zkoss.zul.Panel;
import org.zkoss.zul.Window;

import de.forsthaus.backend.model.SecGroup;
import de.forsthaus.backend.model.SecRole;
import de.forsthaus.backend.model.SecRolegroup;
import de.forsthaus.backend.service.SecurityService;
import de.forsthaus.backend.util.HibernateSearchObject;
import de.forsthaus.webui.security.groupright.SecGrouprightCtrl;
import de.forsthaus.webui.security.rolegroup.model.SecRolegroupGroupListModelItemRenderer;
import de.forsthaus.webui.security.rolegroup.model.SecRolegroupRoleListModelItemRenderer;
import de.forsthaus.webui.util.GFCBaseCtrl;
import de.forsthaus.webui.util.SelectionCtrl;
import de.forsthaus.webui.util.ZksampleMessageUtils;
import de.forsthaus.webui.util.pagging.PagedListWrapper;

/**
 * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br>
 * This is the controller class for the
 * /WEB-INF/pages/sec_rolegroup/secRolegroup.zul file.<br>
 * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br>
 * <br>
 * This is the controller class for the Security RoleGroup Page described in the
 * secRolegroup.zul file. <br>
 * <br>
 * This page allows the visual editing of three tables that represents<br>
 * groups that belongs to roles. <br>
 * <br>
 * 1. Roles (table: secRole) <br>
 * 2. Groups (table: secGroup) <br>
 * 3. Role-Groups (table: secRolegroup - The intersection of the two tables <br>
 * <br>
 * for working:
 * 
 * @see SecGrouprightCtrl
 * 
 * @changes 05/15/2009: sge Migrating the list models for paging. <br>
 *          07/24/2009: sge changes for clustering.<br>
 *          10/12/2009: sge changings in the saving routine.<br>
 *          11/07/2009: bbr changed to extending from GFCBaseCtrl<br>
 *          (GenericForwardComposer) for spring-managed creation.<br>
 * 
 * @author bbruhns
 * @author sgerth
 */
public class SecRolegroupCtrl extends GFCBaseCtrl implements Serializable, SelectionCtrl<SecRole> {

    private static final long serialVersionUID = -546886879998950467L;
    private static final Logger logger = Logger.getLogger(SecRolegroupCtrl.class);

    private transient PagedListWrapper<SecRole> plwSecRoles;
    private transient PagedListWrapper<SecGroup> plwSecGroups;

    // init the rendering of the rights
    private transient SecRole selectedRole;

    /*
     * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     * All the components that are defined here and have a corresponding
     * component with the same 'id' in the zul-file are getting autowired by our
     * 'extends GFCBaseCtrl' GenericForwardComposer.
     * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     */
    protected Window secRolegroupWindow; // autowired
    protected Panel panel_SecRoleGroup; // autowired

    // listbox SecRoles
    protected Borderlayout borderLayout_Roles; // autowired
    protected Paging paging_ListBoxSecRole; // autowired
    protected Listbox listBoxSecRole; // autowired
    protected Listheader listheader_SecRoleGroup_Rolename; // autowired

    // listbox granted groups
    protected Borderlayout borderLayout_Groups; // autowired
    protected Paging paging_ListBoxSecRolegroup; // autowired
    protected Listbox listBoxSecRolegroup; // autowired
    protected Listheader listheader_SecRoleGroup_GrantedRight; // autowired
    protected Listheader listheader_SecRoleGroup_GroupName; // autowired

    // CRUD Buttons
    protected Button btnSave; // autowired
    protected Button btnClose; // autowired

    protected Borderlayout borderlayoutSecRolegroup; // autowired

    // row count for listbox
    private int countRowsSecRole;
    private int countRowsSecRolegroup;

    // ServiceDAOs / Domain Classes
    private transient SecurityService securityService;

    /**
     * default constructor.<br>
     */
    public SecRolegroupCtrl() {
        super();
    }

    /**
     * 
     * @param event
     * @throws Exception
     */
    public void onCreate$secRolegroupWindow(Event event) throws Exception {
        /* ++++ calculate the heights +++++ */
        final int topHeader = 40;
        final int btnTopArea = 42;
        final int winTitle = 30;

        /**
         * Calculate how many rows have been place in the listbox. Get the
         * currentDesktopHeight from a hidden Intbox from the index.zul that are
         * filled by onClientInfo() in the indexCtroller
         */

        int panelHeight = 25;
        // TODO put the logic for working with panel in the ApplicationWorkspace
        final boolean withPanel = false;
        if (withPanel == false) {
            panel_SecRoleGroup.setVisible(false);
        } else {
            panel_SecRoleGroup.setVisible(true);
            panelHeight = 0;
        }

        int height = ((Intbox) Path.getComponent("/outerIndexWindow/currentDesktopHeight")).getValue().intValue();
        height = height + panelHeight;
        final int maxListBoxHeight = height - topHeader - btnTopArea - winTitle;
        setCountRowsSecRole(Math.round(maxListBoxHeight / 30));
        setCountRowsSecRolegroup(Math.round(maxListBoxHeight / 30));
        // System.out.println("MaxListBoxHeight : " + maxListBoxHeight);
        // System.out.println("==========> : " + getCountRowsSecRole());
        // System.out.println("==========> : " + getCountRowsSecRolegroup());

        // secRolegroupWindow.setHeight((height - topHeader) + "px");

        // not used listheaders must be declared like ->
        // lh.setSortAscending(""); lh.setSortDescending("")
        // Assign the Comparator for sorting listBoxSecRole
        listheader_SecRoleGroup_Rolename.setSortAscending(new FieldComparator("rolShortdescription", true));
        listheader_SecRoleGroup_Rolename.setSortDescending(new FieldComparator("rolShortdescription", false));

        // Assign the Comparator for sorting listBoxRoleGroups
        listheader_SecRoleGroup_GroupName.setSortAscending(new FieldComparator("grpShortdescription", true));
        listheader_SecRoleGroup_GroupName.setSortDescending(new FieldComparator("grpShortdescription", false));

        /* set the PageSize */
        paging_ListBoxSecRole.setPageSize(getCountRowsSecRole());
        paging_ListBoxSecRole.setDetailed(true);

        paging_ListBoxSecRolegroup.setPageSize(getCountRowsSecRolegroup());
        paging_ListBoxSecRolegroup.setDetailed(true);

        // main borderlayout height = window.height - (Panels Top)
        borderlayoutSecRolegroup.setHeight(String.valueOf(maxListBoxHeight) + "px");
        borderLayout_Roles.setHeight(String.valueOf(maxListBoxHeight - 5) + "px");
        borderLayout_Groups.setHeight(String.valueOf(maxListBoxHeight - 5) + "px");

        listBoxSecRole.setHeight(String.valueOf(maxListBoxHeight - 130) + "px");
        listBoxSecRolegroup.setHeight(String.valueOf(maxListBoxHeight - 130) + "px");

        /* Tab Details */
        // ++ create the searchObject and init sorting ++//
        HibernateSearchObject<SecRole> soSecRole = new HibernateSearchObject<SecRole>(SecRole.class,
                getCountRowsSecRole());
        soSecRole.addSort("rolShortdescription", false);

        // Set the ListModel.
        getPlwSecRoles().init(soSecRole, listBoxSecRole, paging_ListBoxSecRole);
        // set the itemRenderer
        listBoxSecRole.setItemRenderer(new SecRolegroupRoleListModelItemRenderer());

        // Before we set the ItemRenderer we select the first Item
        // for init the rendering of the rights
        setSelectedRole((SecRole) listBoxSecRole.getModel().getElementAt(0));
        listBoxSecRole.setSelectedIndex(0);

        // ++ create the searchObject and init sorting ++//
        HibernateSearchObject<SecGroup> soSecRolegroup = new HibernateSearchObject<SecGroup>(SecGroup.class,
                getCountRowsSecRolegroup());
        soSecRolegroup.addSort("grpShortdescription", false);

        // Set the ListModel.
        getPlwSecGroups().init(soSecRolegroup, listBoxSecRolegroup, paging_ListBoxSecRolegroup);
        // set the itemRenderer
        listBoxSecRolegroup.setItemRenderer(new SecRolegroupGroupListModelItemRenderer(this));

    }

    // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    // +++++++++++++++++++++++ Components events +++++++++++++++++++++++
    // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    /**
     * when the "save" button is clicked. <br>
     * 
     * @param event
     * @throws InterruptedException
     */
    public void onClick$btnSave(Event event) throws InterruptedException {
        // logger.debug(event.toString());

        doSave();
    }

    /**
     * when the "help" button is clicked. <br>
     * 
     * @param event
     * @throws InterruptedException
     */
    public void onClick$btnHelp(Event event) throws InterruptedException {
        // logger.debug(event.toString());

        ZksampleMessageUtils.doShowNotImplementedMessage();
    }

    /**
     * when the "refresh" button is clicked. <br>
     * <br>
     * Refreshes the view by calling the onCreate event manually.
     * 
     * @param event
     * @throws InterruptedException
     */
    public void onClick$btnRefresh(Event event) throws InterruptedException {
        // logger.debug(event.toString());

        Events.postEvent("onCreate", this.secRolegroupWindow, event);
        secRolegroupWindow.invalidate();
    }

    // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    // ++++++++++++++++++++++++ GUI operations +++++++++++++++++++++++++
    // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    // +++++++++++++++++++++++++ crud operations +++++++++++++++++++++++
    // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    /**
     * This method saves the status of the checkboxed right-item.<br>
     * <br>
     * 1. we iterate over all items in the listbox <br>
     * 2. for each 'checked item' we must check if it is 'newly' checked <br>
     * 3. if newly than get a new object first and <b>save</b> it to DB. <br>
     * 4. for each 'unchecked item' we must check if it newly unchecked <br>
     * 5. if newly unchecked we must <b>delete</b> this item from DB. <br>
     * 
     * @throws InterruptedException
     */
    public void doSave() throws InterruptedException {

        List<Listitem> li = this.listBoxSecRolegroup.getItems();

        for (Listitem listitem : li) {

            Listcell lc = (Listcell) listitem.getFirstChild();
            Checkbox cb = (Checkbox) lc.getFirstChild();

            if (cb != null) {

                if (cb.isChecked() == true) {

                    // Get the group object by casting
                    SecGroup aGroup = (SecGroup) listitem.getAttribute("data");
                    // get the role
                    SecRole aRole = getSelectedRole();

                    // check if the item is newly checked. If so we cannot found
                    // it in the SecGroupRight-table
                    SecRolegroup aRoleGroup = getSecurityService().getRolegroupByRoleAndGroup(aRole, aGroup);

                    // if new, we make a newly Object
                    if (aRoleGroup == null) {
                        aRoleGroup = getSecurityService().getNewSecRolegroup();
                        aRoleGroup.setSecGroup(aGroup);
                        aRoleGroup.setSecRole(aRole);
                    }

                    try {
                        // save to DB
                        getSecurityService().saveOrUpdate(aRoleGroup);
                    } catch (DataAccessException e) {
                        ZksampleMessageUtils.showErrorMessage(e.getMostSpecificCause().toString());
                    }

                } else if (cb.isChecked() == false) {

                    // Get the group object by casting
                    SecGroup aGroup = (SecGroup) listitem.getAttribute("data");
                    // get the role
                    SecRole aRole = getSelectedRole();

                    // check if the item is newly unChecked. If so we must
                    // found it in the SecRolegroup-table
                    SecRolegroup aRoleGroup = getSecurityService().getRolegroupByRoleAndGroup(aRole, aGroup);

                    if (aRoleGroup != null) {
                        // delete from DB
                        getSecurityService().delete(aRoleGroup);
                    }
                }
            }
        }

    }

    public void onSelect$listBoxSecRole(Event event) throws Exception {

        // get the selected object
        Listitem item = this.listBoxSecRole.getSelectedItem();

        // Casting
        SecRole aRole = (SecRole) item.getAttribute("data");
        setSelectedRole(aRole);

        // ++ create the searchObject and init sorting ++//
        HibernateSearchObject<SecGroup> soSecRolegroup = new HibernateSearchObject<SecGroup>(SecGroup.class,
                getCountRowsSecRolegroup());
        soSecRolegroup.addSort("grpShortdescription", false);

        // Set the ListModel.
        getPlwSecGroups().init(soSecRolegroup, listBoxSecRolegroup, paging_ListBoxSecRolegroup);
    }

    // +++++++++++++++++++++++++++++++++++++++++++++++++ //
    // ++++++++++++++++ Setter/Getter ++++++++++++++++++ //
    // +++++++++++++++++++++++++++++++++++++++++++++++++ //

    public int getCountRowsSecRole() {
        return this.countRowsSecRole;
    }

    public void setCountRowsSecRole(int countRowsSecRole) {
        this.countRowsSecRole = countRowsSecRole;
    }

    public int getCountRowsSecRolegroup() {
        return this.countRowsSecRolegroup;
    }

    public void setCountRowsSecRolegroup(int countRowsSecRolegroup) {
        this.countRowsSecRolegroup = countRowsSecRolegroup;
    }

    public void setSelectedRole(SecRole role) {
        this.selectedRole = role;
    }

    public SecRole getSelectedRole() {
        return this.selectedRole;
    }

    public SecurityService getSecurityService() {
        return this.securityService;
    }

    public void setSecurityService(SecurityService securityService) {
        this.securityService = securityService;
    }

    public void setPlwSecRoles(PagedListWrapper<SecRole> plwSecRoles) {
        this.plwSecRoles = plwSecRoles;
    }

    public PagedListWrapper<SecRole> getPlwSecRoles() {
        return this.plwSecRoles;
    }

    public void setPlwSecGroups(PagedListWrapper<SecGroup> plwSecGroups) {
        this.plwSecGroups = plwSecGroups;
    }

    public PagedListWrapper<SecGroup> getPlwSecGroups() {
        return this.plwSecGroups;
    }

    /*
     * (non-Javadoc)
     * 
     * @see de.forsthaus.webui.util.SelectionCtrl#getSelected()
     */
    @Override
    public SecRole getSelected() {
        return getSelectedRole();
    }

}