org.craftercms.engine.service.impl.SiteItemServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.craftercms.engine.service.impl.SiteItemServiceImpl.java

Source

/*
 * Copyright (C) 2007-2013 Crafter Software Corporation.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.craftercms.engine.service.impl;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.collections.MapUtils;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.Predicate;
import org.apache.commons.collections4.PredicateUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.craftercms.commons.converters.Converter;
import org.craftercms.core.processors.ItemProcessor;
import org.craftercms.core.processors.impl.ItemProcessorPipeline;
import org.craftercms.core.service.Content;
import org.craftercms.core.service.ContentStoreService;
import org.craftercms.core.service.Item;
import org.craftercms.core.service.ItemFilter;
import org.craftercms.core.service.Tree;
import org.craftercms.core.service.impl.CompositeItemFilter;
import org.craftercms.engine.model.SiteItem;
import org.craftercms.engine.service.SiteItemService;
import org.craftercms.engine.service.context.SiteContext;
import org.craftercms.engine.service.filter.ExcludeByNameItemFilter;
import org.craftercms.engine.service.filter.ExpectedNodeValueItemFilter;
import org.craftercms.engine.service.filter.IncludeByNameItemFilter;
import org.springframework.beans.factory.annotation.Required;

/**
 * Default implementation of {@link SiteItemService}.
 *
 * @author Alfonso Vsquez
 */
public class SiteItemServiceImpl implements SiteItemService {

    protected ContentStoreService storeService;
    protected List<Predicate<Item>> defaultPredicates;
    protected List<ItemFilter> defaultFilters;
    protected List<ItemProcessor> defaultProcessors;
    protected Map<String, Converter<String, ?>> modelValueConverters;
    protected Comparator<SiteItem> sortComparator;

    @Required
    public void setStoreService(ContentStoreService storeService) {
        this.storeService = storeService;
    }

    public void setDefaultPredicates(List<Predicate<Item>> defaultPredicates) {
        this.defaultPredicates = defaultPredicates;
    }

    public void setDefaultFilters(List<ItemFilter> defaultFilters) {
        this.defaultFilters = defaultFilters;
    }

    public void setDefaultProcessors(List<ItemProcessor> defaultProcessors) {
        this.defaultProcessors = defaultProcessors;
    }

    @Required
    public void setModelValueConverters(Map<String, Converter<String, ?>> modelValueConverters) {
        this.modelValueConverters = modelValueConverters;
    }

    public void setSortComparator(Comparator<SiteItem> sortComparator) {
        this.sortComparator = sortComparator;
    }

    @Override
    public Content getRawContent(String url) {
        return storeService.findContent(getSiteContext().getContext(), url);
    }

    @Override
    public SiteItem getSiteItem(String url) {
        return getSiteItem(url, null);
    }

    @Override
    public SiteItem getSiteItem(String url, ItemProcessor processor) {
        return getSiteItem(url, processor, null);
    }

    @Override
    public SiteItem getSiteItem(String url, ItemProcessor processor, Predicate<Item> predicate) {
        if (CollectionUtils.isNotEmpty(defaultPredicates)) {
            List<Predicate<Item>> predicates = new ArrayList<>(defaultPredicates);

            if (predicate != null) {
                predicates.add(predicate);
            }

            predicate = PredicateUtils.allPredicate(predicates);
        }
        if (CollectionUtils.isNotEmpty(defaultProcessors)) {
            ItemProcessorPipeline processorPipeline = new ItemProcessorPipeline(new ArrayList<>(defaultProcessors));

            if (processor != null) {
                processorPipeline.addProcessor(processor);
            }

            processor = processorPipeline;
        }

        Item item = storeService.findItem(getSiteContext().getContext(), null, url, processor);
        if (item != null && (predicate == null || predicate.evaluate(item))) {
            return createItemWrapper(item);
        } else {
            return null;
        }
    }

    @Override
    public SiteItem getSiteTree(String url, int depth) {
        return getSiteTree(url, depth, null, (ItemProcessor) null);
    }

