BORVersionSaveAction.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.bor;

import com.fa.sesa.exception.Errors;
import com.fa.sesa.exception.SystemIllegalArgumentException;
import com.fa.sesa.threadlocal.LocalContext;
import com.mycim.framework.utils.beans.BeanUtils;
import com.mycim.framework.utils.beans.PropertyUtils;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.framework.utils.lang.collections.CollectionUtils;
import com.mycim.framework.utils.lang.time.DateUtils;
import com.mycim.valueobject.ObjectList;
import com.mycim.valueobject.bas.NamedObject;
import com.mycim.valueobject.bas.ObjectVersion;
import com.mycim.valueobject.consts.SessionNames;
import com.mycim.valueobject.prp.BOR;
import com.mycim.valueobject.prp.BORResource;
import com.mycim.valueobject.prp.BORVersion;
import com.mycim.webapp.Constants;
import com.mycim.webapp.actions.PrpSetupAction;
import com.mycim.webapp.forms.BorVersionInfoForm;
import com.mycim.webapp.forms.VersionForm;
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.List;

/**
 * 资源清单的版本管理相关
 *
 * @author
 */
public class BORVersionSaveAction extends PrpSetupAction {

    @Override
    public ActionForward init(ActionMapping mapping, ActionForm form, HttpServletRequest request,
                              HttpServletResponse response) {
        request.setAttribute(SessionNames.FACILITY_INFO_KEY, sysService.getFacility(LocalContext.getFacilityRrn()));

        VersionForm versionForm = (VersionForm) form;
        BOR bor = new BOR(versionForm.getInstanceId(), getNamedSpace(ObjectList.BOR_KEY, LocalContext.getFacilityRrn()),
                          ObjectList.BOR_KEY);
        bor.setObjectType(ObjectList.BOM_KEY);
        NamedObject namedObject = baseService.getNamedObject(bor);
        BeanUtils.copyProperties(namedObject, bor);
        List<ObjectVersion> versions = baseService.getObjectVersions(bor);

        if (CollectionUtils.isEmpty(versions)) {
            request.setAttribute("editaction", "/borversionsave.do");
            request.setAttribute("initaction", "/borSetup.do");
            return mapping.findForward("showVersions");
        }

        ObjectVersion currentVersion = versions.get(0);
        currentVersion.copyNamedObject(bor);
        BORVersion borVersion = new BORVersion(bor.getInstanceRrn(), currentVersion.getCurrentVersion());
        borVersion = prpService.getBORVersion(borVersion);
        PropertyUtils.copyProperties(versionForm, currentVersion);
        versionForm.setEcnFlag(getEcnFlag());
        versionForm.setTransId(Constants.MODIFY_KEY);
        versionForm.setVersionEditEnable(String.valueOf(checkVersionEditEnable(currentVersion)));
        versionForm.setObjectDeleteEnable(checkObjectDeleteEnabled(versions));
        request.setAttribute(SessionNames.BORVERSION_KEY, borVersion);
        return mapping.findForward(Constants.MODIFY_KEY);
    }

    /**
     * 添加,修改
     *
     * @param mapping
     * @param request
     * @param theform
     * @return
     */
    public ActionForward memberInitView(ActionMapping mapping, HttpServletRequest request, BorVersionInfoForm theform) {
        if (StringUtils.isEqual(theform.getTransId(), "create")) {

        } else if (StringUtils.isEqual(theform.getTransId(), "modify")) {
            Integer sequenceNumber = theform.getSequenceNumber();
            BOR bor = prpService.getBOR(LocalContext.getFacilityRrn(), theform.getInstanceId());
            BORVersion borVersion = new BORVersion(bor.getInstanceRrn(), Integer.valueOf(theform.getVersionId()));
            borVersion = prpService.getBORVersion(borVersion);

            BORResource borResource = prpService
                    .getBorResource(bor.getInstanceRrn(), Integer.valueOf(theform.getVersionId()),
                                    theform.getSequenceNumber());
            PropertyUtils.copyProperties(theform, borResource);
            theform.setExpirationDateStr(
                    DateUtils.formatDate(borResource.getExpirationDate(), DateUtils.DATE_FORMAT4DAY));
            theform.setInstanceId(bor.getInstanceId());
            theform.setObjectSubtype(bor.getObjectSubtype());
            theform.setVersionId(borVersion.getVersionId());
            theform.setNamedSpace(bor.getNamedSpace());
            theform.setTransId("modify");
            theform.setSequenceNumber(sequenceNumber);
            if (StringUtils.equals(borVersion.getVersionStatus(), "ACTIVE")) {
                theform.setVersionEditEnable("false");
            } else {
                theform.setVersionEditEnable("true");
            }
        }
        return mapping.findForward("members");
    }

