⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 applicationmetadatahelper.java

📁 CRM源码This file describes some issues that should be implemented in future and how it should be imple
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
/*
 * Copyright 2006-2007 Queplix Corp.
 *
 * Licensed under the Queplix Public License, Version 1.1.1 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.queplix.com/solutions/commercial-open-source/queplix-public-license/
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.queplix.core.integrator;

import com.queplix.core.client.app.rpc.DisplayableException;
import com.queplix.core.client.app.vo.ContextMenuMeta;
import com.queplix.core.client.app.vo.EntityMeta;
import com.queplix.core.client.app.vo.FamgMeta;
import com.queplix.core.client.app.vo.FieldMeta;
import com.queplix.core.client.app.vo.FocusMeta;
import com.queplix.core.client.app.vo.FormButtonMeta;
import com.queplix.core.client.app.vo.FormHtmlElementMeta;
import com.queplix.core.client.app.vo.FormLayoutMeta;
import com.queplix.core.client.app.vo.FormLinkMeta;
import com.queplix.core.client.app.vo.FormMeta;
import com.queplix.core.client.app.vo.GridMeta;
import com.queplix.core.client.app.vo.InFormGridFieldMeta;
import com.queplix.core.client.app.vo.MenuItemMeta;
import com.queplix.core.client.app.vo.MetaData;
import com.queplix.core.client.app.vo.ProductMeta;
import com.queplix.core.client.app.vo.SubFocusMeta;
import com.queplix.core.client.app.vo.TabMeta;
import com.queplix.core.client.app.vo.UserProfile;
import com.queplix.core.client.app.vo.chart.ChartModel;
import com.queplix.core.client.app.vo.uisettings.DialogUISettings;
import com.queplix.core.client.app.vo.uisettings.GridUISettings;
import com.queplix.core.client.app.vo.util.InvariantDate;
import com.queplix.core.client.common.CollectionsHelper;
import com.queplix.core.error.GenericSystemException;
import com.queplix.core.integrator.entity.EntityOperationsHelper;
import com.queplix.core.integrator.entity.EntityViewHelper;
import com.queplix.core.integrator.security.AccessLevel;
import com.queplix.core.integrator.security.AccessRightsManager;
import com.queplix.core.integrator.security.CommonActionTypes;
import com.queplix.core.integrator.security.LogonSession;
import com.queplix.core.integrator.security.Permission;
import com.queplix.core.integrator.security.PermissionObjectType;
import com.queplix.core.integrator.security.PermissionSet;
import com.queplix.core.integrator.security.SecurityHelper;
import com.queplix.core.integrator.security.User;
import com.queplix.core.integrator.security.WebLoginManager;
import com.queplix.core.jxb.entity.ChainTable;
import com.queplix.core.jxb.entity.Chainref;
import com.queplix.core.jxb.entity.Entity;
import com.queplix.core.modules.config.ejb.ContextMenuConfigManagerLocal;
import com.queplix.core.modules.config.ejb.EntityViewConfigManagerLocal;
import com.queplix.core.modules.config.ejb.FocusConfigManagerLocal;
import com.queplix.core.modules.config.ejb.UserPropertyManagerLocal;
import com.queplix.core.modules.config.jxb.Button;
import com.queplix.core.modules.config.jxb.Col;
import com.queplix.core.modules.config.jxb.ContextMenu;
import com.queplix.core.modules.config.jxb.ExternalForm;
import com.queplix.core.modules.config.jxb.Focus;
import com.queplix.core.modules.config.jxb.Form;
import com.queplix.core.modules.config.jxb.Header;
import com.queplix.core.modules.config.jxb.HiddenControl;
import com.queplix.core.modules.config.jxb.Htmlelement;
import com.queplix.core.modules.config.jxb.Htmlelements;
import com.queplix.core.modules.config.jxb.Link;
import com.queplix.core.modules.config.jxb.LinkedDataset;
import com.queplix.core.modules.config.jxb.MenuItem;
import com.queplix.core.modules.config.jxb.Row;
import com.queplix.core.modules.config.jxb.SubFocus;
import com.queplix.core.modules.config.jxb.Tab;
import com.queplix.core.modules.config.jxb.types.PermissionsType;
import com.queplix.core.modules.config.utils.DialogSetting;
import com.queplix.core.modules.config.utils.EntityHelper;
import com.queplix.core.modules.config.utils.GridSetting;
import com.queplix.core.modules.eql.error.EQLException;
import com.queplix.core.modules.inbox.InboxHelper;
import com.queplix.core.utils.StringHelper;
import com.queplix.core.utils.dao.AbstractPropertyFactory;
import com.queplix.core.utils.log.AbstractLogger;
import com.queplix.core.utils.log.Log;

import javax.servlet.ServletContext;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.TimeZone;
import java.util.TreeMap;

/**
 * Class helps to retrieve metadata for application which is based on core 3.0.
 * @author Sergey Kozmin
 * @since 24 Nov 2006
 */
