package cn.jimmyshi.beanquery.selectors; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.ListUtils; import org.apache.commons.lang3.ArrayUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class CompositeSelector extends KeyValueMapSelector{ private transient Logger logger = LoggerFactory.getLogger(CompositeSelector.class); private static final List<KeyValueMapSelector> SINGLETON_NULL_LIST = Collections.singletonList(null); private final List<KeyValueMapSelector> selectors; public CompositeSelector(KeyValueMapSelector... selectors) { if (ArrayUtils.isEmpty(selectors)) { this.selectors = new LinkedList<KeyValueMapSelector>(); } else { this.selectors = new LinkedList<KeyValueMapSelector>(Arrays.asList(selectors)); removeNullSubSelectors(); } } CompositeSelector() { this.selectors = new LinkedList<KeyValueMapSelector>(); } CompositeSelector(List<? extends KeyValueMapSelector> selectors) { this.selectors = new ArrayList<KeyValueMapSelector>(ListUtils.emptyIfNull(selectors)); removeNullSubSelectors(); } private void removeNullSubSelectors() { this.selectors.removeAll(SINGLETON_NULL_LIST); } CompositeSelector addSubSelector(KeyValueMapSelector subSelector) { if (null != subSelector) { this.selectors.add(subSelector); } return this; } @Override protected Map<String, Object> doSelect(Object item) { if (CollectionUtils.isEmpty(selectors)) { logger.debug("Not any subSelectors found, returning emptyMap"); return Collections.emptyMap(); } Map<String, Object> result = new LinkedHashMap<String, Object>(); for (KeyValueMapSelector selector : selectors) { result.putAll(selector.select(item)); } return result; } }