ContextRuleSave.java

/*
 *        @ Copyright 2001 FA Software;
 *        All right reserved. No part of this program may be reproduced or
 *        transmitted in any form or by any means, electronic or
 *        mechanical, including photocopying, recording, or by any
 *        information storage or retrieval system without written
 *        permission from FA Software, except for inclusion of brief
 *        quotations in a review.
 */
package com.mycim.webapp.actions.contextrule;

import com.fa.sesa.exception.Assert;
import com.fa.sesa.exception.Errors;
import com.fa.sesa.threadlocal.LocalContext;
import com.mycim.framework.utils.beans.PropertyUtils;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.valueobject.MessageIdList;
import com.mycim.valueobject.ObjectList;
import com.mycim.valueobject.consts.SessionNames;
import com.mycim.valueobject.prp.Context;
import com.mycim.valueobject.prp.ContextRule;
import com.mycim.webapp.Constants;
import com.mycim.webapp.WebUtils;
import com.mycim.webapp.actions.CtxAction;
import com.mycim.webapp.forms.ContextInfoForm;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.ListIterator;

/**
 * 配置列表定义 规则页面
 *
 * @author yanbing.chen
 * @date 2019/8/20
 * @since 1.8
 **/
public class ContextRuleSave extends CtxAction {

    private static final int PAGE_SIZE = 100;

    private static final String UP = "up";

    private static final String DOWN = "down";

    private static final String YES = "YES";

    @Override
    public ActionForward init(ActionMapping mapping, ActionForm form, HttpServletRequest request,
                              HttpServletResponse response) throws Exception {

        ContextInfoForm theform = (ContextInfoForm) form;
        Context context = new Context(theform.getInstanceId(), theform.getNamedSpace(), ObjectList.CONTEXT_KEY);
        context = (Context) getInstance(context);

        context.setTransPerformedby(LocalContext.getUserId());

        // Copy value object properties to form bean.
        PropertyUtils.copyProperties(context, theform);
        context.setRules(this.getContextRules(context.getInstanceRrn()));

        theform.setTransId(Constants.MODIFY_KEY);

        request.setAttribute(SessionNames.CONTEXT_KEY, context);
        return mapping.findForward(Constants.RULES_KEY);
    }

    @Override
    public ActionForward cancel(ActionMapping mapping, ActionForm form, HttpServletRequest request,
                                HttpServletResponse response) throws Exception {
        ContextInfoForm theform = (ContextInfoForm) form;

        Context context = new Context(theform.getInstanceId(), theform.getNamedSpace(), ObjectList.CONTEXT_KEY);
        context = (Context) getInstance(context);

        List<ContextRule> ruleList = getContextRules(context.getInstanceRrn());
        context.setRules(ruleList);
        // Copy value object properties to form bean.
        PropertyUtils.copyProperties(theform, context);

        // if user click the Cancel button
        theform.setTransId(Constants.MODIFY_KEY);
        request.setAttribute(SessionNames.CONTEXT_KEY, context);
        return new ActionForward(mapping.getInput());
    }

    public ActionForward members(ActionMapping mapping, ContextInfoForm theform,
                                 HttpServletRequest request) throws Exception {
        Context context = new Context(theform.getInstanceId(), theform.getNamedSpace(), ObjectList.CONTEXT_KEY);
        context = (Context) getInstance(context);

        List<ContextRule> ruleList = getContextRules(context.getInstanceRrn());
        context.setRules(ruleList);

        String members = WebUtils.getParameter("members", request);
        String item = WebUtils.getParameter("item", request);
        ContextRule object;
        if (!StringUtils.isEmpty(item)) {
            int index = this.getTheIndex(ruleList, item);
            object = ruleList.get(index);
            if (StringUtils.equals(members, UP)) {
                if (index > 0) {
                    ruleList.set(index, ruleList.get(index - 1));
                    ruleList.set(index - 1, object);
                }
            } else if (StringUtils.equals(members, DOWN)) {
                if (index < (ruleList.size() - 1)) {
                    ruleList.set(index, ruleList.get(index + 1));
                    ruleList.set(index + 1, object);
                }
            }
            object.setSequenceNumber(Integer.parseInt(item));
        }

        context.setRules(ruleList);
        // 上下移动, 即时存储
        saveMoveRules(context);

        context.setRules(getContextRules(context.getInstanceRrn()));
        request.setAttribute(SessionNames.CONTEXT_KEY, context);
        return mapping.findForward(Constants.MODIFY_KEY);
    }