    public ActionForward cancel(ActionMapping mapping, HttpServletRequest request, BorVersionInfoForm theform) {
        BOR bor = prpService.getBOR(LocalContext.getFacilityRrn(), theform.getInstanceId());
        PropertyUtils.copyProperties(theform, bor);
        List<BORVersion> versions = prpService.getBORVersions(bor);
        theform.setVersionEditEnable(String.valueOf(checkVersionEditEnable(versions)));
        theform.setObjectDeleteEnable(checkObjectDeleteEnabled(versions));
        theform.setTransId(Constants.MODIFY_KEY);
        return mapping.findForward(Constants.BACK_KEY);
    }

    public ActionForward submitResource(ActionMapping mapping, HttpServletRequest request, HttpServletResponse response,
                                        BorVersionInfoForm theform) {
        BOR bor = prpService.getBOR(LocalContext.getFacilityRrn(), theform.getInstanceId());
        BORVersion borVersion = new BORVersion(bor.getInstanceRrn(), Integer.valueOf(theform.getVersionId()));
        borVersion = prpService.getBORVersion(borVersion);
        List<BORResource> borResources = prpService.getBorResources(borVersion);
        if (borResources == null || borResources.size() <= 0) {
            theform.setChildResourceCount(String.valueOf(borVersion.getResources().size()));
            throw new SystemIllegalArgumentException(Errors.create().content("Please add Bor Resource!").build());
        }
        ecnService.activateEcn(borVersion.getEcnRrn(), LocalContext.getUserId());

        borVersion = prpService.getBORVersion(borVersion);

        borVersion.setResources(borResources);
        borVersion.copyNamedObject(bor);
        PropertyUtils.copyProperties(theform, borVersion);

        theform.setChildResourceCount(String.valueOf(borVersion.getResources().size()));
        theform.setVersionEditEnable(String.valueOf(checkVersionEditEnable(borVersion)));
        List<BORVersion> borVersions = prpService.getBORVersions(bor);
        theform.setObjectDeleteEnable(checkObjectDeleteEnabled(borVersions));

        request.setAttribute(SessionNames.BORVERSION_KEY, borVersion);
        theform.setTransId(Constants.MODIFY_KEY);
        return mapping.findForward(Constants.MODIFY_KEY);
    }

    public ActionForward showVersions(ActionMapping mapping, HttpServletRequest request, BorVersionInfoForm theform) {
        request.setAttribute(SessionNames.FACILITY_INFO_KEY, sysService.getFacility(LocalContext.getFacilityRrn()));

        BOR bor = prpService.getBOR(LocalContext.getFacilityRrn(), theform.getInstanceId());
        List<BORVersion> versions = prpService.getBORVersions(bor);
        request.setAttribute("version", versions);
        request.setAttribute("editaction", "/borversionsave.do");
        request.setAttribute("initaction", "/borSetup.do");
        request.setAttribute("versionedit", checkVersionEditEnable(versions) + "");
        request.setAttribute("objectform", "versionForm");
        return mapping.findForward(Constants.VERSION_KEY);
    }

    public ActionForward addVersionWithEcn(ActionMapping mapping, HttpServletRequest request,
                                           BorVersionInfoForm theform) {
        request.setAttribute(SessionNames.FACILITY_INFO_KEY, sysService.getFacility(LocalContext.getFacilityRrn()));

        BOR bor = prpService.getBOR(LocalContext.getFacilityRrn(), theform.getInstanceId());
        BORVersion borVersion;
        borVersion = new BORVersion();
        borVersion.copyNamedObject(bor);

        int newVersionId = bor.getCurrentVersion().intValue() + 1;

        borVersion.setVersionStatus("UNFROZEN");
        borVersion.setInstanceVersion(newVersionId);
        borVersion.setVersionId(Integer.toString(newVersionId));
        borVersion.setVersionDesc("Automatic schema generation");
        borVersion.setTransId(Constants.CREATE_KEY);
        borVersion.setTransPerformedby(LocalContext.getUserId());

        baseService.insertObjectVersionWithEcn(borVersion);

        borVersion = prpService.getBORVersion(borVersion);
        borVersion.copyNamedObject(bor);
        borVersion.setResources(prpService.getBorResources(borVersion));

        List<BORVersion> borVersions = prpService.getBORVersions(bor);
        bor.setVersions(borVersions);

        PropertyUtils.copyProperties(theform, borVersion);

        request.setAttribute(SessionNames.BORVERSION_KEY, borVersion);
        theform.setChildResourceCount(String.valueOf(borVersion.getResources().size()));
        theform.setVersionEditEnable(String.valueOf(checkVersionEditEnable(borVersion)));
        theform.setObjectDeleteEnable(checkObjectDeleteEnabled(borVersions));

        theform.setTransId(Constants.MODIFY_KEY);
        return mapping.findForward("showversion");

    }

