org.betaconceptframework.astroboa.model.impl.query.criteria.TopicCriteriaImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.betaconceptframework.astroboa.model.impl.query.criteria.TopicCriteriaImpl.java

Source

/*
 * Copyright (C) 2005-2012 BetaCONCEPT Limited
 *
 * This file is part of Astroboa.
 *
 * Astroboa is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Astroboa is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with Astroboa.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.betaconceptframework.astroboa.model.impl.query.criteria;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.betaconceptframework.astroboa.api.model.Taxonomy;
import org.betaconceptframework.astroboa.api.model.query.Condition;
import org.betaconceptframework.astroboa.api.model.query.Order;
import org.betaconceptframework.astroboa.api.model.query.QueryOperator;
import org.betaconceptframework.astroboa.api.model.query.criteria.Criterion;
import org.betaconceptframework.astroboa.api.model.query.criteria.SimpleCriterion;
import org.betaconceptframework.astroboa.api.model.query.criteria.TaxonomyCriteria;
import org.betaconceptframework.astroboa.api.model.query.criteria.TopicCriteria;
import org.betaconceptframework.astroboa.model.factory.CmsCriteriaFactory;
import org.betaconceptframework.astroboa.model.factory.CriterionFactory;
import org.betaconceptframework.astroboa.model.impl.item.CmsBuiltInItem;
import org.betaconceptframework.astroboa.model.impl.item.ItemUtils;
import org.betaconceptframework.astroboa.model.impl.query.xpath.XPathUtils;
import org.betaconceptframework.astroboa.util.CmsConstants;

/**
 * @author Gregory Chomatas (gchomatas@betaconcept.com)
 * @author Savvas Triantafyllou (striantafyllou@betaconcept.com)
 * 
 */