    public ActionForward create(ActionMapping mapping, ContextInfoForm theform,
                                HttpServletRequest request) throws Exception {
        Context context = new Context(theform.getInstanceId(), theform.getNamedSpace(), ObjectList.CONTEXT_KEY);
        context = (Context) getInstance(context);

        List<ContextRule> ruleList = getContextRules(context.getInstanceRrn());
        context.setRules(ruleList);

        // current page number
        String pagevalue = request.getParameter("pagevalue");

        // defautl page number is the 1st page.
        if (pagevalue == null) {
            pagevalue = "1";
        }

        int page = Integer.parseInt(pagevalue);

        // Copy value object properties to form bean.
        PropertyUtils.copyProperties(theform, context);
        // who operate this object?
        context.setTransPerformedby(LocalContext.getUserId());
        saveAllRules(context, request, page);
        addRule(context.getInstanceRrn());
        theform.setPages(new Integer(1));

        context.setRules(getContextRules(context.getInstanceRrn()));
        // reload the rules!
        theform.setTransId(Constants.MODIFY_KEY);

        request.setAttribute(SessionNames.CONTEXT_KEY, context);
        return mapping.findForward(Constants.MODIFY_KEY);
    }

    public ActionForward delete(ActionMapping mapping, ContextInfoForm theform,
                                HttpServletRequest request) throws Exception {
        Context context = new Context(theform.getInstanceId(), theform.getNamedSpace(), ObjectList.CONTEXT_KEY);
        context = (Context) getInstance(context);

        List<ContextRule> ruleList = getContextRules(context.getInstanceRrn());
        context.setRules(ruleList);

        // current page number
        String pagevalue = request.getParameter("pagevalue");

        // defautl page number is the 1st page.
        if (pagevalue == null) {
            pagevalue = "1";
        }

        int page = Integer.parseInt(pagevalue);

        // Copy value object properties to form bean.
        PropertyUtils.copyProperties(theform, context);
        // who operate this object?
        context.setTransPerformedby(LocalContext.getUserId());
        String itemvalue = request.getParameter(Constants.ITEM_KEY);

        Assert.isFalse(itemvalue == null,
                       Errors.create().key(MessageIdList.CONTEXT_WEB_PAGE_ERROR).content("网页错误").build());

        int sequenceNumber = Integer.valueOf(itemvalue).intValue();
        removeRule(context.getInstanceRrn(), sequenceNumber);
        context.setRules(this.getContextRules(context.getInstanceRrn()));

        context.setRules(getContextRules(context.getInstanceRrn()));

        // reload the rules!
        theform.setTransId(Constants.MODIFY_KEY);

        request.setAttribute(SessionNames.CONTEXT_KEY, context);
        return mapping.findForward(Constants.MODIFY_KEY);
    }

    public ActionForward modify(ActionMapping mapping, ContextInfoForm theform,
                                HttpServletRequest request) throws Exception {
        Context context = new Context(theform.getInstanceId(), theform.getNamedSpace(), ObjectList.CONTEXT_KEY);
        context = (Context) getInstance(context);

        List<ContextRule> ruleList = getContextRules(context.getInstanceRrn());
        context.setRules(ruleList);

        // current page number
        String pagevalue = request.getParameter("pagevalue");

        // defautl page number is the 1st page.
        if (pagevalue == null) {
            pagevalue = "1";
        }

        int page = Integer.parseInt(pagevalue);

        // Copy value object properties to form bean.
        PropertyUtils.copyProperties(theform, context);
        // who operate this object?
        context.setTransPerformedby(LocalContext.getUserId());

        theform.setPages(new Integer(page));
        this.processItemAction(request, theform);
        saveAllRules(context, request, page);

        context.setRules(getContextRules(context.getInstanceRrn()));
        theform.setTransId(Constants.MODIFY_KEY);

        request.setAttribute(SessionNames.CONTEXT_KEY, context);
        return new ActionForward(mapping.getInput());
    }

