org.broadleafcommerce.openadmin.server.service.persistence.module.extension.DefaultBasicPersistenceModuleExtensionHandler.java Source code

Java tutorial

Introduction

Here is the source code for org.broadleafcommerce.openadmin.server.service.persistence.module.extension.DefaultBasicPersistenceModuleExtensionHandler.java

Source

/*
 * #%L
 * BroadleafCommerce Open Admin Platform
 * %%
 * Copyright (C) 2009 - 2014 Broadleaf Commerce
 * %%
 * 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.
 * #L%
 */
package org.broadleafcommerce.openadmin.server.service.persistence.module.extension;

import org.apache.commons.collections.CollectionUtils;
import org.broadleafcommerce.common.exception.ExceptionHelper;
import org.broadleafcommerce.common.extension.ExtensionResultHolder;
import org.broadleafcommerce.common.extension.ExtensionResultStatusType;
import org.broadleafcommerce.common.presentation.client.PersistencePerspectiveItemType;
import org.broadleafcommerce.common.util.TypedPredicate;
import org.broadleafcommerce.openadmin.dto.CriteriaTransferObject;
import org.broadleafcommerce.openadmin.dto.Entity;
import org.broadleafcommerce.openadmin.dto.FieldMetadata;
import org.broadleafcommerce.openadmin.dto.FilterAndSortCriteria;
import org.broadleafcommerce.openadmin.dto.ForeignKey;
import org.broadleafcommerce.openadmin.dto.PersistencePackage;
import org.broadleafcommerce.openadmin.dto.PersistencePerspective;
import org.broadleafcommerce.openadmin.server.service.ValidationException;
import org.broadleafcommerce.openadmin.server.service.persistence.module.BasicPersistenceModule;
import org.broadleafcommerce.openadmin.server.service.persistence.module.FieldNotAvailableException;
import org.broadleafcommerce.openadmin.server.service.persistence.module.criteria.FilterMapping;
import org.springframework.stereotype.Service;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

/**
 * Default implementation for the core framework.
 *
 * @see org.broadleafcommerce.openadmin.server.service.persistence.module.extension.BasicPersistenceModuleExtensionHandler
 * @author Jeff Fischer
 */
@Service("blDefaultBasicPersistenceModuleExtensionHandler")
public class DefaultBasicPersistenceModuleExtensionHandler extends AbstractBasicPersistenceModuleExtensionHandler {

    @Resource(name = "blBasicPersistenceModuleExtensionManager")
    protected BasicPersistenceModuleExtensionManager extensionManager;

    @PostConstruct
    public void init() {
        setPriority(BasicPersistenceModuleExtensionHandler.DEFAULT_PRIORITY);
        if (isEnabled()) {
            extensionManager.registerHandler(this);
        }
    }

    @Override
    public ExtensionResultStatusType rebalanceForAdd(BasicPersistenceModule basicPersistenceModule,
            PersistencePackage persistencePackage, Serializable instance,
            Map<String, FieldMetadata> mergedProperties, ExtensionResultHolder<Serializable> resultHolder) {
        try {
            PersistencePerspective persistencePerspective = persistencePackage.getPersistencePerspective();
            ForeignKey foreignKey = (ForeignKey) persistencePerspective.getPersistencePerspectiveItems()
                    .get(PersistencePerspectiveItemType.FOREIGNKEY);
            CriteriaTransferObject cto = new CriteriaTransferObject();
            FilterAndSortCriteria sortCriteria = cto.get(foreignKey.getSortField());
            sortCriteria.setSortAscending(foreignKey.getSortAscending());
            List<FilterMapping> filterMappings = basicPersistenceModule.getFilterMappings(persistencePerspective,
                    cto, persistencePackage.getCeilingEntityFullyQualifiedClassname(), mergedProperties);
            int totalRecords = basicPersistenceModule
                    .getTotalRecords(persistencePackage.getCeilingEntityFullyQualifiedClassname(), filterMappings);
            Class<?> type = basicPersistenceModule.getFieldManager()
                    .getField(instance.getClass(), foreignKey.getSortField()).getType();
            boolean isBigDecimal = BigDecimal.class.isAssignableFrom(type);
            basicPersistenceModule.getFieldManager().setFieldValue(instance, foreignKey.getSortField(),
                    isBigDecimal ? new BigDecimal(totalRecords + 1) : Long.valueOf(totalRecords + 1));

            resultHolder.setResult(instance);

        } catch (IllegalAccessException e) {
            throw ExceptionHelper.refineException(e);
        } catch (InstantiationException e) {
            throw ExceptionHelper.refineException(e);
        }

        return ExtensionResultStatusType.HANDLED;
    }

