gov.anl.aps.cdb.portal.controllers.extensions.ItemMultiEditController.java Source code

Java tutorial

Introduction

Here is the source code for gov.anl.aps.cdb.portal.controllers.extensions.ItemMultiEditController.java

Source

/*
 * Copyright (c) UChicago Argonne, LLC. All rights reserved.
 * See LICENSE file.
 */
package gov.anl.aps.cdb.portal.controllers.extensions;

import gov.anl.aps.cdb.common.constants.ItemDefaultColumnReferences;
import gov.anl.aps.cdb.common.exceptions.CdbException;
import gov.anl.aps.cdb.common.utilities.StringUtility;
import gov.anl.aps.cdb.portal.controllers.ItemControllerExtensionHelper;
import gov.anl.aps.cdb.portal.controllers.LoginController;
import gov.anl.aps.cdb.portal.controllers.PropertyValueController;
import gov.anl.aps.cdb.portal.model.db.beans.ItemFacade;
import gov.anl.aps.cdb.portal.model.db.beans.PropertyValueFacade;
import gov.anl.aps.cdb.portal.model.db.entities.EntityInfo;
import gov.anl.aps.cdb.portal.model.db.entities.Item;
import gov.anl.aps.cdb.portal.model.db.entities.ItemElement;
import gov.anl.aps.cdb.portal.model.db.entities.ItemProject;
import gov.anl.aps.cdb.portal.model.db.entities.PropertyType;
import gov.anl.aps.cdb.portal.model.db.entities.PropertyValue;
import gov.anl.aps.cdb.portal.model.db.entities.UserGroup;
import gov.anl.aps.cdb.portal.model.db.entities.UserInfo;
import gov.anl.aps.cdb.portal.model.db.utilities.EntityInfoUtility;
import gov.anl.aps.cdb.portal.utilities.SessionUtility;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import javax.ejb.EJB;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.model.ListDataModel;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.primefaces.event.ReorderEvent;
import org.primefaces.model.menu.DefaultMenuItem;
import org.primefaces.model.menu.DefaultMenuModel;

/**
 *
 * @author djarosz
 */
public abstract class ItemMultiEditController extends ItemControllerExtensionHelper {

    private static final org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(Item.class.getName());

    @EJB
    protected PropertyValueFacade propertyValueFacade;

    @EJB
    protected ItemFacade itemFacade;

    protected abstract String getControllerNamedConstant();

    protected final String EDIT_MULTIPLE_REDIRECT = "editMultiple?faces-redirect=true";
    protected final String CREATE_MULTIPLE_REDIRECT = "createMultiple?faces-redirect=true";

    protected ListDataModel editableListDataModel;

    protected List<Item> selectedItemsToEdit;

    protected DefaultMenuModel editStepsMenuModel;
    protected DefaultMenuModel createStepsMenuModel;

    protected int activeIndex = 0;

    protected int createNewItemCount = 0;

    protected Item derivedFromItemForNewItems = null;

    protected EntityInfo newItemEntityInfo = null;

    protected boolean updateItemIdentifier1 = false;
    protected boolean updateItemIdentifier2 = false;
    protected boolean updateProject = false;
    protected boolean updateDescription = false;
    protected boolean updateQrId = false;
    protected boolean updateItemType = false;
    protected boolean updateItemCategory = false;

    protected boolean updateOwnerUser = false;
    protected boolean updateOwnerGroup = false;
    protected boolean updateGroupWriteable = false;

    protected MultiEditMode multiEditMode = null;
    protected List<ItemProject> newItemAssignDefaultProject = null;

    protected List<PropertyType> selectedPropertyTypesForEditing = null;

    protected Map<String, Map<Integer, MultiEditPropertyRecord>> multiEditPropertyRecordMap = null;

    protected MultiEditPropertyRecord currentMultiEditPropertyRecord = null;
    protected PropertyValue storedPropertyValueBeforeSingleEditInformation = null;

    protected ItemDefaultColumnReferences currentApplyValuesToColumn = null;
    protected String currentPrefixValueToColumn = null;
    protected String currentPostfixValueToColumn = null;
    protected Integer currentSequenceStartValueToColumn = null;
    protected List<Object> currentObjectListValueToColumn = null;
    protected String currentObjectListStringRep = null;
    protected Object currentObjectValueToColumn = null;
    protected PropertyValue currentMockPropertyValueApplyValuesToColumn = null;
    protected boolean isInputValueDialogOpen;

    protected boolean renderMultiCreateConfigurationDialog = false;

    private Set<ItemControllerExtensionHelper> subscribedResetForMultiEditControllerHelpers;

    public ItemMultiEditController() {
        super();
        subscribedResetForMultiEditControllerHelpers = new HashSet<>();
    }

    protected enum MultipleEditMenu {
        selection("Selection"), updateItems("Update Items");

        private String value;

        private MultipleEditMenu(String value) {
            this.value = value;
        }

        public final String getValue() {
            return value;
        }
    }