    private void saveMoveRules(Context context) {
        List<ContextRule> rules = (List<ContextRule>) context.getRules();

        List<ContextRule> datas = new ArrayList<>();
        for (int i = 0; i < rules.size(); i++) {
            ContextRule rule = rules.get(i);
            ContextRule data = new ContextRule();
            data.setSequenceNumber(i + 1);
            data.setContextRrn(context.getInstanceRrn());

            if (StringUtils.isNotEmpty(context.getContextField1())) {
                data.setContextCheckFlag1(conversionCheckBox(rule.getContextCheckFlag1()));
            }

            if (StringUtils.isNotEmpty(context.getContextField2())) {
                data.setContextCheckFlag2(conversionCheckBox(rule.getContextCheckFlag2()));
            }

            if (StringUtils.isNotEmpty(context.getContextField3())) {
                data.setContextCheckFlag3(conversionCheckBox(rule.getContextCheckFlag3()));
            }

            if (StringUtils.isNotEmpty(context.getContextField4())) {
                data.setContextCheckFlag4(conversionCheckBox(rule.getContextCheckFlag4()));
            }

            if (StringUtils.isNotEmpty(context.getContextField5())) {
                data.setContextCheckFlag5(conversionCheckBox(rule.getContextCheckFlag5()));
            }

            if (StringUtils.isNotEmpty(context.getContextField6())) {
                data.setContextCheckFlag6(conversionCheckBox(rule.getContextCheckFlag6()));
            }

            if (StringUtils.isNotEmpty(context.getContextField7())) {
                data.setContextCheckFlag7(conversionCheckBox(rule.getContextCheckFlag7()));
            }

            if (StringUtils.isNotEmpty(context.getContextField8())) {
                data.setContextCheckFlag8(conversionCheckBox(rule.getContextCheckFlag8()));
            }

            if (StringUtils.isNotEmpty(context.getContextField9())) {
                data.setContextCheckFlag9(conversionCheckBox(rule.getContextCheckFlag9()));
            }

            if (StringUtils.isNotEmpty(context.getContextField10())) {
                data.setContextCheckFlag10(conversionCheckBox(rule.getContextCheckFlag10()));
            }

            if (StringUtils.isNotEmpty(context.getContextField11())) {
                data.setContextCheckFlag11(conversionCheckBox(rule.getContextCheckFlag11()));
            }

            if (StringUtils.isNotEmpty(context.getContextField12())) {
                data.setContextCheckFlag12(conversionCheckBox(rule.getContextCheckFlag12()));
            }

            if (StringUtils.isNotEmpty(context.getContextField13())) {
                data.setContextCheckFlag13(conversionCheckBox(rule.getContextCheckFlag13()));
            }

            if (StringUtils.isNotEmpty(context.getContextField14())) {
                data.setContextCheckFlag14(conversionCheckBox(rule.getContextCheckFlag14()));
            }

            if (StringUtils.isNotEmpty(context.getContextField15())) {
                data.setContextCheckFlag15(conversionCheckBox(rule.getContextCheckFlag15()));
            }

            datas.add(data);
        }
        this.updateRules(datas);
    }

    private String conversionCheckBox(String s) {
        if (StringUtils.isEmpty(s)) {
            return "off";
        }

        if (StringUtils.equalsIgnoreCase(s, YES)) {
            return "on";
        } else {
            return "off";
        }
    }

    private void updateRules(List<ContextRule> rules) {
        ctxService.updateContextRules(rules);
    }

    private void addRule(long contextRrn) {
        ContextRule contextRule = new ContextRule();
        contextRule.setContextRrn(contextRrn);
        ctxService.insertContextRule(contextRule);
    }

    private void removeRule(long contextRrn, int sequenceNumber) {
        ctxService.deleteContextRule(contextRrn, sequenceNumber);
    }

    private int getTheIndex(List list, String menuId) {
        ListIterator it = list.listIterator();

        int index = 0;
        while (it.hasNext()) {
            ContextRule ContextRule = (ContextRule) it.next();
            String temp = String.valueOf(ContextRule.getSequenceNumber());
            if (StringUtils.equals(temp, menuId)) {
                return index;
            }
            index++;
        }

        return -1;
    }

