org.web4thejob.module.SystemJobletImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.web4thejob.module.SystemJobletImpl.java

Source

/*
 * Copyright (c) 2012-2014 Veniamin Isaias.
 *
 * This file is part of web4thejob.
 *
 * Web4thejob is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or any later version.
 *
 * Web4thejob 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 Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with web4thejob.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.web4thejob.module;

import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.web4thejob.context.ContextUtil;
import org.web4thejob.orm.DatasourceProperties;
import org.web4thejob.orm.ORMUtil;
import org.web4thejob.orm.PanelDefinition;
import org.web4thejob.orm.Path;
import org.web4thejob.orm.parameter.*;
import org.web4thejob.orm.query.Condition;
import org.web4thejob.orm.query.Criterion;
import org.web4thejob.orm.query.OrderBy;
import org.web4thejob.orm.query.Query;
import org.web4thejob.orm.scheme.RenderElement;
import org.web4thejob.orm.scheme.RenderScheme;
import org.web4thejob.orm.scheme.RenderSchemeUtil;
import org.web4thejob.orm.scheme.SchemeType;
import org.web4thejob.security.*;
import org.web4thejob.setting.SettingEnum;
import org.web4thejob.util.L10nMessages;
import org.web4thejob.web.panel.*;

import java.io.IOException;
import java.util.*;

/**
 * @author Veniamin Isaias
 * @since 3.4.0
 */

@Component
public class SystemJobletImpl extends AbstractJoblet implements SystemJoblet {

    @Override
    protected String getPropertiesName() {
        return H4Module.class.getSimpleName() + ".properties";
    }

