/* * #%L * BroadleafCommerce Open Admin Platform * %% * Copyright (C) 2009 - 2013 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.criteria; import org.broadleafcommerce.openadmin.server.service.persistence.module.criteria.converter.FilterValueConverter; import org.broadleafcommerce.openadmin.server.service.persistence.module.criteria.predicate.PredicateProvider; import java.util.ArrayList; import java.util.List; 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; /** * Responsible for providing a JPA {@link javax.persistence.criteria.Predicate} instance for query construction based * on several objects that define query construction behavior for the target field. The objects can be replaced with custom * implementations for more specific behavior. * * @see org.broadleafcommerce.openadmin.server.service.persistence.module.criteria.predicate.PredicateProvider * @see org.broadleafcommerce.openadmin.server.service.persistence.module.criteria.converter.FilterValueConverter * @see org.broadleafcommerce.openadmin.server.service.persistence.module.criteria.FieldPathBuilder * @author Jeff Fischer */ public class Restriction { protected PredicateProvider predicateProvider; protected FilterValueConverter filterValueConverter; protected FieldPathBuilder fieldPathBuilder = new FieldPathBuilder(); public Restriction withPredicateProvider(PredicateProvider predicateProvider) { setPredicateProvider(predicateProvider); return this; } public Restriction withFilterValueConverter(FilterValueConverter filterValueConverter) { setFilterValueConverter(filterValueConverter); return this; } public Restriction withFieldPathBuilder(FieldPathBuilder fieldPathBuilder) { setFieldPathBuilder(fieldPathBuilder); return this; } /** * This method will return a FieldPathBuilder that could be used by the caller to establish any additional Roots that * might be necessary due to the path living inside of a polymorphic version of the ceiling entity. The Predicate * object that {@link #buildRestriction(...)} returns is also available inside of the FieldPathBuilder object for * the caller's use. * * @param builder * @param root * @param ceilingEntity * @param targetPropertyName * @param explicitPath * @param directValues * @param shouldConvert * @return */ public Predicate buildRestriction(CriteriaBuilder builder, From root, String ceilingEntity, String targetPropertyName, Path explicitPath, List directValues, boolean shouldConvert, CriteriaQuery criteria, List<Predicate> restrictions) { fieldPathBuilder.setCriteria(criteria); fieldPathBuilder.setRestrictions(restrictions); List<Object> convertedValues = new ArrayList<Object>(); if (shouldConvert && filterValueConverter != null) { for (Object item : directValues) { String stringItem = (String) item; convertedValues.add(filterValueConverter.convert(stringItem)); } } else { convertedValues.addAll(directValues); } return predicateProvider.buildPredicate(builder, fieldPathBuilder, root, ceilingEntity, targetPropertyName, explicitPath, convertedValues); } public FilterValueConverter getFilterValueConverter() { return filterValueConverter; } public void setFilterValueConverter(FilterValueConverter filterValueConverter) { this.filterValueConverter = filterValueConverter; } public PredicateProvider getPredicateProvider() { return predicateProvider; } public void setPredicateProvider(PredicateProvider predicateProvider) { this.predicateProvider = predicateProvider; } public FieldPathBuilder getFieldPathBuilder() { return fieldPathBuilder; } public void setFieldPathBuilder(FieldPathBuilder fieldPathBuilder) { this.fieldPathBuilder = fieldPathBuilder; } public Restriction clone() { Restriction temp = new Restriction().withFilterValueConverter(getFilterValueConverter()) .withPredicateProvider(getPredicateProvider()) .withFieldPathBuilder(getFieldPathBuilder()); return temp; } }