public class ApplicationMetadataHelper {
    private static final String FORM_AND_FIELD_DIV = ":";
    private static final String VERSION_PROP_FILE = "version.properties";

    private static final String MY_QUEWEB_FOCUS_NAME = "myqueweb";
    private static final String MY_QUEWEB_SUBFOCUS_NAME = "myqueweb";
    private static final String MY_QUEWEB_TAB_NAME = "myqueweb";
    private static final String DASHBOARD_TAB_NAME = "dashboard";

    private static final AbstractLogger logger = Log.getLog(ApplicationMetadataHelper.class);

    public static MetaData getMetaData(LogonSession ls, InvariantDate clientNow, ServletContext ctx)
            throws DisplayableException {
        User user = ls.getUser();
        ActionContext actx = IntegratorHelper.getActionContext(ctx);

        checkUserRoles(user, actx);

        FocusConfigManagerLocal focusManager = actx.getFocusConfigManager();
        Collection<Focus> focuses = focusManager.getLocalizedFocuses(user.getLangID());

        PermissionSet permissions = AccessRightsManager.getPermissionSetForUser(user);
        Map<String, DialogSetting> dialogSettings = getDialogSettings(ls, ctx);
        Map<String, GridSetting> gridSettings = getGridSttings(ls, ctx);
        List<FocusMeta> metaFocuses = new ArrayList<FocusMeta>();
        for(Focus focus : focuses) {
            Permission permissionForObject = permissions.getPermissionObject(PermissionObjectType.FOCUS, focus.getName());
            if(permissionForObject != null) {//if user has some of rights, it means user can read.
                metaFocuses.add(new FocusMeta(focus.getCaption(), focus.getIcon(), focus.getName(),
                getSubFocusMeta(focus, permissions, dialogSettings, gridSettings, ls, ctx)));
            }
        }

        MetaData metaData = new MetaData(metaFocuses.toArray(new FocusMeta[0]));
        metaData.setProductMeta(getProductMeta());

        metaData.setSessionTimeoutMinutes(WebLoginManager.getSessionTimeoutMinutes());
        metaData.setSessionTimeoutWarnBeforeMinutes(WebLoginManager.getSessionTimeoutWarnBeforeMinutes());

        String defaultFocus = user.getDefaultFocus();
        FocusMeta.Index defaultFocusIndex = metaData.getFocusIndex(defaultFocus);
        metaData.setDefaultFocusIndex(defaultFocusIndex);

        TimeZone userTimeZone = SecurityHelper.getJavaTimezone(user.getTimeZoneID());
        Calendar cldClientNow = Calendar.getInstance(userTimeZone);

        Calendar cldUserNow = Calendar.getInstance(userTimeZone);
        cldUserNow.set(clientNow.getYear() + 1900, clientNow.getMonth(), clientNow.getDate(),
                clientNow.getHours(), clientNow.getMinutes(), clientNow.getSeconds());

        long offsetDelta = cldUserNow.getTimeInMillis() - cldClientNow.getTimeInMillis();
        metaData.setTimeZoneOffset((int) offsetDelta);

        fillExternalFormIndexes(metaData, focuses);

        fillJoinableFormIndexes(metaData, ctx);

        fillLinkedFormIndexes(metaData);

        UserProfile up = new UserProfile();
        up.setUserID(user.getUserID());
        up.setFullName(user.getFullName());
        if (!StringHelper.isEmpty(user.getEmail())) {
            up.setEmail(user.getEmail());
        } else {
            String defaultSender = InboxHelper.getDefSender(ls);
            up.setEmail(defaultSender);
        }

        metaData.setUserProfile(up);

        createMyQueWebTab(metaData);
        createAdhocReportGridMeta(metaData, ls, ctx);
        createDashboardTab(metaData, ls, actx);

        fillInformGridControls(metaData, focuses, permissions);
        return metaData;
    }

    /**
     * Check user's permissions, and if she/he doesn't hold a role
     * it will throw the DisplayableException
     * @param user user
     * @param actx action context
     * @throws DisplayableException if user doesn't hold a role
     */
    private static void checkUserRoles(User user, ActionContext actx) throws DisplayableException {
        if(user.getRolesIDs().size() <= 0) {
            String locMessage = EntityOperationsHelper.
                    getLocalizedServerMessage("no_permission_to_login",
                    new Object[0], user.getLangID(), actx);
            throw new DisplayableException(locMessage);
        }
    }