    protected enum MultipleCreateMenu {
        createConfig("Create Configuration"), updateNewItems("Update New Items");

        private String value;

        private MultipleCreateMenu(String value) {
            this.value = value;
        }

        public final String getValue() {
            return value;
        }
    }

    protected enum MultiEditMode {
        update(), create(), delete();

        private MultiEditMode() {
        }
    }

    public String getPageTitle() {
        return "Multiple Edit for " + getDisplayEntityTypeName() + "s.";
    }

    public DefaultMenuModel getEditStepsMenuModel() {
        if (editStepsMenuModel == null) {
            editStepsMenuModel = new DefaultMenuModel();

            for (MultipleEditMenu multiEditConstant : MultipleEditMenu.values()) {
                DefaultMenuItem menuItem = createMenuModelMenuItem(multiEditConstant.getValue(),
                        multiEditConstant.ordinal());

                if (multiEditConstant == MultipleEditMenu.selection) {
                    menuItem.setIcon("fa fa-check-circle-o");
                }
                if (multiEditConstant == MultipleEditMenu.updateItems) {
                    menuItem.setIcon("fa fa-pencil-square-o");
                }

                editStepsMenuModel.addElement(menuItem);
            }
        }

        return editStepsMenuModel;
    }

    public DefaultMenuModel getCreateStepsMenuModel() {
        if (createStepsMenuModel == null) {
            createStepsMenuModel = new DefaultMenuModel();

            for (MultipleCreateMenu multipleCreateConstant : MultipleCreateMenu.values()) {
                DefaultMenuItem menuItem = createMenuModelMenuItem(multipleCreateConstant.getValue(),
                        multipleCreateConstant.ordinal());

                if (multipleCreateConstant == MultipleCreateMenu.updateNewItems) {
                    menuItem.setIcon("fa fa-pencil-square-o");
                }
                createStepsMenuModel.addElement(menuItem);
            }
        }
        return createStepsMenuModel;
    }

    private DefaultMenuItem createMenuModelMenuItem(String constantValue, int ordinal) {
        DefaultMenuItem menuItem = new DefaultMenuItem(constantValue);
        menuItem.setCommand("#{" + getControllerNamedConstant() + ".setActiveIndex(" + ordinal + ")}");
        menuItem.setOnstart("PF('loadingDialog').show();");
        menuItem.setOncomplete("PF('loadingDialog').hide();");
        menuItem.setUpdate("@form");

        return menuItem;
    }

    public void performDeleteOperationsOnAllItems() {
        int beforeDeletionCount = selectedItemsToEdit.size();

        MultiEditMode ittrMode = MultiEditMode.delete;

        List<Integer> indexesToRemoveFromList = new ArrayList<>();

        for (int i = selectedItemsToEdit.size() - 1; i >= 0; i--) {
            Item item = selectedItemsToEdit.get(i);
            if (isItemExistInDb(item)) {
                try {
                    performDestroyOperations(item);
                    indexesToRemoveFromList.add(i);
                } catch (CdbException ex) {
                    processDatabaseOperationsException(ex, item, ittrMode);
                } catch (RuntimeException ex) {
                    processDatabaseOperationsException(ex, item, ittrMode);
                }
            } else {
                indexesToRemoveFromList.add(i);
            }
        }

        for (int indexToRemove : indexesToRemoveFromList) {
            selectedItemsToEdit.remove(indexToRemove);
        }

        // reset data model to select from
        editableListDataModel = null;

        List<Item> newSelectedItems = new ArrayList<>();
        // Update the references of selected items that are left over after deletion completion

        // TODO check if in multi-edit mode 
        for (Item oldSelectedItemToEdit : selectedItemsToEdit) {
            Iterator<Item> editableListIterator = getEditableListDataModel().iterator();
            Item item = null;
            while (editableListIterator.hasNext() && item == null) {
                Item newItem = editableListIterator.next();
                if (newItem.equals(oldSelectedItemToEdit)) {
                    newItem.setPersitanceErrorMessage(oldSelectedItemToEdit.getPersitanceErrorMessage());
                    item = newItem;
                }
            }
            if (item != null) {
                newSelectedItems.add(item);
            } else {
                newSelectedItems.add(oldSelectedItemToEdit);
            }
        }

        selectedItemsToEdit = newSelectedItems;

        int successDeleteCounter = indexesToRemoveFromList.size();
        if (successDeleteCounter == beforeDeletionCount) {
            String message = "";
            message += successDeleteCounter + " items were deleted. ";

            SessionUtility.addInfoMessage("Success", message);
        } else {
            SessionUtility.addWarningMessage("Warning", "Some Items were not deleted: " + successDeleteCounter
                    + " out of " + beforeDeletionCount + " items were deleted");
        }
    }