    @Override
    public SiteItem getSiteTree(String url, int depth, ItemFilter filter, ItemProcessor processor) {
        if (CollectionUtils.isNotEmpty(defaultFilters)) {
            CompositeItemFilter compositeFilter = new CompositeItemFilter(new ArrayList<>(defaultFilters));

            if (filter != null) {
                compositeFilter.addFilter(filter);
            }

            filter = compositeFilter;
        }

        if (CollectionUtils.isNotEmpty(defaultProcessors)) {
            ItemProcessorPipeline processorPipeline = new ItemProcessorPipeline(new ArrayList<>(defaultProcessors));

            if (processor != null) {
                processorPipeline.addProcessor(processor);
            }

            processor = processorPipeline;
        }

        Tree tree = storeService.findTree(getSiteContext().getContext(), null, url, depth, filter, processor);
        if (tree != null) {
            return createItemWrapper(tree);
        } else {
            return null;
        }
    }

    @Deprecated
    @Override
    public SiteItem getSiteTree(String url, int depth, String includeByNameRegex, String excludeByNameRegex) {
        return getSiteTree(url, depth, includeByNameRegex, excludeByNameRegex, (Map<String, String>) null);
    }

    @Deprecated
    @Override
    public SiteItem getSiteTree(String url, int depth, String includeByNameRegex, String excludeByNameRegex,
            String[]... nodeXPathAndExpectedValuePairs) {
        Map<String, String> nodeXPathAndExpectedValuePairMap = null;

        if (ArrayUtils.isNotEmpty(nodeXPathAndExpectedValuePairs)) {
            nodeXPathAndExpectedValuePairMap = new HashMap<>();

            for (String[] nodeXPathAndExpectedValuePair : nodeXPathAndExpectedValuePairs) {
                String nodeXPathQuery = nodeXPathAndExpectedValuePair[0];
                String expectedNodeValueRegex = nodeXPathAndExpectedValuePair[1];

                nodeXPathAndExpectedValuePairMap.put(nodeXPathQuery, expectedNodeValueRegex);
            }
        }

        return getSiteTree(url, depth, includeByNameRegex, excludeByNameRegex, nodeXPathAndExpectedValuePairMap);
    }

    @Deprecated
    @Override
    public SiteItem getSiteTree(String url, int depth, String includeByNameRegex, String excludeByNameRegex,
            Map<String, String> nodeXPathAndExpectedValuePairs) {
        CompositeItemFilter compositeFilter = new CompositeItemFilter();

        if (CollectionUtils.isNotEmpty(defaultFilters)) {
            for (ItemFilter defaultFilter : defaultFilters) {
                compositeFilter.addFilter(defaultFilter);
            }
        }

        if (StringUtils.isNotEmpty(includeByNameRegex)) {
            compositeFilter.addFilter(new IncludeByNameItemFilter(includeByNameRegex));
        }
        if (StringUtils.isNotEmpty(excludeByNameRegex)) {
            compositeFilter.addFilter(new ExcludeByNameItemFilter(excludeByNameRegex));
        }

        if (MapUtils.isNotEmpty(nodeXPathAndExpectedValuePairs)) {
            for (Map.Entry<String, String> pair : nodeXPathAndExpectedValuePairs.entrySet()) {
                compositeFilter.addFilter(new ExpectedNodeValueItemFilter(pair.getKey(), pair.getValue()));
            }
        }

        Tree tree = storeService.findTree(getSiteContext().getContext(), null, url, depth, compositeFilter, null);
        if (tree != null) {
            return createItemWrapper(tree);
        } else {
            return null;
        }
    }

    protected SiteContext getSiteContext() {
        SiteContext siteContext = SiteContext.getCurrent();
        if (siteContext == null) {
            throw new IllegalStateException("No current site context found");
        }

        return siteContext;
    }

    protected SiteItem createItemWrapper(Item item) {
        return new SiteItem(item, modelValueConverters, sortComparator);
    }

}