org.broadleafcommerce.inventory.admin.server.service.handler.InventorySkuCustomPersistenceHandler.java Source code

Java tutorial

Introduction

Here is the source code for org.broadleafcommerce.inventory.admin.server.service.handler.InventorySkuCustomPersistenceHandler.java

Source

/**
 * Copyright 2012 the original author or authors.
 *
 * 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.broadleafcommerce.inventory.admin.server.service.handler;

import java.util.List;

import javax.annotation.Resource;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.From;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.broadleafcommerce.admin.server.service.handler.SkuCustomPersistenceHandler;
import org.broadleafcommerce.core.catalog.domain.SkuImpl;
import org.broadleafcommerce.core.catalog.service.CatalogService;
import org.broadleafcommerce.inventory.domain.InventoryImpl;
import org.broadleafcommerce.inventory.service.InventoryService;
import org.broadleafcommerce.openadmin.dto.CriteriaTransferObject;
import org.broadleafcommerce.openadmin.dto.PersistencePackage;
import org.broadleafcommerce.openadmin.server.service.handler.CustomPersistenceHandler;
import org.broadleafcommerce.openadmin.server.service.persistence.module.criteria.FieldPath;
import org.broadleafcommerce.openadmin.server.service.persistence.module.criteria.FieldPathBuilder;
import org.broadleafcommerce.openadmin.server.service.persistence.module.criteria.FilterMapping;
import org.broadleafcommerce.openadmin.server.service.persistence.module.criteria.Restriction;
import org.broadleafcommerce.openadmin.server.service.persistence.module.criteria.predicate.PredicateProvider;

public class InventorySkuCustomPersistenceHandler extends SkuCustomPersistenceHandler {

    private static final Log LOG = LogFactory.getLog(InventorySkuCustomPersistenceHandler.class);

    @Resource(name = "blInventoryService")
    protected InventoryService inventoryService;

    @Resource(name = "blCatalogService")
    protected CatalogService catalogService;

    @Override
    public Boolean canHandleInspect(PersistencePackage persistencePackage) {
        String className = persistencePackage.getCeilingEntityFullyQualifiedClassname();
        String[] customCriteria = persistencePackage.getCustomCriteria();
        return customCriteria != null && customCriteria.length > 0 && SkuImpl.class.getName().equals(className)
                && "inventoryFilteredSkuList".equals(customCriteria[0]);
    }

    @Override
    public Boolean canHandleFetch(PersistencePackage persistencePackage) {
        return canHandleInspect(persistencePackage);
    }

    @Override
    public void applyAdditionalFetchCriteria(List<FilterMapping> filterMappings, CriteriaTransferObject cto,
            PersistencePackage persistencePackage) {
        super.applyAdditionalFetchCriteria(filterMappings, cto, persistencePackage);
        // grab the fulfillment location off of the custom criteria from the
        // frontend
        final Long locationId = Long.parseLong(persistencePackage.getCustomCriteria()[1]);
        FilterMapping f = new FilterMapping().withFieldPath(new FieldPath().withTargetProperty("id"))
                .withRestriction(new Restriction().withPredicateProvider(new PredicateProvider() {
                    @Override
                    public Predicate buildPredicate(CriteriaBuilder builder, FieldPathBuilder fieldPathBuilder,
                            From root, String ceilingEntity, String fullPropertyName, Path explicitPath,
                            List directValues) {
                        // DetachedCriteria locationSkuIds1 =
                        // DetachedCriteria.forClass(InventoryImpl.class)
                        // .add(Restrictions.eq("fulfillmentLocation.id",
                        // locationId))
                        // .setProjection(Projections.property("sku.id"));
                        // return
                        // Subqueries.propertyNotIn(targetPropertyName,
                        // locationSkuIds);

                        CriteriaQuery<Long> q = builder.createQuery(Long.class);
                        Root<InventoryImpl> subRoot = q.from(InventoryImpl.class);
                        q.where(builder.equal(subRoot.get("fulfillmentLocation.id"), locationId));
                        q.select(subRoot.<Long>get("sku.id"));
                        return builder.not(explicitPath.in(q)); // FIXME
                    }
                }));
        filterMappings.add(f);
    }

    @Override
    public int getOrder() {
        return CustomPersistenceHandler.DEFAULT_ORDER - 100;
    }

}