    public boolean performSaveOperationsOnItem(Item item) {
        MultiEditMode ittrMode = null;

        try {
            if (isItemExistInDb(item)) {
                ittrMode = MultiEditMode.update;
                performUpdateOperations(item);
                return true;
            } else {
                ittrMode = MultiEditMode.create;
                performCreateOperations(item);
                // Get refetched item with everything initalized. 
                item = getCurrent();
                return true;
            }
        } catch (CdbException ex) {
            processDatabaseOperationsException(ex, item, ittrMode);
        } catch (RuntimeException ex) {
            processDatabaseOperationsException(ex, item, ittrMode);
        }
        return false;
    }

    public void performSaveOperationsOnItems() {
        int successUpdateCounter = 0;
        int successCreateCounter = 0;

        for (Item item : selectedItemsToEdit) {
            if (isItemExistInDb(item)) {
                if (performSaveOperationsOnItem(item)) {
                    successUpdateCounter++;
                }
            } else if (performSaveOperationsOnItem(item)) {
                successCreateCounter++;
            }
        }

        // Summary message
        int totalSaved = successCreateCounter + successUpdateCounter;

        if (totalSaved == selectedItemsToEdit.size()) {
            String message = "";
            if (successCreateCounter != 0) {
                message += successCreateCounter + " items were created. ";
            }
            if (successUpdateCounter != 0) {
                message += successUpdateCounter + " items were updated. ";
            }
            SessionUtility.addInfoMessage("Success", message);
        } else {
            SessionUtility.addWarningMessage("Warning", "Some Items were not saved: " + totalSaved + " out of "
                    + selectedItemsToEdit.size() + " items were saved");
        }
    }

    private void processDatabaseOperationsException(Exception ex, Item item, MultiEditMode mode) {
        String actionWord = "";
        if (mode == MultiEditMode.create) {
            actionWord = "create";
        } else if (mode == MultiEditMode.update) {
            actionWord = "update";
        } else if (mode == MultiEditMode.delete) {
            actionWord = "delete";
        }
        String exceptionMessage;
        if (ex instanceof RuntimeException) {
            Throwable t = ExceptionUtils.getRootCause(ex);
            if (t != null) {
                exceptionMessage = t.getMessage();
            } else {
                exceptionMessage = ex.getMessage();
            }
        } else {
            exceptionMessage = ex.getMessage();
        }

        logger.error("Error performing a " + actionWord + " on item: " + ex);
        addCdbEntityWarningSystemLog("Failed to " + actionWord, ex, item);
        SessionUtility.addErrorMessage("Error",
                "Could not " + actionWord + ": " + item.toString() + " - " + exceptionMessage);
    }

    public void removeSelection(Item item) {
        int index = getSelectedItemIndex(item);
        selectedItemsToEdit.remove(index);
    }

    public String prepareEditMultipleItems() {
        resetMultiEditVariables();
        multiEditMode = MultiEditMode.update;
        return EDIT_MULTIPLE_REDIRECT;
    }

    public String prepareCreateMultipleItems() {
        resetMultiEditVariables();
        multiEditMode = MultiEditMode.create;
        return CREATE_MULTIPLE_REDIRECT;
    }

    public void prepareCreateMultipleItemsFromDialog(Item derivedFromNewItems) {
        prepareCreateMultipleItemsFromDialog();
        this.derivedFromItemForNewItems = derivedFromNewItems;
    }

    public void prepareCreateMultipleItemsFromDialog() {
        prepareCreateMultipleItems();
        renderMultiCreateConfigurationDialog = true;
    }

    public void continueToCreateMultipleItemsFromDialog() {
        setActiveIndex(MultipleCreateMenu.updateNewItems.ordinal());
        String desiredPath = getEntityApplicationViewPath() + "/" + CREATE_MULTIPLE_REDIRECT;
        SessionUtility.navigateTo(desiredPath);
        renderMultiCreateConfigurationDialog = false;
    }

    public void editAllItemsDerivedFromItem(Item item) {
        resetMultiEditVariables();
        setActiveIndex(MultipleEditMenu.updateItems.ordinal());
        multiEditMode = MultiEditMode.update;

        LoginController loginController = LoginController.getInstance();
        List<Item> derivedFromItemList = item.getDerivedFromItemList();
        selectedItemsToEdit = new ArrayList<>();
        for (Item derivedItem : derivedFromItemList) {
            if (loginController.isEntityWriteable(derivedItem.getEntityInfo())) {
                selectedItemsToEdit.add(derivedItem);
            }
        }

        String desiredPath = getEntityApplicationViewPath() + "/" + EDIT_MULTIPLE_REDIRECT;
        SessionUtility.navigateTo(desiredPath);
    }

    protected void resetMultiEditVariables() {
        multiEditMode = null;
        selectedItemsToEdit = new ArrayList<>();
        selectedPropertyTypesForEditing = new ArrayList<>();
        editableListDataModel = null;
        activeIndex = 0;
        createNewItemCount = 0;
        derivedFromItemForNewItems = null;
        newItemEntityInfo = null;
        currentMultiEditPropertyRecord = null;
        storedPropertyValueBeforeSingleEditInformation = null;
        newItemAssignDefaultProject = null;
        isInputValueDialogOpen = false;
        renderMultiCreateConfigurationDialog = false;

        for (ItemControllerExtensionHelper helper : subscribedResetForMultiEditControllerHelpers) {
            helper.resetExtensionVariablesForMultiEdit();
        }
    }