    @Override
    @SuppressWarnings("unchecked")
    public <E extends Exception> List<E> setup() {
        UserIdentity userIdentity = ContextUtil.getSecurityService().getAdministratorIdentity();

        Map<Panel, String> beanIds = new HashMap<Panel, String>();

        ListViewPanel panels = ContextUtil.getDefaultPanel(ListViewPanel.class);
        panels.setTargetType(PanelDefinition.class);
        panels.setSettingValue(SettingEnum.PANEL_NAME,
                ContextUtil.getMRS().getEntityMetadata(PanelDefinition.class).getFriendlyName());
        beanIds.put(panels, ORMUtil.persistPanel(panels));

        ListViewPanel roles = ContextUtil.getDefaultPanel(ListViewPanel.class);
        roles.setTargetType(RoleIdentity.class);
        roles.setSettingValue(SettingEnum.PANEL_NAME,
                ContextUtil.getMRS().getEntityMetadata(RoleIdentity.class).getFriendlyName());
        beanIds.put(roles, ORMUtil.persistPanel(roles));

        ListViewPanel users = ContextUtil.getDefaultPanel(ListViewPanel.class);
        users.setTargetType(UserIdentity.class);
        users.setSettingValue(SettingEnum.PANEL_NAME,
                ContextUtil.getMRS().getEntityMetadata(UserIdentity.class).getFriendlyName());
        beanIds.put(users, ORMUtil.persistPanel(users));

        ListViewPanel policies = ContextUtil.getDefaultPanel(ListViewPanel.class);
        policies.setTargetType(AuthorizationPolicy.class);
        policies.setSettingValue(SettingEnum.PANEL_NAME,
                ContextUtil.getMRS().getEntityMetadata(AuthorizationPolicy.class).getFriendlyName());
        beanIds.put(policies, ORMUtil.persistPanel(policies));

        //----------------------------------------------------------------------------------------------------------
        //Parameters
        //----------------------------------------------------------------------------------------------------------
        ListViewPanel entityViewParameters = ContextUtil.getDefaultPanel(ListViewPanel.class);
        entityViewParameters.setTargetType(EntityTypeEntityViewParameter.class);
        entityViewParameters.setSettingValue(SettingEnum.PANEL_NAME,
                ContextUtil.getMRS().getEntityMetadata(EntityTypeEntityViewParameter.class).getFriendlyName());
        beanIds.put(entityViewParameters, ORMUtil.persistPanel(entityViewParameters));

        ListViewPanel listViewParameters = ContextUtil.getDefaultPanel(ListViewPanel.class);
        listViewParameters.setTargetType(EntityTypeListViewParameter.class);
        listViewParameters.setSettingValue(SettingEnum.PANEL_NAME,
                ContextUtil.getMRS().getEntityMetadata(EntityTypeListViewParameter.class).getFriendlyName());
        beanIds.put(listViewParameters, ORMUtil.persistPanel(listViewParameters));

        ListViewPanel queryParameters = ContextUtil.getDefaultPanel(ListViewPanel.class);
        queryParameters.setTargetType(EntityTypeQueryParameter.class);
        queryParameters.setSettingValue(SettingEnum.PANEL_NAME,
                ContextUtil.getMRS().getEntityMetadata(EntityTypeQueryParameter.class).getFriendlyName());
        beanIds.put(queryParameters, ORMUtil.persistPanel(queryParameters));

        ListViewPanel charsetParameters = ContextUtil.getDefaultPanel(ListViewPanel.class);
        charsetParameters.setTargetType(PrinterCharsetParameter.class);
        charsetParameters.setSettingValue(SettingEnum.PANEL_NAME,
                ContextUtil.getMRS().getEntityMetadata(PrinterCharsetParameter.class).getFriendlyName());
        beanIds.put(charsetParameters, ORMUtil.persistPanel(charsetParameters));

        ListViewPanel imageRepoParameters = ContextUtil.getDefaultPanel(ListViewPanel.class);
        imageRepoParameters.setTargetType(LocationImagesRepoParameter.class);
        imageRepoParameters.setSettingValue(SettingEnum.PANEL_NAME,
                ContextUtil.getMRS().getEntityMetadata(LocationImagesRepoParameter.class).getFriendlyName());
        beanIds.put(imageRepoParameters, ORMUtil.persistPanel(imageRepoParameters));
        //----------------------------------------------------------------------------------------------------------

        ListViewPanel renderSchemes = ContextUtil.getDefaultPanel(ListViewPanel.class);
        renderSchemes.setTargetType(RenderScheme.class);
        renderSchemes.setSettingValue(SettingEnum.PANEL_NAME,
                ContextUtil.getMRS().getEntityMetadata(RenderScheme.class).getFriendlyName());
        beanIds.put(renderSchemes, ORMUtil.persistPanel(renderSchemes));

        ListViewPanel queries = ContextUtil.getDefaultPanel(ListViewPanel.class);
        queries.setTargetType(Query.class);
        queries.setSettingValue(SettingEnum.PANEL_NAME,
                ContextUtil.getMRS().getEntityMetadata(Query.class).getFriendlyName());
        beanIds.put(queries, ORMUtil.persistPanel(queries));

        ModuleInfoPanel moduleInfoPanel = ContextUtil.getDefaultPanel(ModuleInfoPanel.class);
        moduleInfoPanel.setSettingValue(SettingEnum.PANEL_NAME, moduleInfoPanel.toString());
        beanIds.put(moduleInfoPanel, ORMUtil.persistPanel(moduleInfoPanel));

        ListViewPanel members = ContextUtil.getDefaultPanel(ListViewPanel.class);
        members.setTargetType(RoleMembers.class);
        members.setMasterType(UserIdentity.class);
        members.setBindProperty(RoleMembers.FLD_USER);
        members.setSettingValue(SettingEnum.PANEL_NAME,
                ContextUtil.getMRS().getEntityMetadata(RoleMembers.class).getFriendlyName());
        RenderScheme scheme = RenderSchemeUtil.createDefaultRenderScheme(RoleMembers.class, SchemeType.LIST_SCHEME);
        scheme.setName(scheme.getName() + "\\user bound");
        scheme.getElements().clear();
        RenderElement renderElement = scheme.addElement(
                ContextUtil.getMRS().getPropertyPath(RoleMembers.class, new Path(RoleMembers.FLD_ROLE)));
        renderElement.setFriendlyName(ContextUtil.getMRS().getEntityMetadata(RoleIdentity.class).getFriendlyName());
        renderElement = scheme.addElement(ContextUtil.getMRS().getPropertyPath(RoleMembers.class,
                new String[] { RoleMembers.FLD_ROLE, RoleIdentity.FLD_AUTHORIZATION_POLICY }));
        renderElement.setFriendlyName(
                ContextUtil.getMRS().getEntityMetadata(AuthorizationPolicy.class).getFriendlyName());
        ContextUtil.getDWS().save(scheme);
        members.setSettingValue(SettingEnum.RENDER_SCHEME_FOR_VIEW, scheme.getName());

        ListViewPanel elements = ContextUtil.getDefaultPanel(ListViewPanel.class);
        elements.setTargetType(RenderElement.class);
        elements.setMasterType(RenderScheme.class);
        elements.setBindProperty(RenderElement.FLD_RENDER_SCHEME);
        elements.setSettingValue(SettingEnum.PANEL_NAME,
                ContextUtil.getMRS().getEntityMetadata(RenderElement.class).getFriendlyName());
        scheme = RenderSchemeUtil.createDefaultRenderScheme(RenderElement.class, SchemeType.LIST_SCHEME,
                new String[] { RenderElement.FLD_RENDER_SCHEME });
        scheme.setName(scheme.getName() + "\\scheme bound");
        ContextUtil.getDWS().save(scheme);
        elements.setSettingValue(SettingEnum.RENDER_SCHEME_FOR_VIEW, scheme.getName());

        ListViewPanel criteria = ContextUtil.getDefaultPanel(ListViewPanel.class);
        criteria.setTargetType(Criterion.class);
        criteria.setMasterType(Query.class);
        criteria.setBindProperty(Criterion.FLD_QUERY);
        criteria.setSettingValue(SettingEnum.PANEL_NAME,
                ContextUtil.getMRS().getEntityMetadata(Criterion.class).getFriendlyName());
        scheme = RenderSchemeUtil.createDefaultRenderScheme(Criterion.class, SchemeType.LIST_SCHEME,
                new String[] { Criterion.FLD_QUERY });
        scheme.setName(scheme.getName() + "\\query bound");
        ContextUtil.getDWS().save(scheme);
        criteria.setSettingValue(SettingEnum.RENDER_SCHEME_FOR_VIEW, scheme.getName());

        ListViewPanel orderings = ContextUtil.getDefaultPanel(ListViewPanel.class);
        orderings.setTargetType(OrderBy.class);
        orderings.setMasterType(Query.class);
        orderings.setBindProperty(OrderBy.FLD_QUERY);
        orderings.setSettingValue(SettingEnum.PANEL_NAME,
                ContextUtil.getMRS().getEntityMetadata(OrderBy.class).getFriendlyName());
        scheme = RenderSchemeUtil.createDefaultRenderScheme(OrderBy.class, SchemeType.LIST_SCHEME,
                new String[] { OrderBy.FLD_QUERY });
        scheme.setName(scheme.getName() + "\\query bound");
        ContextUtil.getDWS().save(scheme);
        orderings.setSettingValue(SettingEnum.RENDER_SCHEME_FOR_VIEW, scheme.getName());

        ContextUtil.getSessionContext().refresh();

        BorderedLayoutPanel userRoles = ContextUtil.getDefaultPanel(BorderedLayoutPanel.class);
        userRoles.setCenter(ContextUtil.getPanel(beanIds.get(users)));
        userRoles.setSouth(members);
        userRoles.setSettingValue(SettingEnum.NORTH_ENABLED, false);
        userRoles.setSettingValue(SettingEnum.EAST_ENABLED, false);
        userRoles.setSettingValue(SettingEnum.WEST_ENABLED, false);
        userRoles.setSettingValue(SettingEnum.CENTER_ENABLED, true);
        userRoles.setSettingValue(SettingEnum.SOUTH_ENABLED, true);
        userRoles.setSettingValue(SettingEnum.SOUTH_COLLAPSIBLE, true);
        userRoles.setSettingValue(SettingEnum.SOUTH_SPLITTABLE, true);
        userRoles.setSettingValue(SettingEnum.SOUTH_MERGE_COMMANDS, false);
        userRoles.setSettingValue(SettingEnum.SOUTH_HEIGHT, "50%");
        userRoles.setSettingValue(SettingEnum.PANEL_NAME, users.toString() + " & " + members.toString());
        userRoles.render();
        beanIds.put(userRoles, ORMUtil.persistPanel(userRoles));

        BorderedLayoutPanel schemeElements = ContextUtil.getDefaultPanel(BorderedLayoutPanel.class);
        schemeElements.setCenter(ContextUtil.getPanel(beanIds.get(renderSchemes)));
        schemeElements.setSouth(elements);
        schemeElements.setSettingValue(SettingEnum.NORTH_ENABLED, false);
        schemeElements.setSettingValue(SettingEnum.EAST_ENABLED, false);
        schemeElements.setSettingValue(SettingEnum.WEST_ENABLED, false);
        schemeElements.setSettingValue(SettingEnum.CENTER_ENABLED, true);
        schemeElements.setSettingValue(SettingEnum.SOUTH_ENABLED, true);
        schemeElements.setSettingValue(SettingEnum.SOUTH_COLLAPSIBLE, true);
        schemeElements.setSettingValue(SettingEnum.SOUTH_SPLITTABLE, true);
        schemeElements.setSettingValue(SettingEnum.SOUTH_MERGE_COMMANDS, false);
        schemeElements.setSettingValue(SettingEnum.SOUTH_HEIGHT, "50%");
        schemeElements.setSettingValue(SettingEnum.PANEL_NAME, renderSchemes.toString());
        schemeElements.render();
        beanIds.put(schemeElements, ORMUtil.persistPanel(schemeElements));

        BorderedLayoutPanel queriesElements = ContextUtil.getDefaultPanel(BorderedLayoutPanel.class);
        queriesElements.setCenter(ContextUtil.getPanel(beanIds.get(queries)));
        TabbedLayoutPanel tabbedLayoutPanel = ContextUtil.getDefaultPanel(TabbedLayoutPanel.class);
        tabbedLayoutPanel.setSettingValue(SettingEnum.DISABLE_DYNAMIC_TAB_TITLE, true);
        tabbedLayoutPanel.getSubpanels().add(criteria);
        tabbedLayoutPanel.getSubpanels().add(orderings);
        tabbedLayoutPanel.setSelectedIndex(0);
        queriesElements.setSouth(tabbedLayoutPanel);
        queriesElements.setSettingValue(SettingEnum.NORTH_ENABLED, false);
        queriesElements.setSettingValue(SettingEnum.EAST_ENABLED, false);
        queriesElements.setSettingValue(SettingEnum.WEST_ENABLED, false);
        queriesElements.setSettingValue(SettingEnum.CENTER_ENABLED, true);
        queriesElements.setSettingValue(SettingEnum.SOUTH_ENABLED, true);
        queriesElements.setSettingValue(SettingEnum.SOUTH_COLLAPSIBLE, true);
        queriesElements.setSettingValue(SettingEnum.SOUTH_SPLITTABLE, true);
        queriesElements.setSettingValue(SettingEnum.SOUTH_MERGE_COMMANDS, false);
        queriesElements.setSettingValue(SettingEnum.SOUTH_HEIGHT, "50%");
        queriesElements.setSettingValue(SettingEnum.PANEL_NAME, queries.toString());
        queriesElements.render();
        beanIds.put(queriesElements, ORMUtil.persistPanel(queriesElements));

        // The default desktop
        DesktopLayoutPanel desktop = ContextUtil.getBean(DesktopLayoutPanel.class);
        Panel dashboard = buildDashboard();
        beanIds.put(dashboard, ORMUtil.persistPanel(dashboard));
        desktop.addTab(dashboard);
        desktop.render();
        Query adminRoleQuery = ContextUtil.getEntityFactory().buildQuery(RoleIdentity.class);
        adminRoleQuery.addCriterion(new Path(RoleIdentity.FLD_CODE), Condition.EQ, RoleIdentity.ROLE_ADMINISTRATOR);
        beanIds.put(desktop, ORMUtil.persistPanel(desktop, "Administrator's default Desktop", null,
                (Identity) ContextUtil.getDRS().findUniqueByQuery(adminRoleQuery)));

        ContextUtil.getSessionContext().refresh();

        // ---------------------------------------------------------------------------------------------------
        // Authorization Menu
        // ---------------------------------------------------------------------------------------------------
        AuthorizationPolicyPanel policyPanel = ContextUtil.getDefaultPanel(AuthorizationPolicyPanel.class);
        policyPanel.render();
        MenuAuthorizationPanel menuAuthorizationPanel = policyPanel.getMenuAuthorizationPanel();
        Object rootItem = menuAuthorizationPanel.getRootItem();

        Object panelsMenu = menuAuthorizationPanel.renderAddedMenu(rootItem,
                L10nMessages.L10N_NAME_DEFAULT_PANELS_MENU.toString());
        menuAuthorizationPanel.renderAddedPanel(panelsMenu, ContextUtil.getPanel(beanIds.get(dashboard)));
        menuAuthorizationPanel.renderAddedPanel(panelsMenu, ContextUtil.getPanel(beanIds.get(panels)));
        menuAuthorizationPanel.renderAddedPanel(panelsMenu, ContextUtil.getPanel(beanIds.get(schemeElements)));
        menuAuthorizationPanel.renderAddedPanel(panelsMenu, ContextUtil.getPanel(beanIds.get(queriesElements)));
        menuAuthorizationPanel.renderAddedPanel(panelsMenu, ContextUtil.getPanel(beanIds.get(moduleInfoPanel)));

        Object securityMenu = menuAuthorizationPanel.renderAddedMenu(rootItem,
                L10nMessages.L10N_NAME_DEFAULT_SECURITY_MENU.toString());
        menuAuthorizationPanel.renderAddedPanel(securityMenu, ContextUtil.getPanel(beanIds.get(userRoles)));
        menuAuthorizationPanel.renderAddedPanel(securityMenu, ContextUtil.getPanel(beanIds.get(policies)));
        menuAuthorizationPanel.renderAddedPanel(securityMenu, ContextUtil.getPanel(beanIds.get(roles)));

        Object paramsMenu = menuAuthorizationPanel.renderAddedMenu(rootItem,
                L10nMessages.L10N_NAME_DEFAULT_PARAMETERS_MENU.toString());
        menuAuthorizationPanel.renderAddedPanel(paramsMenu,
                ContextUtil.getPanel(beanIds.get(entityViewParameters)));
        menuAuthorizationPanel.renderAddedPanel(paramsMenu, ContextUtil.getPanel(beanIds.get(listViewParameters)));
        menuAuthorizationPanel.renderAddedPanel(paramsMenu, ContextUtil.getPanel(beanIds.get(queryParameters)));
        menuAuthorizationPanel.renderAddedPanel(paramsMenu, ContextUtil.getPanel(beanIds.get(charsetParameters)));
        menuAuthorizationPanel.renderAddedPanel(paramsMenu, ContextUtil.getPanel(beanIds.get(imageRepoParameters)));

        AuthorizationPolicy authorizationPolicy = ContextUtil.getEntityFactory().buildAuthorizationPolicy();
        authorizationPolicy.setName(L10nMessages.L10N_NAME_DEFAULT_ADMINISTRATORS_MENU.toString());
        authorizationPolicy.setDefinition(policyPanel.getDefinition());
        ContextUtil.getDWS().save(authorizationPolicy);

        RoleIdentity role = userIdentity.getRoles().iterator().next().getRole();
        role.setAuthorizationPolicy(authorizationPolicy);
        ContextUtil.getDWS().save(role);

        //--------------------------------------------------------------------------------------------------------
        // ANYONE role and default query for sorting identities
        //--------------------------------------------------------------------------------------------------------
        role = ContextUtil.getEntityFactory().buildRoleIdentity();
        role.setCode("ANYONE");
        role.setIndex(1000);
        ContextUtil.getDWS().save(role);

        RoleMembers roleMembers = ContextUtil.getEntityFactory().buildRoleMembers();
        roleMembers.setRole(role);
        roleMembers.setUser(userIdentity);
        ContextUtil.getDWS().save(roleMembers);

        Query query = ContextUtil.getEntityFactory().buildQuery(Identity.class);
        query.setName("by code");
        query.setCached(true);
        query.addOrderBy(new Path(Identity.FLD_CODE));
        ContextUtil.getDWS().save(query);

        EntityTypeQueryParameter entityTypeQueryParameter = ContextUtil.getEntityFactory()
                .buildParameter(EntityTypeQueryParameter.class);
        entityTypeQueryParameter.setOwner(role);
        entityTypeQueryParameter.setKey(Identity.class.getCanonicalName());
        entityTypeQueryParameter.setValue(Long.valueOf(query.getId()).toString());
        ContextUtil.getDWS().save(entityTypeQueryParameter);

        return super.setup();
    }

