org.efaps.esjp.admin.common.systemconfiguration.SystemConf_Base.java Source code

Java tutorial

Introduction

Here is the source code for org.efaps.esjp.admin.common.systemconfiguration.SystemConf_Base.java

Source

/*
 * Copyright 2003 - 2015 The eFaps Team
 *
 * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
 *
 * 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 org.efaps.esjp.admin.common.systemconfiguration;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;

import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
import org.efaps.admin.common.SystemConfiguration;
import org.efaps.admin.datamodel.ui.IUIValue;
import org.efaps.admin.event.Parameter;
import org.efaps.admin.event.Parameter.ParameterValues;
import org.efaps.admin.event.Return;
import org.efaps.admin.event.Return.ReturnValues;
import org.efaps.admin.program.esjp.EFapsApplication;
import org.efaps.admin.program.esjp.EFapsUUID;
import org.efaps.admin.ui.AbstractUserInterfaceObject.TargetMode;
import org.efaps.ci.CIAdminCommon;
import org.efaps.db.Context;
import org.efaps.db.Insert;
import org.efaps.db.Instance;
import org.efaps.db.MultiPrintQuery;
import org.efaps.db.PrintQuery;
import org.efaps.db.QueryBuilder;
import org.efaps.db.SelectBuilder;
import org.efaps.db.Update;
import org.efaps.esjp.common.AbstractCommon;
import org.efaps.esjp.common.uiform.Field;
import org.efaps.util.EFapsException;

/**
 * Contains some funtionalities related to SystemConfigurations.
 *
 * @author The eFaps Team
 */
@EFapsUUID("aa441e81-fd9f-4462-99c2-2d27bd37f137")
@EFapsApplication("eFaps-Kernel")
public abstract class SystemConf_Base extends AbstractCommon {

    /**
     * Add an ObjectAttribute for the Instance to the SystemConfiguration
     * specified by the given UUID.
     *
     * @param _sysConfUUID UUID of the related SystemConfiguration
     * @param _instance INstance the ObjectAttribute belongs to
     * @param _value value to add
     * @throws EFapsException on error
     */
    public void addObjectAttribute(final UUID _sysConfUUID, final Instance _instance, final String _value)
            throws EFapsException {
        final SystemConfiguration config = SystemConfiguration.get(_sysConfUUID);
        if (config != null) {
            if (config.getObjectAttributeValue(_instance) == null) {
                final Insert insert = new Insert(CIAdminCommon.SystemConfigurationObjectAttribute);
                insert.add(CIAdminCommon.SystemConfigurationObjectAttribute.AbstractLink, config.getId());
                insert.add(CIAdminCommon.SystemConfigurationObjectAttribute.Key, _instance.getOid());
                insert.add(CIAdminCommon.SystemConfigurationObjectAttribute.Value, _value);
                insert.execute();
                config.reload();
            }
        }
    }

