📄 applicationmetadatahelper.java
字号:
/*
* 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 + -