    @Override
    public String getName() {
        return "System Joblet";
    }

    @Override
    public String getProjectUrl() {
        return "http://wiki.web4thejob.org/miscel/glossary/system_joblet";
    }

    @Override
    public int getOrdinal() {
        return 5;
    }

    @Override
    public List<Resource> getResources() {
        List<Resource> resources = new ArrayList<Resource>();

        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        try {
            for (Resource resource : resolver.getResources("classpath*:org/web4thejob/orm/**/*.hbm.xml")) {

                if (resource.getFilename().equals("AuxiliaryDatabaseObjects.hbm.xml"))
                    continue;

                resources.add(resource);
            }
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }

        return resources;
    }

    @Override
    public String getBasePackage() {
        return "org.web4thejob.orm";
    }

    @Override
    public boolean isInstalled() {

        Properties datasource = new Properties();
        try {
            datasource.load(new ClassPathResource(DatasourceProperties.PATH).getInputStream());
        } catch (IOException e) {
            return false;
        }

        return StringUtils.hasText(datasource.getProperty(DatasourceProperties.INSTALLED));
    }

    @Override
    public String[] getSchemas() {
        return new String[] { "w4tj" };
    }

    private BorderedLayoutPanel buildDashboard() {
        BorderedLayoutPanel dashboard = ContextUtil.getDefaultPanel(BorderedLayoutPanel.class);

        dashboard.setSettingValue(SettingEnum.PANEL_NAME, "My Dashboard");
        dashboard.setSettingValue(SettingEnum.NORTH_ENABLED, false);
        dashboard.setSettingValue(SettingEnum.NORTH_ENABLED, false);
        dashboard.setSettingValue(SettingEnum.SOUTH_ENABLED, false);
        dashboard.setSettingValue(SettingEnum.WEST_ENABLED, false);
        dashboard.setSettingValue(SettingEnum.EAST_WIDTH, "270px");

        FramePanel wiki = ContextUtil.getDefaultPanel(FramePanel.class);
        wiki.setSettingValue(SettingEnum.TARGET_URL, "http://web4thejob.sourceforge.net/dashboard/index.php");
        wiki.setSettingValue(SettingEnum.PANEL_NAME, "Wiki");
        dashboard.setCenter(wiki);

        FramePanel sidebar = ContextUtil.getDefaultPanel(FramePanel.class);
        sidebar.setSettingValue(SettingEnum.TARGET_URL, "http://web4thejob.sourceforge.net/dashboard/sidebar.php");
        sidebar.setSettingValue(SettingEnum.PANEL_NAME, "Sidebar");
        dashboard.setEast(sidebar);

        dashboard.render();
        return dashboard;
    }
}