package org.skyscreamer.yoga.selector.parser; import org.skyscreamer.yoga.configuration.EntityConfigurationRegistry; import org.skyscreamer.yoga.exceptions.ParseSelectorException; import org.skyscreamer.yoga.selector.FieldSelector; /** * A SelectorParser takes a string selector argument and translates it into a * Selector which is used to navigate the object tree and build results. * * @author Solomon Duskis <solomon@skyscreamer.org> * @author Corby Page <corby@skyscreamer.org> * @author Carter Page <carter@skyscreamer.org> */ public abstract class SelectorParser { public static final String ALIAS_SELECTOR_PREFIX = "$"; public static final String HREF = "href"; public static final String DEFINITION = "definition"; protected AliasSelectorResolver _aliasSelectorResolver; protected boolean _disableExplicitSelectors = false; protected abstract FieldSelector parse( String selectorExpression ) throws ParseSelectorException; public abstract String getSelectorJavascriptURL(); public abstract Object getSelectorType(); public FieldSelector parseSelector( String selectorExpression ) throws ParseSelectorException { if ( selectorExpression == null ) { return null; } if ( _disableExplicitSelectors && !selectorExpression.startsWith( ALIAS_SELECTOR_PREFIX ) ) { throw new ParseSelectorException( "Explicit selectors have been disabled" ); } if ( selectorExpression.startsWith( ALIAS_SELECTOR_PREFIX ) ) { selectorExpression = _aliasSelectorResolver.resolveSelector( selectorExpression ); } FieldSelector fieldSelector = parse( selectorExpression ); if(fieldSelector != null && !fieldSelector.getAllPossibleFieldMap( null ).isEmpty() ) { return fieldSelector; } else { return null; } } public void setAliasSelectorResolver( AliasSelectorResolver aliasSelectorResolver ) { _aliasSelectorResolver = aliasSelectorResolver; } public void setDisableExplicitSelectors( boolean disableExplicitSelectors ) { _disableExplicitSelectors = disableExplicitSelectors; } @Deprecated /** this method wasn't all that useful. This registry really only helped the Core selector, not the url parsed fields */ public void setEntityConfigurationRegistry( EntityConfigurationRegistry entityConfigurationRegistry) { } }