    public void subscribeResetForMultiEdit(ItemControllerExtensionHelper helper) {
        subscribedResetForMultiEditControllerHelpers.add(helper);
    }

    public int getMinNewItemsToCreate() {
        return selectedItemsToEdit.size();
    }

    public ListDataModel getEditableListDataModel() {
        if (editableListDataModel == null) {

            LoginController loginController = LoginController.getInstance();
            if (loginController.isLoggedInAsAdmin()) {
                editableListDataModel = new ListDataModel(getItemList());
            } else {
                UserInfo userInfo = (UserInfo) SessionUtility.getUser();
                editableListDataModel = new ListDataModel(
                        getItemDbFacade().findItemsWithPermissionsOfDomain(userInfo.getId(), getDomainId()));
            }
        }
        return editableListDataModel;
    }

    public void updateSingleItem(Item item) {
        setCurrent(item);
        update();
    }

    public void createSingleItem(Item item) {
        setCurrent(item);
        create();
    }

    @Override
    public void savePropertyList() {
        PropertyValue current = PropertyValueController.getInstance().getCurrent();
        if (current != null) {
            Item item = null;

            List<ItemElement> itemElementList = current.getItemElementList();
            if (itemElementList != null) {
                if (itemElementList.size() > 0) {
                    item = itemElementList.get(0).getParentItem();
                    setCurrent(item);
                } else {
                    return;
                }
            }
            if (item != null) {
                super.savePropertyList();
            }
        }
    }

    public void addPropertyTypeToRestItems(PropertyType propertyType) {
        for (Item selectedItem : selectedItemsToEdit) {
            MultiEditPropertyRecord multiEditPropertyRecordForItem = getMultiEditPropertyRecordForItem(propertyType,
                    selectedItem);
            if (multiEditPropertyRecordForItem.getPropertyValue() == null) {
                addPropertyValueForItem(multiEditPropertyRecordForItem);
            }
        }
    }

    public MultiEditPropertyRecord getMultiEditPropertyRecordForItem(PropertyType propertyType, Item item) {
        if (item != null && propertyType != null) {
            if (multiEditPropertyRecordMap == null) {
                multiEditPropertyRecordMap = new HashMap<String, Map<Integer, MultiEditPropertyRecord>>();
            }

            MultiEditPropertyRecord multiEditPropertyRecord = null;

            Map itemPropertyMap = null;
            if (!multiEditPropertyRecordMap.containsKey(item.getViewUUID())) {
                multiEditPropertyRecordMap.put(item.getViewUUID(), new HashMap<>());
            }

            itemPropertyMap = multiEditPropertyRecordMap.get(item.getViewUUID());

            if (itemPropertyMap.containsKey(propertyType.getId())) {
                multiEditPropertyRecord = (MultiEditPropertyRecord) itemPropertyMap.get(propertyType.getId());
            } else {
                multiEditPropertyRecord = new MultiEditPropertyRecord(propertyType, item);
                itemPropertyMap.put(propertyType.getId(), multiEditPropertyRecord);
            }
            return multiEditPropertyRecord;
        }
        return null;
    }

    public void addPropertyValueForItem(MultiEditPropertyRecord multiEditPropertyRecord) {
        Item item = multiEditPropertyRecord.getItem();
        if (item.getPropertyValueList() == null) {
            item.setPropertyValueList(new ArrayList<>());
        }
        setCurrent(item);
        preparePropertyTypeValueAdd(multiEditPropertyRecord.getPropertyType());
        multiEditPropertyRecord.resetRelatedPropertyValueList();
    }

    public void prepareEditSingleProperty(MultiEditPropertyRecord multiEditPropertyRecord) {
        PropertyValue propertyValue = multiEditPropertyRecord.getPropertyValue();
        storedPropertyValueBeforeSingleEditInformation = new PropertyValue();
        overridePropertyValues(propertyValue, storedPropertyValueBeforeSingleEditInformation);
        setCurrentMultiEditPropertyRecord(multiEditPropertyRecord);
    }

    @Override
    public void deleteCurrentEditPropertyValue() {
        Item item = currentMultiEditPropertyRecord.getItem();
        PropertyValue propertyValue = currentMultiEditPropertyRecord.getPropertyValue();
        item.getPropertyValueList().remove(propertyValue);

        currentMultiEditPropertyRecord.resetRelatedPropertyValueList();
        currentMultiEditPropertyRecord = null;
    }

    @Override
    public void updateEditProperty() {
        // Perform nothing... When user decides to updated all items, changes will be saved. 
        currentMultiEditPropertyRecord = null;
    }

    @Override
    public void restoreCurrentEditPropertyValueToOriginalState() {
        if (currentMultiEditPropertyRecord != null) {
            PropertyValue propertyValue = currentMultiEditPropertyRecord.getPropertyValue();
            overridePropertyValues(storedPropertyValueBeforeSingleEditInformation, propertyValue);
        }
        currentMultiEditPropertyRecord = null;
    }