    public ActionForward versionInfo(ActionMapping mapping, BorVersionInfoForm form, HttpServletRequest request,
                                     HttpServletResponse response) throws Exception {
        String rrn = request.getParameter("versionRrn");
        String version = request.getParameter("version");

        int ver = Integer.parseInt(version);
        long versionRrn = Long.parseLong(rrn);

        NamedObject namedObject = new NamedObject();
        namedObject.setInstanceRrn(versionRrn);
        namedObject = baseService.getNamedObject(namedObject);

        ObjectVersion pv = baseService.getObjectVersion(versionRrn, ver);
        pv.copyNamedObject(namedObject);

        request.setAttribute("historys",
                             baseService.getObjectVersionHistoryList(pv.getInstanceRrn(), pv.getInstanceVersion()));
        PropertyUtils.copyProperties(form, pv);

        form.setTransId(Constants.MODIFY_KEY);

        return (mapping.findForward("detail"));
    }

    public ActionForward deleteVersion(ActionMapping mapping, BorVersionInfoForm theform, HttpServletRequest request,
                                       HttpServletResponse response) throws Exception {
        BOR bor = prpService.getBOR(LocalContext.getFacilityRrn(), theform.getInstanceId());
        BORVersion borVersion = new BORVersion(bor.getInstanceRrn(), Integer.valueOf(theform.getVersionId()));
        borVersion.setTransId(Constants.DELETE_KEY);
        borVersion.setTransPerformedby(LocalContext.getUserId());
        prpService.deleteBORVersion(borVersion);
        //删除版本后重新初始化一次bor
        bor = prpService.getBOR(LocalContext.getFacilityRrn(), bor.getInstanceId());
        List<BORVersion> versions = prpService.getBORVersions(bor);
        borVersion = null;
        if (versions.isEmpty()) {
            borVersion = new BORVersion();
            borVersion.copyNamedObject(bor);

            int newVersionId = bor.getCurrentVersion().intValue() + 1;

            borVersion.setInstanceVersion(newVersionId);
            borVersion.setVersionId(Integer.toString(newVersionId));
            borVersion.setVersionDesc("Automatic schema generation");
            borVersion.setTransId(Constants.CREATE_KEY);
            borVersion.setVersionStatus("UNFROZEN");
            borVersion.setTransPerformedby(LocalContext.getUserId());

            baseService.insertObjectVersionWithEcn(borVersion);
            versions = prpService.getBORVersions(bor);
            ObjectVersion objectVersion = (ObjectVersion) versions.iterator().next();
            borVersion.setVersionStatus(objectVersion.getVersionStatus());
            borVersion.setObjectSubtype(ObjectList.ITEM_KEY);

            bor.setVersions(versions);
        } else {
            borVersion = new BORVersion();

            borVersion.copyObjectVersion(versions.get(0));

            borVersion.setResources(prpService.getBorResources(borVersion));
            borVersion.copyNamedObject(bor);

            if (ObjectList.BOE_KEY.equals(borVersion.getObjectType())) {
                borVersion.setObjectSubtype(ObjectList.ENTITYGROUP_KEY);
            } else {
                borVersion.setObjectSubtype(ObjectList.ITEM_KEY);
            }

            bor.setVersions(versions);
        }

        request.setAttribute(SessionNames.BORVERSION_KEY, borVersion);
        PropertyUtils.copyProperties(theform, borVersion);

        theform.setTransId(Constants.MODIFY_KEY);
        theform.setChildResourceCount(String.valueOf(borVersion.getResources().size()));
        theform.setVersionEditEnable(String.valueOf(checkVersionEditEnable(borVersion)));
        theform.setObjectDeleteEnable(checkObjectDeleteEnabled(versions));
        return mapping.findForward("showversion");
    }

