/* * Copyright 2013 uaiHebert Solucoes em Informatica * * 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 com.uaihebert.cto; import com.uaihebert.uaicriteria.UaiCriteria; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public final class UaiCTOImp<T> implements UaiCriteria<T> { private static final boolean DO_NOT_APPLY_LOWER_CASE = false; private static final boolean ORDER_BY_ASC = false; private static final boolean ORDER_BY_DESC = true; boolean distinct; private Integer firstResult; private Integer maxResults; final List<JoinHolder> joinList; final List<OrderByHolder> orderByList; final List<CriteriaConditionHolder> criteriaConditionTypeList; final List<String> groupByList = new ArrayList<String>(); final List<String> multiselectAttributeList = new ArrayList<String>(); public UaiCTOImp() { orderByList = new ArrayList<OrderByHolder>(); criteriaConditionTypeList = new ArrayList<CriteriaConditionHolder>(); joinList = new ArrayList<JoinHolder>(); } public UaiCTOImp(final boolean distinct, final List<OrderByHolder> orderByList, final List<CriteriaConditionHolder> criteriaConditionTypeList, final List<JoinHolder> joinList) { this.distinct = distinct; this.orderByList = orderByList; this.criteriaConditionTypeList = criteriaConditionTypeList; this.joinList = joinList; } public List<T> getResultList() { throw resultQueryNotAllowedOnCTO(); } private IllegalStateException resultQueryNotAllowedOnCTO() { return new IllegalStateException("Hello, I am a Criteria Transfer Object (CTO) Only. I do not have an entity manager do run the query. \n" + " To use a CTO correctly there is an other method in the UaiCriteriaFactory: \n" + " UaiCriteriaFactory.createQueryCriteria(EntityManager , Class<T>, UaiCriteria)" + " The last parameter is where you should pass the CTO"); } public T getSingleResult() { throw resultQueryNotAllowedOnCTO(); } @Override public List getMultiSelectResult() { throw resultQueryNotAllowedOnCTO(); } public Long count() { throw resultQueryNotAllowedOnCTO(); } public Long countRegularCriteria() { throw resultQueryNotAllowedOnCTO(); } @Override public <E> UaiCriteria<E> subQuery(final String subQueryResult, final Class<E> entityClass) { throw subQueryNotAllowed(); } private IllegalStateException subQueryNotAllowed() { return new IllegalStateException("Hello, sub query is not allowed in CTO [YET]. If you need you this function, please talk with us in the site uaicriteria.com"); } public UaiCriteria<T> countAttribute(final String... attributeNameArray) { criteriaConditionTypeList.add(new CriteriaConditionHolder(CriteriaConditionType.COUNT_ATTRIBUTE, attributeNameArray)); return this; } public UaiCriteria<T> andEquals(final String attributeName, final Object value) { criteriaConditionTypeList.add(new CriteriaConditionHolder(attributeName, CriteriaConditionType.EQUAL, value)); return this; } public UaiCriteria<T> andEquals(final boolean toLowerCase, final String attributeName, final String value) { criteriaConditionTypeList.add(new CriteriaConditionHolder(toLowerCase, attributeName, CriteriaConditionType.EQUAL, value)); return this; } public UaiCriteria<T> orEquals(final String attributeName, final Object... valueArray) { criteriaConditionTypeList.add(new CriteriaConditionHolder(attributeName, CriteriaConditionType.OR_EQUAL, valueArray)); return this; } @Override public UaiCriteria<T> orStringLike(final String attributeName, final String... stringArray) { return orStringLike(DO_NOT_APPLY_LOWER_CASE, attributeName, stringArray); } @Override public UaiCriteria<T> orStringLike(final boolean toLowerCase, final String attributeName, final String... stringArray) { criteriaConditionTypeList.add(new CriteriaConditionHolder(toLowerCase, attributeName, CriteriaConditionType.OR_LIKE, stringArray)); return this; } @Override public UaiCriteria<T> orStringNotLike(final String attributeName, final String... stringArray) { return orStringNotLike(DO_NOT_APPLY_LOWER_CASE, attributeName, stringArray); } @Override public UaiCriteria<T> orStringNotLike(final boolean toLowerCase, final String attributeName, final String... stringArray) { criteriaConditionTypeList.add(new CriteriaConditionHolder(attributeName, CriteriaConditionType.OR_NOT_LIKE, stringArray)); return this; } @Override public UaiCriteria<T> andIsMemberOf(final Object value, final String collectionName) { criteriaConditionTypeList.add(new CriteriaConditionHolder(collectionName, CriteriaConditionType.IS_MEMBER_OF, value)); return this; } @Override public UaiCriteria<T> andIsNotMemberOf(final Object value, final String collectionName) { criteriaConditionTypeList.add(new CriteriaConditionHolder(collectionName, CriteriaConditionType.IS_NOT_MEMBER_OF, value)); return this; } public UaiCriteria<T> orEquals(final boolean toLowerCase, final String attributeName, final String... valueArray) { criteriaConditionTypeList.add(new CriteriaConditionHolder(toLowerCase, attributeName, CriteriaConditionType.OR_EQUAL, valueArray)); return this; } public UaiCriteria<T> orEquals(final int index, final String attributeName, final Object... valueArray) { criteriaConditionTypeList.add(new CriteriaConditionHolder(index, DO_NOT_APPLY_LOWER_CASE, attributeName, CriteriaConditionType.OR_EQUAL, valueArray)); return this; } public UaiCriteria<T> orEquals(final boolean toLowerCase, final int index, final String attributeName, final String... valueArray) { criteriaConditionTypeList.add(new CriteriaConditionHolder(index, toLowerCase, attributeName, CriteriaConditionType.OR_EQUAL, valueArray)); return this; } public UaiCriteria<T> andNotEquals(final String attributeName, final Object value) { criteriaConditionTypeList.add(new CriteriaConditionHolder(attributeName, CriteriaConditionType.NOT_EQUAL, value)); return this; } public UaiCriteria<T> andNotEquals(final boolean toLowerCase, final String attributeName, final String value) { criteriaConditionTypeList.add(new CriteriaConditionHolder(toLowerCase, attributeName, CriteriaConditionType.NOT_EQUAL, value)); return this; } public UaiCriteria<T> orNotEquals(final String attributeName, final Object... valueArray) { criteriaConditionTypeList.add(new CriteriaConditionHolder(attributeName, CriteriaConditionType.OR_NOT_EQUAL, valueArray)); return this; } public UaiCriteria<T> orNotEquals(final boolean toLowerCase, final String attributeName, final String... valueArray) { criteriaConditionTypeList.add(new CriteriaConditionHolder(toLowerCase, attributeName, CriteriaConditionType.OR_NOT_EQUAL, valueArray)); return this; } public UaiCriteria<T> andGreaterThan(final String attributeName, final Object value) { criteriaConditionTypeList.add(new CriteriaConditionHolder(attributeName, CriteriaConditionType.GREATER_THAN, value)); return this; } public UaiCriteria<T> andGreaterThan(final boolean toLowerCase, final String attributeName, final String value) { criteriaConditionTypeList.add(new CriteriaConditionHolder(toLowerCase, attributeName, CriteriaConditionType.GREATER_THAN, value)); return this; } public UaiCriteria<T> andGreaterOrEqualTo(final String attributeName, final Object value) { criteriaConditionTypeList.add(new CriteriaConditionHolder(attributeName, CriteriaConditionType.GREATER_OR_EQUAL_TO, value)); return this; } public UaiCriteria<T> andGreaterOrEqualTo(final boolean toLowerCase, final String attributeName, final String value) { criteriaConditionTypeList.add(new CriteriaConditionHolder(toLowerCase, attributeName, CriteriaConditionType.GREATER_OR_EQUAL_TO, value)); return this; } public UaiCriteria<T> andLessThan(final String attributeName, final Object value) { criteriaConditionTypeList.add(new CriteriaConditionHolder(attributeName, CriteriaConditionType.LESS_THAN, value)); return this; } public UaiCriteria<T> andLessThan(final boolean toLowerCase, final String attributeName, final String value) { criteriaConditionTypeList.add(new CriteriaConditionHolder(toLowerCase, attributeName, CriteriaConditionType.LESS_THAN, value)); return this; } public UaiCriteria<T> andLessOrEqualTo(final String attributeName, final Object value) { criteriaConditionTypeList.add(new CriteriaConditionHolder(attributeName, CriteriaConditionType.LESS_OR_EQUAL_TO, value)); return this; } public UaiCriteria<T> andLessOrEqualTo(final boolean toLowerCase, final String attributeName, final String value) { criteriaConditionTypeList.add(new CriteriaConditionHolder(toLowerCase, attributeName, CriteriaConditionType.LESS_OR_EQUAL_TO, value)); return this; } public UaiCriteria<T> innerJoin(final String joinName) { joinList.add(new JoinHolder(joinName, JoinHolderType.INNER)); return this; } public UaiCriteria<T> leftJoin(final String joinName) { joinList.add(new JoinHolder(joinName, JoinHolderType.LEFT)); return this; } public UaiCriteria<T> innerJoinFetch(final String joinName) { joinList.add(new JoinHolder(joinName, JoinHolderType.INNER_FETCH)); return this; } public UaiCriteria<T> leftJoinFetch(final String joinName) { joinList.add(new JoinHolder(joinName, JoinHolderType.LEFT_FETCH)); return this; } public UaiCriteria<T> setDistinctTrue() { distinct = true; return this; } public UaiCriteria<T> andBetween(final String attributeName, final Object valueA, final Object valueB) { criteriaConditionTypeList.add(new CriteriaConditionHolder(attributeName, CriteriaConditionType.BETWEEN, valueA, valueB)); return this; } public UaiCriteria<T> andBetween(final boolean toLowerCase, final String attributeName, final String valueA, final String valueB) { criteriaConditionTypeList.add(new CriteriaConditionHolder(toLowerCase, attributeName, CriteriaConditionType.BETWEEN, valueA, valueB)); return this; } public UaiCriteria<T> andIsNull(final String attributeName) { criteriaConditionTypeList.add(new CriteriaConditionHolder(attributeName, CriteriaConditionType.AND_IS_NULL)); return this; } public UaiCriteria<T> orIsNull(final String attributeName) { criteriaConditionTypeList.add(new CriteriaConditionHolder(attributeName, CriteriaConditionType.OR_IS_NULL)); return this; } public UaiCriteria<T> orIsNotNull(final String attributeName) { criteriaConditionTypeList.add(new CriteriaConditionHolder(attributeName, CriteriaConditionType.OR_IS_NOT_NULL)); return this; } public UaiCriteria<T> andIsNotNull(final String attributeName) { criteriaConditionTypeList.add(new CriteriaConditionHolder(attributeName, CriteriaConditionType.AND_IS_NOT_NULL)); return this; } public UaiCriteria<T> andCollectionIsEmpty(final String collectionName) { criteriaConditionTypeList.add(new CriteriaConditionHolder(collectionName, CriteriaConditionType.COLLECTION_IS_EMPTY)); return this; } public UaiCriteria<T> andCollectionIsNotEmpty(final String collectionName) { criteriaConditionTypeList.add(new CriteriaConditionHolder(collectionName, CriteriaConditionType.COLLECTION_IS_NOT_EMPTY)); return this; } public UaiCriteria<T> andStringLike(final String attributeName, final String value) { return andStringLike(DO_NOT_APPLY_LOWER_CASE, attributeName, value); } public UaiCriteria<T> andStringLike(final boolean toLowerCase, final String attributeName, final String value) { criteriaConditionTypeList.add(new CriteriaConditionHolder(toLowerCase, attributeName, CriteriaConditionType.STRING_LIKE, value)); return this; } public UaiCriteria<T> andStringNotLike(final String attributeName, final String value) { return andStringNotLike(DO_NOT_APPLY_LOWER_CASE, attributeName, value); } @Override public <E> UaiCriteria<T> andAttributeIn(final String attributeName, final List<E> attributeList) { criteriaConditionTypeList.add(new CriteriaConditionHolder(attributeName, CriteriaConditionType.AND_ATTRIBUTE_IN, attributeList.toArray())); return this; } @Override public <E> UaiCriteria<T> andAttributeIn(final String attributeName, final UaiCriteria<E> uaiSubQuery) { throw subQueryNotAllowed(); } @Override public <E> UaiCriteria<T> andAttributeNotIn(final String attributeName, final List<E> attributeList) { criteriaConditionTypeList.add(new CriteriaConditionHolder(attributeName, CriteriaConditionType.AND_ATTRIBUTE_NOT_IN, attributeList.toArray())); return this; } @Override public <E> UaiCriteria<T> andAttributeNotIn(final String attributeName, final UaiCriteria<E> uaiSubQuery) { throw subQueryNotAllowed(); } public UaiCriteria<T> andStringNotLike(final boolean toLowerCase, final String attributeName, final String value) { criteriaConditionTypeList.add(new CriteriaConditionHolder(toLowerCase, attributeName, CriteriaConditionType.STRING_NOT_LIKE, value)); return this; } public UaiCriteria<T> andStringIn(final String attributeName, final List<String> valueList) { return andStringIn(DO_NOT_APPLY_LOWER_CASE, attributeName, valueList); } public UaiCriteria<T> andStringIn(final boolean toLowerCase, final String attributeName, final List<String> valueList) { criteriaConditionTypeList.add(new CriteriaConditionHolder(toLowerCase, attributeName, CriteriaConditionType.STRING_IN, valueList.toArray())); return this; } public UaiCriteria<T> andStringNotIn(final String attributeName, final List<String> valueList) { return andStringNotIn(DO_NOT_APPLY_LOWER_CASE, attributeName, valueList); } public UaiCriteria<T> andStringNotIn(final boolean toLowerCase, final String attributeName, final List<String> valueList) { criteriaConditionTypeList.add(new CriteriaConditionHolder(toLowerCase, attributeName, CriteriaConditionType.STRING_NOT_IN, valueList.toArray())); return this; } public UaiCriteria<T> orderByAsc(final String attributeName) { orderByList.add(new OrderByHolder(ORDER_BY_ASC, attributeName)); return this; } public UaiCriteria<T> orderByDesc(final String attributeName) { orderByList.add(new OrderByHolder(ORDER_BY_DESC, attributeName)); return this; } public UaiCriteria<T> setFirstResult(final Integer firstResult) { this.firstResult = firstResult; return this; } public UaiCriteria<T> setMaxResults(final Integer maxResults) { this.maxResults = maxResults; return this; } public UaiCriteria<T> addAndSeparatedByOr(final int index, final String attributeName, final Object value) { criteriaConditionTypeList.add(new CriteriaConditionHolder(index, DO_NOT_APPLY_LOWER_CASE, attributeName, CriteriaConditionType.AND_SEPARATED_BY_OR, value)); return this; } public UaiCriteria<T> addAndSeparatedByOr(final boolean toLowerCase, final int index, final String attributeName, final String value) { criteriaConditionTypeList.add(new CriteriaConditionHolder(index, toLowerCase, attributeName, CriteriaConditionType.AND_SEPARATED_BY_OR, value)); return this; } public UaiCriteria<T> addHint(final String key, final String value) { criteriaConditionTypeList.add(new CriteriaConditionHolder(CriteriaConditionType.HINT, key, value)); return this; } @Override public UaiCriteria<T> sum(final String... attributeNameArray) { criteriaConditionTypeList.add(new CriteriaConditionHolder(CriteriaConditionType.SUM_ATTRIBUTE_ONLY, attributeNameArray)); return this; } @Override public <N extends Number> UaiCriteria<T> sum(final String attributeName, final N number) { criteriaConditionTypeList.add(new CriteriaConditionHolder(CriteriaConditionType.SUM_ATTRIBUTE_WITH_NUMBER, attributeName, number)); return this; } @Override public <N extends Number> UaiCriteria<T> sum(final N number, final String attributeName) { criteriaConditionTypeList.add(new CriteriaConditionHolder(CriteriaConditionType.SUM_NUMBER_WITH_ATTRIBUTE, attributeName, number)); return this; } @Override public UaiCriteria<T> diff(final String firstAttribute, final String secondAttribute) { criteriaConditionTypeList.add(new CriteriaConditionHolder(CriteriaConditionType.DIFF_ATTRIBUTE_ONLY, firstAttribute, secondAttribute)); return this; } @Override public <N extends Number> UaiCriteria<T> diff(final String attributeName, final N number) { criteriaConditionTypeList.add(new CriteriaConditionHolder(CriteriaConditionType.DIFF_ATTRIBUTE_WITH_NUMBER, attributeName, number)); return this; } @Override public <N extends Number> UaiCriteria<T> diff(final N number, final String attributeName) { criteriaConditionTypeList.add(new CriteriaConditionHolder(CriteriaConditionType.DIFF_NUMBER_WITH_ATTRIBUTE, attributeName, number)); return this; } @Override public UaiCriteria<T> multiply(final String firstAttribute, final String secondAttribute) { criteriaConditionTypeList.add(new CriteriaConditionHolder(CriteriaConditionType.MULTIPLY_ATTRIBUTE_ONLY, firstAttribute, secondAttribute)); return this; } @Override public <N extends Number> UaiCriteria<T> multiply(final String attributeName, final N number) { criteriaConditionTypeList.add(new CriteriaConditionHolder(CriteriaConditionType.MULTIPLY_ATTRIBUTE_WITH_NUMBER, attributeName, number)); return this; } @Override public <N extends Number> UaiCriteria<T> multiply(final N number, final String attributeName) { criteriaConditionTypeList.add(new CriteriaConditionHolder(CriteriaConditionType.MULTIPLY_NUMBER_WITH_ATTRIBUTE, attributeName, number)); return this; } @Override public UaiCriteria<T> divide(final String firstAttribute, final String secondAttribute) { criteriaConditionTypeList.add(new CriteriaConditionHolder(CriteriaConditionType.DIV_ATTRIBUTE_ONLY, firstAttribute, secondAttribute)); return this; } @Override public <N extends Number> UaiCriteria<T> divide(final String attributeName, final N number) { criteriaConditionTypeList.add(new CriteriaConditionHolder(CriteriaConditionType.DIV_ATTRIBUTE_WITH_NUMBER, attributeName, number)); return this; } @Override public <N extends Number> UaiCriteria<T> divide(final N number, final String attributeName) { criteriaConditionTypeList.add(new CriteriaConditionHolder(CriteriaConditionType.DIV_NUMBER_WITH_ATTRIBUTE, attributeName, number)); return this; } @Override public UaiCriteria<T> module(final String firstAttribute, final String secondAttribute) { criteriaConditionTypeList.add(new CriteriaConditionHolder(CriteriaConditionType.MODULE_ATTRIBUTE_ONLY, firstAttribute, secondAttribute)); return this; } @Override public UaiCriteria<T> module(final String attributeName, final Integer number) { criteriaConditionTypeList.add(new CriteriaConditionHolder(CriteriaConditionType.MODULE_ATTRIBUTE_WITH_NUMBER, attributeName, number)); return this; } @Override public UaiCriteria<T> module(final Integer number, final String attributeName) { criteriaConditionTypeList.add(new CriteriaConditionHolder(CriteriaConditionType.MODULE_NUMBER_WITH_ATTRIBUTE, attributeName, number)); return this; } @Override public UaiCriteria<T> average(final String... attributeNameArray) { criteriaConditionTypeList.add(new CriteriaConditionHolder(CriteriaConditionType.AVG, attributeNameArray)); return this; } @Override public UaiCriteria<T> square(final String... attributeNameArray) { criteriaConditionTypeList.add(new CriteriaConditionHolder(CriteriaConditionType.SQUARE, attributeNameArray)); return this; } @Override public UaiCriteria<T> addMultiSelectAttribute(final String... attributeNameArray) { multiselectAttributeList.addAll(Arrays.asList(attributeNameArray)); return this; } @Override public UaiCriteria<T> groupBy(final String... attributeNameArray) { groupByList.addAll(Arrays.asList(attributeNameArray)); return this; } Integer getFirstResult() { return firstResult; } Integer getMaxResults() { return maxResults; } }