package cn.jimmyshi.beanquery.selectors; import java.util.Map; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Selector to support create property selector via String parameter. */ public class StringSelector extends KeyValueMapSelector { private transient Logger logger = LoggerFactory.getLogger(StringSelector.class); private CompositeSelector compositeSelector = new CompositeSelector(); /** * Create selectors with String. * * @param selectString * String in format "propertyName as alias[,propertyName as alias]" */ public StringSelector(String selectString) { logger.info("Constructing StringSelector with String [{}]", selectString); if (StringUtils.isBlank(selectString)) { logger.info("Constructing StringSelector with blank selectString"); return; } String[] propertyStrings = StringUtils.split(selectString, ','); initCompositeSelector(propertyStrings); } /** * Create selectors with property string * * @param propertyStrings * Strings in format "propertyName[as alias]" */ public StringSelector(String... propertyStrings) { logger.info("Construct StringSelector with propertyStrings [{}]", (Object) propertyStrings); initCompositeSelector(propertyStrings); } private void initCompositeSelector(String[] propertyStrings) { if (ArrayUtils.isEmpty(propertyStrings)) { logger.debug("Initing StringSelector with empty property String."); return; } for (String propertyString : propertyStrings) { if (StringUtils.isNotBlank(propertyString)) { final PropertySelector propertySelector = createPropertySelector(propertyString); compositeSelector.addSubSelector(propertySelector); } } logger.info("StringSelector [{}] initilized.", this); } private PropertySelector createPropertySelector(String propertyString) { String[] propertyTokens = StringUtils.splitByWholeSeparator(propertyString, " as ", 2); final PropertySelector propertySelector; String propertySelectorPropertyName = propertyTokens[0].trim(); if (propertyTokens.length == 2) { String propertySelectorAlias = propertyTokens[1].trim(); propertySelector = new PropertySelector(propertySelectorPropertyName, propertySelectorAlias); } else { propertySelector = new PropertySelector(propertySelectorPropertyName); } return propertySelector; } @Override protected Map<String, Object> doSelect(Object item) { return compositeSelector.select(item); } }