    private void saveAllRules(Context context, HttpServletRequest request, int page) {

        String[] contextCheckFlag1 = request.getParameterValues("contextCheckFlag1");
        String[] contextCheckFlag2 = request.getParameterValues("contextCheckFlag2");
        String[] contextCheckFlag3 = request.getParameterValues("contextCheckFlag3");
        String[] contextCheckFlag4 = request.getParameterValues("contextCheckFlag4");
        String[] contextCheckFlag5 = request.getParameterValues("contextCheckFlag5");
        String[] contextCheckFlag6 = request.getParameterValues("contextCheckFlag6");
        String[] contextCheckFlag7 = request.getParameterValues("contextCheckFlag7");
        String[] contextCheckFlag8 = request.getParameterValues("contextCheckFlag8");
        String[] contextCheckFlag9 = request.getParameterValues("contextCheckFlag9");
        String[] contextCheckFlag10 = request.getParameterValues("contextCheckFlag10");
        String[] contextCheckFlag11 = request.getParameterValues("contextCheckFlag11");
        String[] contextCheckFlag12 = request.getParameterValues("contextCheckFlag12");
        String[] contextCheckFlag13 = request.getParameterValues("contextCheckFlag13");
        String[] contextCheckFlag14 = request.getParameterValues("contextCheckFlag14");
        String[] contextCheckFlag15 = request.getParameterValues("contextCheckFlag15");

        Collection modifyCollection = new ArrayList();
        int startSeq = ((page - 1) * PAGE_SIZE) + 1;
        int endIndex = context.getRules().size() - ((page - 1) * PAGE_SIZE);

        if (endIndex > PAGE_SIZE) {
            endIndex = PAGE_SIZE;
        }

        int i = 0;

        while (i < endIndex) {

            ContextRule temp = new ContextRule();
            temp.setContextRrn(context.getInstanceRrn());
            temp.setSequenceNumber(startSeq + i);

            if (StringUtils.isNotEmpty(context.getContextField1())) {
                temp.setContextCheckFlag1(contextCheckFlag1[i]);
            }

            if (StringUtils.isNotEmpty(context.getContextField2())) {
                temp.setContextCheckFlag2(contextCheckFlag2[i]);
            }

            if (StringUtils.isNotEmpty(context.getContextField3())) {
                temp.setContextCheckFlag3(contextCheckFlag3[i]);
            }

            if (StringUtils.isNotEmpty(context.getContextField4())) {
                temp.setContextCheckFlag4(contextCheckFlag4[i]);
            }

            if (StringUtils.isNotEmpty(context.getContextField5())) {
                temp.setContextCheckFlag5(contextCheckFlag5[i]);
            }

            if (StringUtils.isNotEmpty(context.getContextField6())) {
                temp.setContextCheckFlag6(contextCheckFlag6[i]);
            }

            if (StringUtils.isNotEmpty(context.getContextField7())) {
                temp.setContextCheckFlag7(contextCheckFlag7[i]);
            }

            if (StringUtils.isNotEmpty(context.getContextField8())) {
                temp.setContextCheckFlag8(contextCheckFlag8[i]);
            }

            if (StringUtils.isNotEmpty(context.getContextField9())) {
                temp.setContextCheckFlag9(contextCheckFlag9[i]);
            }

            if (StringUtils.isNotEmpty(context.getContextField10())) {
                temp.setContextCheckFlag10(contextCheckFlag10[i]);
            }

            if (StringUtils.isNotEmpty(context.getContextField11())) {
                temp.setContextCheckFlag11(contextCheckFlag11[i]);
            }

            if (StringUtils.isNotEmpty(context.getContextField12())) {
                temp.setContextCheckFlag12(contextCheckFlag12[i]);
            }

            if (StringUtils.isNotEmpty(context.getContextField13())) {
                temp.setContextCheckFlag13(contextCheckFlag13[i]);
            }

            if (StringUtils.isNotEmpty(context.getContextField14())) {
                temp.setContextCheckFlag14(contextCheckFlag14[i]);
            }

            if (StringUtils.isNotEmpty(context.getContextField15())) {
                temp.setContextCheckFlag15(contextCheckFlag15[i]);
            }

            modifyCollection.add(temp);
            i++;
        }

        this.updateRules((List<ContextRule>) modifyCollection);
    }

}