    protected void overridePropertyValues(PropertyValue source, PropertyValue destination) {
        destination.setValue(source.getValue());
        destination.setTargetValue("");
        destination.setDisplayValue("");
        destination.setTag(source.getTag());
        destination.setDescription(source.getDescription());
        destination.setUnits(source.getUnits());
        destination.setIsDynamic(source.getIsDynamic());
        destination.setIsUserWriteable(source.getIsUserWriteable());
    }

    @Override
    public Item createItemEntity() {
        Item item = super.createItemEntity();
        EntityInfo entityInfo = item.getEntityInfo();
        entityInfo.setOwnerUser(newItemEntityInfo.getOwnerUser());
        entityInfo.setOwnerUserGroup(newItemEntityInfo.getOwnerUserGroup());
        entityInfo.setIsGroupWriteable(newItemEntityInfo.getIsGroupWriteable());
        item.setEntityInfo(entityInfo);
        item.setItemProjectList(newItemAssignDefaultProject);
        item.setDerivedFromItem(derivedFromItemForNewItems);
        return item;
    }

    public void revertItemBackToOriginalState(Item item) {
        int itemIndex = getSelectedItemIndex(item);

        // Remove cached information for item 
        if (multiEditPropertyRecordMap != null) {
            if (multiEditPropertyRecordMap.containsKey(item.getViewUUID())) {
                multiEditPropertyRecordMap.remove(item.getViewUUID());
            }
        }

        Integer itemId = item.getId();
        if (itemId != null) {
            item = itemFacade.findById(itemId);
        } else {
            item = createItemEntity();
        }

        selectedItemsToEdit.remove(itemIndex);
        selectedItemsToEdit.add(itemIndex, item);
    }

    private int getSelectedItemIndex(Item item) {
        int itemIndex = -1;
        for (int i = 0; i < selectedItemsToEdit.size(); i++) {
            Item ittrItem = selectedItemsToEdit.get(i);
            // equals method is not valid when editing many items. Memory based equals is more accurate. 
            if (ittrItem == item) {
                itemIndex = i;
                break;
            }
        }
        return itemIndex;
    }

    public void resetAllItemsBackToOriginalState() {
        for (int i = 0; i < selectedItemsToEdit.size(); i++) {
            revertItemBackToOriginalState(selectedItemsToEdit.get(i));
        }
    }

    public boolean getRenderPreviousButton() {
        return activeIndex > 0;
    }

    public boolean getRenderNextButton() {
        if (MultiEditMode.update == multiEditMode) {
            return activeIndex < MultipleEditMenu.values().length - 1;
        } else if (MultiEditMode.create == multiEditMode) {
            return activeIndex < MultipleCreateMenu.values().length - 1;
        }

        return false;
    }

    public Boolean getRenderSaveAllButton() {
        if (MultiEditMode.update == multiEditMode) {
            return activeIndex == MultipleEditMenu.values().length - 1 && selectedItemsToEdit.size() > 0;
        } else if (MultiEditMode.create == multiEditMode) {
            return activeIndex == MultipleCreateMenu.values().length - 1 && selectedItemsToEdit.size() > 0;
        }
        return false;
    }

    public void setActiveIndex(int activeIndex) {
        if (multiEditMode == MultiEditMode.create) {
            if (activeIndex == MultipleCreateMenu.updateNewItems.ordinal()) {
                if (!prepareSwitchToUpdateNewItemsActiveIndex()) {
                    return;
                }
            }
        }

        this.activeIndex = activeIndex;
    }

    /**
     * Performs checks and preparations to proceed to switch to update new
     * items.
     *
     * @return true to proceed with the switch
     */
    protected boolean prepareSwitchToUpdateNewItemsActiveIndex() {
        if (!checkCreateConfig()) {
            return false;
        }

        if (selectedItemsToEdit == null) {
            selectedItemsToEdit = new ArrayList<>();
        }
        int newItemsNeeded = createNewItemCount - selectedItemsToEdit.size();
        for (int i = 0; i < newItemsNeeded; i++) {
            Item newItem = createItemEntity();
            selectedItemsToEdit.add(newItem);
        }
        return true;
    }

    protected boolean checkCreateConfig() {
        return true;
    }

    public boolean getRenderDeleteAllButton() {
        return getRenderSaveAllButton();
    }

    public boolean getRenderResetAllButton() {
        return getRenderSaveAllButton();
    }

    public void goToNextStep() {
        setActiveIndex(activeIndex + 1);
    }

    public void goToPrevStep() {
        setActiveIndex(activeIndex - 1);
    }

    public List<Item> getSelectedItemsToEdit() {
        return selectedItemsToEdit;
    }

    public void setSelectedItemsToEdit(List<Item> selectedItemsToEdit) {
        this.selectedItemsToEdit = selectedItemsToEdit;
    }