    /**
     * Update object attribute.
     *
     * @param _parameter Parameter as passed by the eFaps API
     * @return new empty Return
     * @throws EFapsException on error
     */
    public Return updateObjectAttribute(final Parameter _parameter) throws EFapsException {
        final String systemConfigurationUUID = getProperty(_parameter, "SystemConfigurationUUID");
        if (systemConfigurationUUID != null) {
            final SystemConfiguration config = SystemConfiguration.get(UUID.fromString(systemConfigurationUUID));
            // check if must be still created
            if (config != null && config.getObjectAttributeValue(_parameter.getInstance()) == null
                    && "true".equalsIgnoreCase(getProperty(_parameter, "LazyCreate"))) {
                addObjectAttribute(UUID.fromString(systemConfigurationUUID), _parameter.getInstance(), "");
            }

            if (config != null && config.getObjectAttributeValue(_parameter.getInstance()) != null) {
                final String fieldName = getProperty(_parameter, "FieldName");
                final QueryBuilder queryBldr = new QueryBuilder(CIAdminCommon.SystemConfigurationObjectAttribute);
                queryBldr.addWhereAttrEqValue(CIAdminCommon.SystemConfigurationObjectAttribute.AbstractLink,
                        config.getId());
                queryBldr.addWhereAttrEqValue(CIAdminCommon.SystemConfigurationObjectAttribute.Key,
                        _parameter.getInstance().getOid());
                final MultiPrintQuery multi = queryBldr.getPrint();
                multi.addAttribute(CIAdminCommon.SystemConfigurationObjectAttribute.CompanyLink);
                multi.executeWithoutAccessCheck();

                Instance instance = null;
                // only one found
                if (multi.getInstanceList().size() == 1) {
                    multi.next();
                    instance = multi.getCurrentInstance();
                } else {
                    while (multi.next()) {
                        final Long companyId = multi
                                .<Long>getAttribute(CIAdminCommon.SystemConfigurationObjectAttribute.CompanyLink);
                        if (companyId == null || companyId != null && companyId == 0) {
                            instance = multi.getCurrentInstance();
                        } else if (companyId == Context.getThreadContext().getCompany().getId()) {
                            instance = multi.getCurrentInstance();
                            break;
                        }
                    }
                }
                if (instance != null) {
                    final Update update = new Update(instance);
                    update.add(CIAdminCommon.SystemConfigurationObjectAttribute.Value,
                            _parameter.getParameterValue(fieldName));
                    update.execute();
                }
                config.reload();
            }
        }
        return new Return();
    }

    /**
     * Drop down field value.
     *
     * @param _parameter Parameter as passed by the eFaps API
     * @return Return containing list map for dropdown
     * @throws EFapsException on error
     */
    public Return dropDownFieldValue(final Parameter _parameter) throws EFapsException {
        final Field field = new Field() {
            @Override
            public void updatePositionList(final Parameter _parameter, final List<DropDownPosition> _values)
                    throws EFapsException {
                super.updatePositionList(_parameter, _values);
                final IUIValue fieldValue = (IUIValue) _parameter.get(ParameterValues.UIOBJECT);
                for (final DropDownPosition dropPos : _values) {
                    if (fieldValue != null && fieldValue.getObject() != null
                            && fieldValue.getObject().equals(dropPos.getValue())) {
                        dropPos.setSelected(true);
                        break;
                    }
                }
                _values.add(0, new DropDownPosition("0", "--"));
            }
        };
        return field.getOptionListFieldValue(_parameter);
    }