    @Override
    public ExtensionResultStatusType rebalanceForUpdate(final BasicPersistenceModule basicPersistenceModule,
            PersistencePackage persistencePackage, Serializable instance,
            Map<String, FieldMetadata> mergedProperties, Object primaryKey,
            ExtensionResultHolder<Serializable> resultHolder) {
        try {
            Entity entity = persistencePackage.getEntity();
            PersistencePerspective persistencePerspective = persistencePackage.getPersistencePerspective();
            ForeignKey foreignKey = (ForeignKey) persistencePerspective.getPersistencePerspectiveItems()
                    .get(PersistencePerspectiveItemType.FOREIGNKEY);
            Integer requestedSequence = Integer.valueOf(entity.findProperty(foreignKey.getSortField()).getValue());
            Integer previousSequence = new BigDecimal(String.valueOf(
                    basicPersistenceModule.getFieldManager().getFieldValue(instance, foreignKey.getSortField())))
                            .intValue();
            final String idPropertyName = basicPersistenceModule.getIdPropertyName(mergedProperties);
            final Object pKey = primaryKey;

            instance = basicPersistenceModule.createPopulatedInstance(instance, entity, mergedProperties, false,
                    persistencePackage.isValidateUnsubmittedProperties());

            if (!previousSequence.equals(requestedSequence)) {
                // Sequence has changed. Rebalance the list
                Serializable manyToField = (Serializable) basicPersistenceModule.getFieldManager()
                        .getFieldValue(instance, foreignKey.getManyToField());
                List<Serializable> records = (List<Serializable>) basicPersistenceModule.getFieldManager()
                        .getFieldValue(manyToField, foreignKey.getOriginatingField());

                Serializable myRecord = (Serializable) CollectionUtils.find(records,
                        new TypedPredicate<Serializable>() {

                            @Override
                            public boolean eval(Serializable record) {
                                try {
                                    return (pKey.equals(basicPersistenceModule.getFieldManager()
                                            .getFieldValue(record, idPropertyName)));
                                } catch (IllegalAccessException e) {
                                    return false;
                                } catch (FieldNotAvailableException e) {
                                    return false;
                                }

                            }

                        });

                records.remove(myRecord);
                if (CollectionUtils.isEmpty(records)) {
                    records.add(myRecord);
                } else {
                    records.add(requestedSequence - 1, myRecord);
                }

                int index = 1;
                Class<?> type = basicPersistenceModule.getFieldManager()
                        .getField(myRecord.getClass(), foreignKey.getSortField()).getType();
                boolean isBigDecimal = BigDecimal.class.isAssignableFrom(type);
                for (Serializable record : records) {
                    basicPersistenceModule.getFieldManager().setFieldValue(record, foreignKey.getSortField(),
                            isBigDecimal ? new BigDecimal(index) : Long.valueOf(index));
                    index++;
                }
            }

            resultHolder.setResult(instance);

        } catch (IllegalAccessException e) {
            throw ExceptionHelper.refineException(e);
        } catch (FieldNotAvailableException e) {
            throw ExceptionHelper.refineException(e);
        } catch (ValidationException e) {
            throw ExceptionHelper.refineException(e);
        } catch (InstantiationException e) {
            throw ExceptionHelper.refineException(e);
        }

        return ExtensionResultStatusType.HANDLED;
    }

}