    public void onRowReorder(ReorderEvent event) {
        int index = event.getFromIndex();
        Item item = this.selectedItemsToEdit.remove(index);
        int toIndex = event.getToIndex();
        this.selectedItemsToEdit.add(toIndex, item);
    }

    public MultiEditPropertyRecord getCurrentMultiEditPropertyRecord() {
        return currentMultiEditPropertyRecord;
    }

    public void setCurrentMultiEditPropertyRecord(MultiEditPropertyRecord currentMultiEditPropertyRecord) {
        this.currentMultiEditPropertyRecord = currentMultiEditPropertyRecord;
    }

    public int getActiveIndex() {
        return activeIndex;
    }

    public boolean isDefaultValuesForNewItemsEditable() {
        return selectedItemsToEdit != null && selectedItemsToEdit.size() > 0;
    }

    public boolean getRenderSelection() {
        return activeIndex == MultipleEditMenu.selection.ordinal();
    }

    public boolean getRenderUpdateItems() {
        return activeIndex == MultipleEditMenu.updateItems.ordinal();
    }

    public boolean getRenderCreateConfiguration() {
        return activeIndex == MultipleCreateMenu.createConfig.ordinal();
    }

    public boolean getRenderUpdateNewItems() {
        return activeIndex == MultipleCreateMenu.updateNewItems.ordinal();
    }

    public int getCreateNewItemCount() {
        return createNewItemCount;
    }

    public void setCreateNewItemCount(int createNewItemCount) {
        this.createNewItemCount = createNewItemCount;
    }

    public EntityInfo getNewItemEntityInfo() {
        if (newItemEntityInfo == null) {
            newItemEntityInfo = EntityInfoUtility.createEntityInfo();
        }
        return newItemEntityInfo;
    }

    public void setNewItemEntityInfo(EntityInfo newItemEntityInfo) {
        this.newItemEntityInfo = newItemEntityInfo;
    }

    public List<ItemProject> getNewItemAssignDefaultProject() {
        return newItemAssignDefaultProject;
    }

    public void setNewItemAssignDefaultProject(List<ItemProject> newItemAssignDefaultProject) {
        this.newItemAssignDefaultProject = newItemAssignDefaultProject;
    }

    public String getNewItemAssignedDefaultProjectLabel() {
        if (newItemAssignDefaultProject != null) {
            if (!newItemAssignDefaultProject.isEmpty()) {
                return StringUtility.getStringifyCdbList(newItemAssignDefaultProject);
            }
        }

        return "Please select default project for all new items.";
    }

    public boolean isUpdateItemIdentifier1() {
        return updateItemIdentifier1;
    }

    public void setUpdateItemIdentifier1(boolean updateItemIdentifier1) {
        this.updateItemIdentifier1 = updateItemIdentifier1;
    }

    public boolean isUpdateItemIdentifier2() {
        return updateItemIdentifier2;
    }

    public void setUpdateItemIdentifier2(boolean updateItemIdentifier2) {
        this.updateItemIdentifier2 = updateItemIdentifier2;
    }

    public boolean isUpdateProject() {
        return updateProject;
    }

    public void setUpdateProject(boolean updateProject) {
        this.updateProject = updateProject;
    }

    public boolean isUpdateDescription() {
        return updateDescription;
    }

    public void setUpdateDescription(boolean updateDescription) {
        this.updateDescription = updateDescription;
    }

    public boolean isUpdateItemType() {
        return updateItemType;
    }

    public void setUpdateItemType(boolean updateItemType) {
        this.updateItemType = updateItemType;
    }

    public boolean isUpdateItemCategory() {
        return updateItemCategory;
    }

    public void setUpdateItemCategory(boolean updateItemCategory) {
        this.updateItemCategory = updateItemCategory;
    }

    public boolean isUpdateQrId() {
        return updateQrId;
    }

    public void setUpdateQrId(boolean updateQrId) {
        this.updateQrId = updateQrId;
    }

    public boolean isUpdateOwnerUser() {
        return updateOwnerUser;
    }

    public void setUpdateOwnerUser(boolean updateOwnerUser) {
        this.updateOwnerUser = updateOwnerUser;
    }

    public boolean isUpdateOwnerGroup() {
        return updateOwnerGroup;
    }

    public void setUpdateOwnerGroup(boolean updateOwnerGroup) {
        this.updateOwnerGroup = updateOwnerGroup;
    }

    public boolean isUpdateGroupWriteable() {
        return updateGroupWriteable;
    }

    public void setUpdateGroupWriteable(boolean updateGroupWriteable) {
        this.updateGroupWriteable = updateGroupWriteable;
    }

    public Item getDerivedFromItemForNewItems() {
        return derivedFromItemForNewItems;
    }

    public void setDerivedFromItemForNewItems(Item derivedFromItemForNewItems) {
        this.derivedFromItemForNewItems = derivedFromItemForNewItems;
    }

    public List<PropertyType> getSelectedPropertyTypesForEditing() {
        return selectedPropertyTypesForEditing;
    }