    /**
     * Key auto complete.
     *
     * @param _parameter Parameter as passed by the eFaps API
     * @return Return containing list map for dropdown
     * @throws EFapsException on error
     */
    public Return autoComplete4Key(final Parameter _parameter) throws EFapsException {
        final String input = (String) _parameter.get(ParameterValues.OTHERS);
        final boolean isLink = "true".equalsIgnoreCase(getProperty(_parameter, "SysConfLink"));
        final List<Map<String, String>> list = new ArrayList<>();
        if (input != null && !input.isEmpty()) {
            final Map<String, String> map = new HashMap<>();
            map.put("eFapsAutoCompleteKEY", input);
            map.put("eFapsAutoCompleteVALUE", input);
            list.add(map);
        }
        final Return ret = new Return();

        final PrintQuery print = new PrintQuery(_parameter.getCallInstance());
        final SelectBuilder selUUID;
        final SelectBuilder selInst;
        if (_parameter.getCallInstance().getType().isCIType(CIAdminCommon.SystemConfiguration)) {
            selUUID = SelectBuilder.get().attribute(CIAdminCommon.SystemConfiguration.UUID);
            selInst = SelectBuilder.get().instance();
        } else {
            selUUID = SelectBuilder.get().linkto(CIAdminCommon.SystemConfigurationAttribute.AbstractLink)
                    .attribute(CIAdminCommon.SystemConfiguration.UUID);
            selInst = SelectBuilder.get().linkto(CIAdminCommon.SystemConfigurationAttribute.AbstractLink)
                    .instance();
        }
        print.addSelect(selUUID, selInst);
        print.execute();

        final String uuid = print.getSelect(selUUID);
        final Set<String> keys = new HashSet<>();
        final QueryBuilder queryBldr = new QueryBuilder(CIAdminCommon.SystemConfigurationAbstract);
        queryBldr.addWhereAttrEqValue(CIAdminCommon.SystemConfigurationAbstract.AbstractLink,
                print.<Instance>getSelect(selInst));
        final MultiPrintQuery multi = queryBldr.getPrint();
        multi.addAttribute(CIAdminCommon.SystemConfigurationAbstract.Key);
        multi.execute();
        while (multi.next()) {
            keys.add(multi.<String>getAttribute(CIAdminCommon.SystemConfigurationAbstract.Key));
        }

        final List<? extends ISysConfAttribute> attrs = isLink
                ? SysConfResourceConfig.getResourceConfig().getLinks(uuid)
                : SysConfResourceConfig.getResourceConfig().getAttributes(uuid);
        if (attrs != null) {
            Collections.sort(attrs, new Comparator<ISysConfAttribute>() {
                @Override
                public int compare(final ISysConfAttribute _arg0, final ISysConfAttribute _arg1) {
                    return _arg0.getKey().compareTo(_arg1.getKey());
                }
            });
            for (final ISysConfAttribute attr : attrs) {
                final Map<String, String> map = new HashMap<>();
                map.put("eFapsAutoCompleteKEY", attr.getKey());
                map.put("eFapsAutoCompleteVALUE", attr.getKey());
                list.add(map);
                if (attr instanceof IConcatenate && ((IConcatenate) attr).isConcatenate()) {
                    for (int i = 1; i < 100; i++) {
                        final String keyTmp = attr.getKey() + String.format("%02d", i);
                        final Map<String, String> map2 = new HashMap<>();
                        map2.put("eFapsAutoCompleteKEY", keyTmp);
                        map2.put("eFapsAutoCompleteVALUE", keyTmp);
                        list.add(map2);
                        if (!keys.contains(keyTmp)) {
                            break;
                        }
                    }
                }
            }
        }
        ret.put(ReturnValues.VALUES, list);
        return ret;
    }

    /**
     * Update field4 key.
     *
     * @param _parameter the _parameter
     * @return the return
     * @throws EFapsException on error
     */
    public Return updateFields4Key(final Parameter _parameter) throws EFapsException {
        final boolean isLink = "true".equalsIgnoreCase(getProperty(_parameter, "SysConfLink"));

        final PrintQuery print = new PrintQuery(_parameter.getCallInstance());
        final SelectBuilder sel;
        if (_parameter.getCallInstance().getType().isCIType(CIAdminCommon.SystemConfiguration)) {
            sel = SelectBuilder.get().attribute(CIAdminCommon.SystemConfiguration.UUID);
        } else {
            sel = SelectBuilder.get().linkto(CIAdminCommon.SystemConfigurationAttribute.AbstractLink)
                    .attribute(CIAdminCommon.SystemConfiguration.UUID);
        }
        print.addSelect(sel);
        print.execute();
        final String uuid = print.getSelect(sel);

        final String key = _parameter.getParameterValue("key");

        ISysConfAttribute attr = isLink ? SysConfResourceConfig.getResourceConfig().getLink(uuid, key)
                : SysConfResourceConfig.getResourceConfig().getAttribute(uuid, key);
        if (attr == null && StringUtils.isNumeric(key.substring(key.length() - 2, key.length()))) {
            attr = isLink
                    ? SysConfResourceConfig.getResourceConfig().getLink(uuid, key.substring(0, key.length() - 2))
                    : SysConfResourceConfig.getResourceConfig().getAttribute(uuid,
                            key.substring(0, key.length() - 2));
        }

        final Map<String, Object> map = new HashMap<>();
        final String fieldName = _parameter.getParameters().containsKey("value") ? "value" : "value4edit";
        final CharSequence node;
        if (attr == null) {
            node = StringEscapeUtils.escapeEcmaScript(
                    new PropertiesSysConfAttribute().getHtml(_parameter, null, fieldName).toString());
        } else {
            node = StringEscapeUtils.escapeEcmaScript(attr.getHtml(_parameter, null, fieldName).toString());
            if (attr instanceof AbstractSysConfAttribute_Base) {
                map.put("description", StringEscapeUtils
                        .escapeEcmaScript(((AbstractSysConfAttribute_Base<?, ?>) attr).getDescription()));
            }
        }

        final Return ret = new Return();
        final List<Map<String, Object>> values = new ArrayList<>();

        values.add(map);
        final StringBuilder js = new StringBuilder()
                .append("require(['dojo/query', 'dojo/dom-construct'], function (query, domConstruct) {")
                .append("var first = true;").append("query('[name=value],[tag=rem]').forEach(function (node) {")
                .append("if (first) {").append("first = false;").append("var newNode = '").append(node).append("';")
                .append("domConstruct.place(newNode, node, 'replace');").append("} else {")
                .append("domConstruct.destroy(node);").append("}").append("});").append("});");
        map.put("eFapsFieldUpdateJS", js.toString());
        ret.put(ReturnValues.VALUES, values);
        return ret;
    }