    /**
     * Adds linking information to the dataset fields.
     * @param metaData built metadata
     * @param focuses focuses
     * @param permissions user permissions
     */
    private static void fillInformGridControls(MetaData metaData,
                                               Collection<Focus> focuses,
                                               PermissionSet permissions) {

        for(Focus focus : focuses) {
            SubFocus[] subfocuses = focus.getSubFocus();
            for(SubFocus subFocus : subfocuses) {
                Tab[] tabs = subFocus.getTab();
                for(Tab tab : tabs) {
                    Form[] forms = tab.getForm();
                    for(Form form : forms) {
                        LinkedDataset[] linkedDatasets = form.getLinkedDataset();
                        for(LinkedDataset linkedDataset : linkedDatasets) {
                            String linkedFormName = linkedDataset.getForm();
                            String datasetName = linkedDataset.getName();
                            fillUpDatasetParams(form, metaData, datasetName,
                                    linkedFormName, permissions);
                        }
                    }
                }
            }
        }
    }

    /**
     * Fill up dataset param with the given referencing linked form name
     * @param form form to be updated
     * @param metaData all forms metadata
     * @param datasetName dataset to be linked to linkedFormName
     * @param linkedFormName form to be linked.
     * @param permissions permission object
     */
    private static void fillUpDatasetParams(Form form, MetaData metaData,
                                            String datasetName,
                                            String linkedFormName,
                                            PermissionSet permissions) {
        try {
            String formId = form.getName();
            FamgMeta.Index formIndex = (FamgMeta.Index) metaData.getIndexByID(formId);

            if(formIndex == null) {//check if we have access to the form.
                return;
            }

            FamgMeta famgMeta = metaData.getFamgMeta(formIndex);
            FieldMeta datasetMeta = famgMeta.getForm().getEntityMeta().getField(datasetName);
            if(datasetMeta != null
                    && datasetMeta.getDataType() == FieldMeta.IN_FORM_GRID) {//for now ignore other types
                FamgMeta.Index linkedFormIndex = (FamgMeta.Index) metaData.getIndexByID(linkedFormName);
                FamgMeta linkedFormMeta = metaData.getFamgMeta(linkedFormIndex);

                Permission permissionForForm = permissions.getPermissionObject(
                        PermissionObjectType.FORM,
                        linkedFormName);
                if(permissionForForm != null) {
                    InFormGridFieldMeta informMeta = ((InFormGridFieldMeta) datasetMeta);
                    informMeta.setFilteringGridMeta(linkedFormMeta.getGrid());
                    informMeta.setFilteringFormMeta(linkedFormMeta.getForm());
                } else {//have no rights to this form. remove field from meta.
                    famgMeta.getForm().getEntityMeta().removeField(datasetName);
                }
            }
        } catch (ClassCastException e) {
            logger.WARN("Couldn't parse linked form name [" +
            linkedFormName + "]. Probably it's malformed form name.", e);
        }
    }

    private static Map<String, DialogSetting> getDialogSettings(LogonSession ls, ServletContext ctx) {
        Map<String, DialogSetting> ret = new HashMap<String, DialogSetting>();
        UserPropertyManagerLocal propsMgr = IntegratorHelper.getActionContext(ctx).getUserPropertyManager();
        Collection<DialogSetting> userSettings = propsMgr.loadDialogsUISettings(ls.getUser());
        for(DialogSetting userSetting : userSettings) {
            ret.put(getKey(userSetting.getFormId(), userSetting.getFieldId()), userSetting);
        }
        return ret;
    }

    private static Map<String, GridSetting> getGridSttings(LogonSession ls, ServletContext ctx) {
        Map<String, GridSetting> ret = new HashMap<String, GridSetting>();
        UserPropertyManagerLocal propsMgr = IntegratorHelper.getActionContext(ctx).getUserPropertyManager();
        Collection<GridSetting> userSettings = propsMgr.loadGridSettings(ls.getUser());
        for(GridSetting userSetting : userSettings) {
            ret.put(userSetting.getFormID(), userSetting);
        }
        return ret;
    }

    private static void fillJoinableFormIndexes(MetaData metaData, ServletContext ctx) {
        Map<String, Set<FamgMeta>> famgSet = new TreeMap<String, Set<FamgMeta>>();

        for(FocusMeta focusMeta : metaData.getFocuses()) {
            for(SubFocusMeta subFocusMeta : focusMeta.getSubFocuses()) {
                for(TabMeta tabMeta : subFocusMeta.getTabs()) {
                    for(FamgMeta famgMeta : tabMeta.getFamgs()) {
                        if(famgMeta.getFormID() != null) {
                            String entityName = famgMeta.getEntityName();
                            if(!famgSet.containsKey(entityName)) {
                                famgSet.put(entityName, new HashSet<FamgMeta>());
                            }

⌨️ 快捷键说明

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