public class TopicCriteriaImpl extends CmsCriteriaImpl implements TopicCriteria, Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 6769105250768596934L;

    private TopicCriteria ancestorCriteria;

    public TopicCriteriaImpl() {
        nodeType = CmsBuiltInItem.Topic;
    }

    /**
     * Criteria for parent topics 
     * @param ancestorCriteria
     */
    public void setAncestorCriteria(TopicCriteria ancestorCriteria) {
        this.ancestorCriteria = ancestorCriteria;
    }

    public TopicCriteria getAncestorCriteria() {
        return ancestorCriteria;
    }

    public void addAllowsReferrerContentObjectsCriterion(boolean allowsReferrerContentObjects) {
        addCriterion(CriterionFactory.equals(CmsBuiltInItem.AllowsReferrerContentObjects.getJcrName(),
                allowsReferrerContentObjects));
    }

    public void addOwnerIdEqualsCriterion(String topicOwnerId) {
        if (topicOwnerId != null) {
            List<String> topicOwnerIds = new ArrayList<String>();
            topicOwnerIds.add(topicOwnerId);

            addOwnerIdsCriterion(QueryOperator.EQUALS, topicOwnerIds, Condition.AND);
        }
    }

    public void addOwnerIdsCriterion(QueryOperator queryOperator, List<String> topicOwnerIds,
            Condition internalCondition) {
        if (CollectionUtils.isNotEmpty(topicOwnerIds)) {
            SimpleCriterion ownerCriterion = CriterionFactory.newSimpleCriterion();

            ownerCriterion.setProperty(CmsBuiltInItem.OwnerCmsIdentifier.getJcrName());

            //set default condition
            if (internalCondition == null)
                ownerCriterion.setInternalCondition(Condition.OR);
            else
                ownerCriterion.setInternalCondition(internalCondition);

            ownerCriterion.setOperator(queryOperator);

            for (String topicOwnerId : topicOwnerIds) {
                if (StringUtils.isNotBlank(topicOwnerId))
                    ownerCriterion.addValue(topicOwnerId);
            }

            addCriterion(ownerCriterion);
        }
    }

    public void addAncestorTopicIdEqualsCriterion(String parentTopicId) {
        if (getAncestorCriteria() == null) {

            createAncestorCriteria();
        }

        if (getAncestorCriteria() != null) {
            getAncestorCriteria().addCriterion(
                    CriterionFactory.equals(CmsBuiltInItem.CmsIdentifier.getJcrName(), parentTopicId));
        }

    }

    public void addAnyAncestorTopicIdEqualsCriterion(List<String> ancestorTopicIds) {
        if (CollectionUtils.isEmpty(ancestorTopicIds)) {
            return;
        }

        if (getAncestorCriteria() == null) {
            createAncestorCriteria();
        }

        if (getAncestorCriteria() != null) {
            getAncestorCriteria().addCriterion(CriterionFactory.equals(CmsBuiltInItem.CmsIdentifier.getJcrName(),
                    Condition.OR, ancestorTopicIds));
        }

    }

    private void createAncestorCriteria() {
        ancestorCriteria = new TopicCriteriaImpl();
    }

    public void addNameEqualsCriterion(String name) {
        addCriterion(CriterionFactory.equals(CmsBuiltInItem.Name.getJcrName(), name));

    }

    public void addNameEqualsCaseInsensitiveCriterion(String name) {
        addCriterion(CriterionFactory.equalsCaseInsensitive(CmsBuiltInItem.Name.getJcrName(), name));

    }

    public void addOrderByLocale(String locale, Order order) {
        if (StringUtils.isNotBlank(locale))
            addOrderProperty(CmsBuiltInItem.Localization.getJcrName() + CmsConstants.FORWARD_SLASH
                    + ItemUtils.createNewBetaConceptItem(locale).getJcrName(), order);

    }

    @Override
    public void reset() {
        super.reset();

        ancestorCriteria = null;

    }

    @Override
    protected String getAncestorQuery() {
        //Create Ancestor Criteria but no order by is required
        if (ancestorCriteria != null) {

            if (ancestorCriteria.getOrderProperties() != null)
                ancestorCriteria.resetOrderProperties();

            return ancestorCriteria.getXPathQuery();
        }

        return null;
    }

    @Override
    public void searchInDirectAncestorOnly() {
        setNodeTypeAsAChildNodeOnly();
    }

    /**
     * @param taxonomyName the taxonomy to set
     */
    public void addTaxonomyCriterion(Taxonomy taxonomy) {
        if (taxonomy != null) {
            if (CmsBuiltInItem.Folksonomy.getJcrName().equals(taxonomy.getName()))
                addFolksonomyCriterion(null, taxonomy.getId());
            else {
                if (taxonomy.getName() != null) {
                    //   For all other taxonomies only name is adequate
                    addTaxonomyNameEqualsCriterion(taxonomy.getName());
                } else if (taxonomy.getId() != null) {
                    addTaxonomyIdEqualsCriterion(taxonomy.getId());
                }
            }

        }
    }

    public void addFolksonomyCriterion(String repositoryUserId, String folksonomyId) {

        Criterion repositoryIdCriterion = null;
        if (StringUtils.isNotBlank(repositoryUserId))
            repositoryIdCriterion = CriterionFactory.equals(CmsBuiltInItem.CmsIdentifier.getJcrName(),
                    repositoryUserId);

        Criterion folksonomyCriterion = null;
        if (StringUtils.isNotBlank(folksonomyId)) {
            folksonomyCriterion = CriterionFactory.equals(CmsBuiltInItem.CmsIdentifier.getJcrName(), folksonomyId);
        }

        setPathCriterion(XPathUtils.getRelativeFolksonomyPath(repositoryIdCriterion, folksonomyCriterion));
    }

    public void addTaxonomyNameEqualsCriterion(String taxonomyName) {
        if (StringUtils.isNotBlank(taxonomyName))
            setPathCriterion(XPathUtils.getRelativeTaxonomyPath(taxonomyName, true));

    }

    public void addTaxonomyIdEqualsCriterion(String taxonomyId) {
        if (StringUtils.isNotBlank(taxonomyId)) {
            TaxonomyCriteria taxonomyCriteria = CmsCriteriaFactory.newTaxonomyCriteria();
            taxonomyCriteria.addIdEqualsCriterion(taxonomyId);

            setPathCriterion(taxonomyCriteria.getXPathQuery());
        }

    }

    @Override
    public void addOrderProperty(String propertyPath, Order order) {
        if (StringUtils.isNotBlank(propertyPath)) {
            //Reserved words
            //Label corresponds to CmsBuiltInItem.Localization.getJcrName() property
            if (StringUtils.equals("label", propertyPath)) {
                super.addOrderProperty(CmsBuiltInItem.Localization.getJcrName(), order);
            } else if (propertyPath.startsWith("label.")) {
                //user may have provided specific lang in order, for example label.en 
                //Remove label prefix and use only lang code
                addOrderByLocale(StringUtils.removeStart(propertyPath, "label."), order);
            } else if (StringUtils.equals("name", propertyPath)) {
                //user requested ordering by topic name
                super.addOrderProperty(CmsBuiltInItem.Name.getJcrName(), order);
            } else if (StringUtils.equals("id", propertyPath)) {
                //user requested ordering by topic name
                super.addOrderProperty(CmsBuiltInItem.CmsIdentifier.getJcrName(), order);
            } else {
                super.addOrderProperty(propertyPath, order);
            }
        }

    }

}