    /**
     * Value field value.
     *
     * @param _parameter the _parameter
     * @return the return
     * @throws EFapsException the e faps exception
     */
    public Return valueFieldValue(final Parameter _parameter) throws EFapsException {
        final Return ret = new Return();
        if (TargetMode.CREATE.equals(_parameter.get(ParameterValues.ACCESSMODE))
                || TargetMode.EDIT.equals(_parameter.get(ParameterValues.ACCESSMODE))) {

            if (_parameter.getInstance() != null && _parameter.getInstance().isValid()
                    && _parameter.getInstance().getType().isKindOf(CIAdminCommon.SystemConfigurationAbstract)) {
                final boolean isLink = "true".equalsIgnoreCase(getProperty(_parameter, "SysConfLink"));

                final PrintQuery print = new PrintQuery(_parameter.getInstance());
                final SelectBuilder sel = SelectBuilder.get()
                        .linkto(CIAdminCommon.SystemConfigurationAbstract.AbstractLink)
                        .attribute(CIAdminCommon.SystemConfiguration.UUID);
                print.addSelect(sel);
                print.addAttribute(CIAdminCommon.SystemConfigurationAbstract.Key);
                print.execute();
                final String uuid = print.getSelect(sel);
                final String key = print.getAttribute(CIAdminCommon.SystemConfigurationAbstract.Key);

                ISysConfAttribute attr = isLink ? SysConfResourceConfig.getResourceConfig().getLink(uuid, key)
                        : SysConfResourceConfig.getResourceConfig().getAttribute(uuid, key);
                if (attr == null && StringUtils.isNumeric(key.substring(key.length() - 2, key.length()))) {
                    attr = isLink
                            ? SysConfResourceConfig.getResourceConfig().getLink(uuid,
                                    key.substring(0, key.length() - 2))
                            : SysConfResourceConfig.getResourceConfig().getAttribute(uuid,
                                    key.substring(0, key.length() - 2));
                }
                final IUIValue uiValue = (IUIValue) _parameter.get(ParameterValues.UIOBJECT);
                if (attr != null) {
                    ret.put(ReturnValues.SNIPLETT,
                            attr.getHtml(_parameter, uiValue.getObject(), uiValue.getField().getName()).toString());
                } else {
                    ret.put(ReturnValues.SNIPLETT, new PropertiesSysConfAttribute()
                            .getHtml(_parameter, uiValue.getObject(), uiValue.getField().getName()).toString());
                }
            }
        }
        return ret;
    }

    /**
     * Sets the master password.
     *
     * @param _parameter Parameter as passed by the eFaps API
     * @return new empty Return
     * @throws EFapsException on error
     */
    public Return setMasterPassword(final Parameter _parameter) throws EFapsException {
        final String pwd = _parameter.getParameterValue("masterPassword");
        SystemConfiguration.getPBEConfig().setPassword(pwd);
        return new Return();
    }
}