de.espirit.firstspirit.access.store.StoreElementFilterExample


package de.espirit.firstspirit.access.store;

import de.espirit.common.util.Listable;
import de.espirit.firstspirit.access.UserService;
import de.espirit.firstspirit.access.project.Project;
import de.espirit.firstspirit.access.store.Store.Type;
import de.espirit.firstspirit.access.store.pagestore.Page;
import de.espirit.firstspirit.access.store.pagestore.PageFolder;
import de.espirit.firstspirit.access.store.pagestore.PageStoreRoot;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;


/**
 * Example how to use StoreElementFilter.
 *
 * @since 4.2.410
 */
public class StoreElementFilterExample {


	/**
	 * Example how to use a StoreElementFilter which filters PageFolders and Pages within the {@link PageStoreRoot PageStore} of the given {@link Project} using an iterator.<br/>
	 *
	 * <b>Important:</b> In case of usage in a Beanshell script the usage of an iterator is mandatory, because Beanshell doesn't support java "for each" syntax.
	 * For usage in java code the "for each" syntax is recommended -> see {@link #getFilteredChildren_ForEach(de.espirit.firstspirit.access.project.Project)} for details.
	 *
	 * @return the filtered storelements
	 * @see #getFilteredChildren_ForEach(de.espirit.firstspirit.access.project.Project)
	 * @since 4.2.410
	 */
	public Map<String, IDProvider> getFilteredChildren_Iterator(final Project project) {
		final UserService userService = project.getUserService();
		final Store currentPageStore = userService.getStore(Type.PAGESTORE, false);

		final StoreElementFilter filter = StoreElementFilter.on(PageFolder.class, Page.class);

		// get filtered children recursive
		final Listable<StoreElement> filteredListable = currentPageStore.getChildren(filter, true);

		final Map<String, IDProvider> result = new HashMap<String, IDProvider>();

		final Iterator<StoreElement> filteredIterator = filteredListable.iterator();
		while (filteredIterator.hasNext()) {
			// we filtered on Page and PageFolder, therefore we can cast to IdProvider without risk
			final IDProvider idProvider = (IDProvider) filteredIterator.next();
			if (idProvider.hasUid()) {
				result.put(idProvider.getUid(), idProvider);
			}
		}

		return result;
	}


	/**
	 * Example how to use a StoreElementFilter which filters PageFolders and Pages within the {@link PageStoreRoot PageStore} of the given {@link Project} using "for each" syntax.<br/>
	 *
	 * <b>Important:</b> In a Beanshell script the "for each" is not supported, therefore an iterator should be used -> see {@link #getFilteredChildren_Iterator(de.espirit.firstspirit.access.project.Project)} for details.
	 *
	 * @return the filtered storelements
	 * @see #getFilteredChildren_Iterator(de.espirit.firstspirit.access.project.Project)
	 * @since 4.2.410
	 */
	public Map<String, IDProvider> getFilteredChildren_ForEach(final Project project) {
		final UserService userService = project.getUserService();
		final Store currentPageStore = userService.getStore(Type.PAGESTORE, false);

		final StoreElementFilter filter = StoreElementFilter.on(PageFolder.class, Page.class);

		// get filtered children recursive
		final Listable<StoreElement> filteredListable = currentPageStore.getChildren(filter, true);

		final Map<String, IDProvider> result = new HashMap<String, IDProvider>();

		for (final StoreElement storeElement : filteredListable) {
			// we filtered on Page and PageFolder, therefore we can cast to IdProvider without risk
			final IDProvider idProvider = (IDProvider) storeElement;
			if (idProvider.hasUid()) {
				result.put(idProvider.getUid(), idProvider);
			}
		}

		return result;
	}
}