    public ActionForward version(ActionMapping mapping, HttpServletRequest request, BorVersionInfoForm theform,
                                 HttpServletResponse response) {
        BOR bor = prpService.getBOR(LocalContext.getFacilityRrn(), theform.getInstanceId());
        BORVersion borVersion = new BORVersion(bor.getInstanceRrn(), Integer.valueOf(theform.getInstanceVersion()));
        borVersion = prpService.getBORVersion(borVersion);

        borVersion.setResources(prpService.getBorResources(borVersion));
        borVersion.copyNamedObject(bor);

        if (ObjectList.BOE_KEY.equals(borVersion.getObjectType())) {
            borVersion.setObjectSubtype(ObjectList.ENTITYGROUP_KEY);
        } else {
            borVersion.setObjectSubtype(ObjectList.ITEM_KEY);
        }

        request.setAttribute(SessionNames.BORVERSION_KEY, borVersion);
        PropertyUtils.copyProperties(theform, borVersion);

        theform.setChildResourceCount(String.valueOf(borVersion.getResources().size()));
        theform.setVersionEditEnable(String.valueOf(checkVersionEditEnable(borVersion)));
        theform.setObjectDeleteEnable(checkObjectDeleteEnabled(prpService.getBORVersions(bor)));

        theform.setTransId(Constants.MODIFY_KEY);

        return mapping.findForward("showversion");
    }

    /**
     * 修改版本信息(实际没啥用,加了一条事物历史而已)
     *
     * @param mapping
     * @param request
     * @param theform
     * @param response
     * @return
     */
    public ActionForward modifyBORVersion(ActionMapping mapping, HttpServletRequest request, BorVersionInfoForm theform,
                                          HttpServletResponse response) {
        BOR bor = prpService.getBOR(LocalContext.getFacilityRrn(), theform.getInstanceId());
        BORVersion borVersion = new BORVersion(bor.getInstanceRrn(), Integer.valueOf(theform.getVersionId()));
        borVersion = prpService.getBORVersion(borVersion);
        borVersion.setTransPerformedby(LocalContext.getUserId());
        prpService.updateBORVersion(borVersion);
        borVersion.setResources(prpService.getBorResources(borVersion));
        request.setAttribute(SessionNames.BORVERSION_KEY, borVersion);
        theform.setTransId(Constants.MODIFY_KEY);
        theform.setChildResourceCount(String.valueOf(borVersion.getResources().size()));
        theform.setVersionEditEnable(String.valueOf(checkVersionEditEnable(borVersion)));
        theform.setObjectDeleteEnable(checkObjectDeleteEnabled(bor.getVersions()));
        return mapping.findForward(Constants.MODIFY_KEY);
    }

    /**
     * 复制上一版本
     *
     * @param mapping
     * @param request
     * @param theform
     * @return
     */
    public ActionForward copyLastVersion(ActionMapping mapping, HttpServletRequest request,
                                         HttpServletResponse response, BorVersionInfoForm theform) {
        BOR bor = prpService.getBOR(LocalContext.getFacilityRrn(), theform.getInstanceId());

        prpService
                .copyLastBORVersionResourceInfoForCurrent(bor.getInstanceRrn(), bor.getCurrentVersion().intValue() - 1);
        List<BORVersion> versions = prpService.getBORVersions(bor);
        if (versions != null && versions.size() > 0) {
            bor.setVersions(versions);
            BORVersion borVersion = getBORVersionByVersions(bor, (ObjectVersion) versions.iterator().next());
            PropertyUtils.copyProperties(theform, borVersion);
            request.setAttribute(SessionNames.BORVERSION_KEY, borVersion);
            theform.setChildResourceCount(String.valueOf(borVersion.getResources().size()));
            theform.setTransId(Constants.MODIFY_KEY);
            return mapping.findForward(Constants.MODIFY_KEY);
        } else {
            return cancel(mapping, request, theform);
        }
    }

    private BORVersion getBORVersionByVersions(BOR bor, ObjectVersion objectVersion) {
        BORVersion borVersion = new BORVersion();
        borVersion.copyObjectVersion(objectVersion);
        borVersion = prpService.getBORVersion(borVersion);
        borVersion.copyNamedObject(bor);
        borVersion.setResources(prpService.getBorResources(borVersion));
        if (ObjectList.BOE_KEY.equals(borVersion.getObjectType())) {
            borVersion.setObjectSubtype(ObjectList.ENTITYGROUP_KEY);
        } else {
            borVersion.setObjectSubtype(ObjectList.ITEM_KEY);
        }
        return borVersion;
    }

    private String checkObjectDeleteEnabled(List<? extends ObjectVersion> versionObjects) {
        String checked = "true";
        if (CollectionUtils.isNotEmpty(versionObjects)) {
            // 判断所有版本中是否有激活的版本,有则不能删除,无则能删除
            for (Object version : versionObjects) {
                ObjectVersion versionObject = (ObjectVersion) version;
                if ((versionObject.getVersionStatus() != null) &&
                        versionObject.getVersionStatus().equalsIgnoreCase("ACTIVE")) {
                    checked = "false";
                    break;
                }
            }
        }
        return checked;
    }

}