    public void setSelectedPropertyTypesForEditing(List<PropertyType> selectedPropertyTypesForEditign) {
        this.selectedPropertyTypesForEditing = selectedPropertyTypesForEditign;
    }

    public void removePropertyTypeForEditing(PropertyType propertyType) {
        this.selectedPropertyTypesForEditing.remove(propertyType);
    }

    private boolean getRenderSpecificInput(ItemDefaultColumnReferences idcr) {
        if (this.currentApplyValuesToColumn != null) {
            return this.currentApplyValuesToColumn == idcr;
        }
        return false;
    }

    public boolean getRenderGroupWriteableInput() {
        return getRenderSpecificInput(ItemDefaultColumnReferences.groupWriteable);
    }

    public boolean getRenderOwnerGroupInput() {
        return getRenderSpecificInput(ItemDefaultColumnReferences.ownerGroup);
    }

    public boolean getRenderOwnerUserInput() {
        return getRenderSpecificInput(ItemDefaultColumnReferences.ownerUser);
    }

    public boolean getRenderNumberInput() {
        return getRenderSpecificInput(ItemDefaultColumnReferences.qrId);
    }

    public boolean getRenderLargeTextInput() {
        return getRenderSpecificInput(ItemDefaultColumnReferences.description);
    }

    public boolean getRenderItemProjectInputValue() {
        return getRenderSpecificInput(ItemDefaultColumnReferences.itemProject);
    }

    public boolean getRenderPropertyInputValue() {
        return getRenderSpecificInput(ItemDefaultColumnReferences.property);
    }

    public boolean isRenderMultiCreateConfigurationDialog() {
        return renderMultiCreateConfigurationDialog;
    }

    public void setRenderMultiCreateConfigurationDialog(boolean renderMultiCreateConfigurationDialog) {
        this.renderMultiCreateConfigurationDialog = renderMultiCreateConfigurationDialog;
    }

    public boolean getRenderSimpleTextInputValue() {
        if (this.currentApplyValuesToColumn != null) {
            if (this.currentApplyValuesToColumn == ItemDefaultColumnReferences.name) {
                return true;
            } else if (this.currentApplyValuesToColumn == ItemDefaultColumnReferences.itemIdentifier1) {
                return true;
            } else if (this.currentApplyValuesToColumn == ItemDefaultColumnReferences.itemIdentifier2) {
                return true;
            }
        }

        return false;
    }

    public boolean getDisplayColumnApplyValuesConfiguration(ItemDefaultColumnReferences columnKey) {
        if (columnKey == ItemDefaultColumnReferences.derivedFromItem) {
            return false;
        }

        return true;
    }

    public void populateValuesForColumn() {
        isInputValueDialogOpen = false;
        for (Item item : selectedItemsToEdit) {
            switch (currentApplyValuesToColumn) {
            case name:
                item.setName(getNextValueForCurrentSequence());
                break;
            case itemIdentifier1:
                item.setItemIdentifier1(getNextValueForCurrentSequence());
                break;
            case itemIdentifier2:
                item.setItemIdentifier2(getNextValueForCurrentSequence());
                break;
            case itemProject:
                item.setItemProjectList((List<ItemProject>) (List<?>) currentObjectListValueToColumn);
                break;
            case description:
                item.setDescription((String) currentObjectValueToColumn);
                break;
            case qrId:
                item.setQrId(currentSequenceStartValueToColumn);
                currentSequenceStartValueToColumn++;
                break;
            case ownerUser:
                item.getEntityInfo().setOwnerUser((UserInfo) currentObjectValueToColumn);
                break;
            case ownerGroup:
                item.getEntityInfo().setOwnerUserGroup((UserGroup) currentObjectValueToColumn);
                break;
            case groupWriteable:
                item.getEntityInfo().setIsGroupWriteable((Boolean) currentObjectValueToColumn);
                break;
            case property:
                PropertyType currentPropertyType = currentMockPropertyValueApplyValuesToColumn.getPropertyType();
                MultiEditPropertyRecord mepr = getMultiEditPropertyRecordForItem(currentPropertyType, item);
                PropertyValue value = mepr.getPropertyValue();
                if (value != null) {
                    value.setValue(currentMockPropertyValueApplyValuesToColumn.getValue());
                }
                break;
            default:
                break;
            }
        }
    }

    private String getNextValueForCurrentSequence() {
        String newValue = currentPrefixValueToColumn;
        if (getHasSequenceValueToSet()) {
            newValue += currentSequenceStartValueToColumn;
            newValue += currentPostfixValueToColumn;
            currentSequenceStartValueToColumn++;
        }
        return newValue;
    }

    public void setCurrentApplyValuesToColumn(ItemDefaultColumnReferences currentApplyValuesToColumn,
            PropertyType propertyTypesApplyValuesTo) {
        currentMockPropertyValueApplyValuesToColumn = new PropertyValue();
        currentMockPropertyValueApplyValuesToColumn.setPropertyType(propertyTypesApplyValuesTo);
        setCurrentApplyValuesToColumn(currentApplyValuesToColumn);
        currentMockPropertyValueApplyValuesToColumn.setValue("");
    }

    public void setCurrentApplyValuesToColumn(ItemDefaultColumnReferences currentApplyValuesToColumn) {
        this.currentApplyValuesToColumn = currentApplyValuesToColumn;
        this.isInputValueDialogOpen = true;
        this.currentPrefixValueToColumn = null;
        this.currentPostfixValueToColumn = null;
        this.currentSequenceStartValueToColumn = null;
        this.currentObjectListValueToColumn = null;
        this.currentObjectListStringRep = null;
        this.currentObjectValueToColumn = null;
    }

    public void handleCloseInputValueDialog(AjaxBehaviorEvent event) {
        setIsInputValueDialogOpen(false);
    }

    public boolean isIsInputValueDialogOpen() {
        return isInputValueDialogOpen;
    }

    public void setIsInputValueDialogOpen(boolean isInputValueDialogOpen) {
        this.isInputValueDialogOpen = isInputValueDialogOpen;
    }

    public PropertyValue getCurrentMockPropertyValueApplyValuesToColumn() {
        return currentMockPropertyValueApplyValuesToColumn;
    }

    public void setCurrentMockPropertyValueApplyValuesToColumn(
            PropertyValue currentMockPropertyValueApplyValuesToColumn) {
        this.currentMockPropertyValueApplyValuesToColumn = currentMockPropertyValueApplyValuesToColumn;
    }

    public String getCurrentPrefixValueToColumn() {
        return currentPrefixValueToColumn;
    }

    public void setCurrentPrefixValueToColumn(String currentPrefixValueToColumn) {
        this.currentPrefixValueToColumn = currentPrefixValueToColumn;
    }

    public String getCurrentPostfixValueToColumn() {
        return currentPostfixValueToColumn;
    }

    public void setCurrentPostfixValueToColumn(String currentPostfixValueToColumn) {
        this.currentPostfixValueToColumn = currentPostfixValueToColumn;
    }

    public Integer getCurrentSequenceStartValueToColumn() {
        return currentSequenceStartValueToColumn;
    }

    public void setCurrentSequenceStartValueToColumn(Integer currentSequenceStartValueToColumn) {
        this.currentSequenceStartValueToColumn = currentSequenceStartValueToColumn;
    }

    public boolean getHasSequenceValueToSet() {
        return currentSequenceStartValueToColumn != null;
    }

    public List<Object> getCurrentObjectListValueToColumn() {
        return currentObjectListValueToColumn;
    }

    public void setCurrentObjectListValueToColumn(List<Object> currentObjectListValueToColumn) {
        currentObjectListStringRep = null;
        this.currentObjectListValueToColumn = currentObjectListValueToColumn;
    }

    public String getCurrentObjectListStringRep() {
        if (currentObjectListStringRep == null) {
            currentObjectListStringRep = StringUtility.getStringifyCdbList(currentObjectListValueToColumn);
        }
        return currentObjectListStringRep;
    }

    public Object getCurrentObjectValueToColumn() {
        return currentObjectValueToColumn;
    }

    public void setCurrentObjectValueToColumn(Object currentObjectValueToColumn) {
        this.currentObjectValueToColumn = currentObjectValueToColumn;
    }

    public class MultiEditPropertyRecord {

        private PropertyType propertyType = null;
        private PropertyValue propertyValue = null;
        private List<PropertyValue> relatedPropertyValueList = null;
        private Item item = null;
        private String viewUUID;

        public MultiEditPropertyRecord(PropertyType propertyType, Item item) {
            this.propertyType = propertyType;
            this.item = item;
        }

        public List<PropertyValue> getRelatedPropertyValueList() {
            if (relatedPropertyValueList == null) {
                relatedPropertyValueList = new ArrayList<>();
                if (item.getPropertyValueList() != null) {
                    for (PropertyValue propertyValue : item.getPropertyValueList()) {
                        if (propertyValue.getPropertyType().equals(propertyType)) {
                            relatedPropertyValueList.add(propertyValue);
                        }
                    }
                }
            }
            return relatedPropertyValueList;
        }

        public void resetRelatedPropertyValueList() {
            relatedPropertyValueList = null;
            propertyValue = null;
        }

        public PropertyValue getPropertyValue() {
            if (propertyValue == null) {
                // Attempt to get a value
                if (getRelatedPropertyValueList().size() > 0) {
                    propertyValue = relatedPropertyValueList.get(0);
                }
            }
            return propertyValue;
        }

        public void setPropertyValue(PropertyValue propertyValue) {
            this.propertyValue = propertyValue;
        }

        public boolean isItemHasMoreThanOneOfSameType() {
            return getRelatedPropertyValueList().size() > 1;
        }

        public PropertyType getPropertyType() {
            return propertyType;
        }

        public Item getItem() {
            return item;
        }

        public String getViewUUID() {
            if (viewUUID == null) {
                viewUUID = UUID.randomUUID().toString().replaceAll("[-]", "");
            }
            return viewUUID;
        }

    }

}