blob: a6b888387d0180da41cacf7faa76603656bd5eda [file] [log] [blame]
/*-
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.sling.query.impl.selector.parser;
import org.apache.commons.lang.ArrayUtils;
public enum State {
START {
@Override
public void process(ParserContext context, char c) {
if (c == '/') {
context.setState(State.TYPE_WITH_SLASHES);
context.append(c);
} else if (c == '[') {
context.setState(State.ATTRIBUTE_KEY);
} else if (c == ':') {
context.setState(State.MODIFIER);
} else if (c == '>' || c == '+' || c == '~') {
context.setHierarchyOperator(c);
} else if (c == '#') {
context.setType();
context.setState(NAME);
} else if (c != ' ') {
context.setState(State.TYPE);
context.append(c);
}
}
},
IDLE {
@Override
public void process(ParserContext context, char c) {
if (c == '[') {
context.setState(State.ATTRIBUTE_KEY);
} else if (c == ':') {
context.setState(State.MODIFIER);
} else if (c == ' ') {
context.finishSelectorSegment();
context.setState(START);
} else if (c == ',' || c == 0) {
context.finishSelectorSegment();
context.finishSelector();
context.setState(START);
}
}
},
TYPE {
@Override
public void process(ParserContext context, char c) {
if (c == '/') {
context.setState(State.TYPE_WITH_SLASHES);
context.append(c);
} else if (c == '[') {
context.setState(State.ATTRIBUTE_KEY);
context.setType();
} else if (c == ':') {
context.setState(State.TYPE_WITH_SLASHES);
context.append(c);
} else if (c == '#') {
context.setType();
context.setState(NAME);
} else if (c == ' ') {
context.setType();
context.finishSelectorSegment();
context.setState(START);
} else if (c == ',' || c == 0) {
context.setType();
context.finishSelectorSegment();
context.finishSelector();
context.setState(START);
} else {
context.append(c);
}
}
},
TYPE_WITH_SLASHES {
@Override
public void process(ParserContext context, char c) {
if (c == '[') {
context.setState(State.ATTRIBUTE_KEY);
context.setType();
} else if (c == ':') {
context.setState(State.MODIFIER);
context.setType();
} else if (c == '#') {
context.setType();
context.setState(NAME);
} else if (c == ' ') {
context.setType();
context.finishSelectorSegment();
context.setState(START);
} else if (c == ',' || c == 0) {
context.setType();
context.finishSelectorSegment();
context.finishSelector();
context.setState(START);
} else {
context.append(c);
}
}
},
NAME {
@Override
public void process(ParserContext context, char c) {
if (c == '[') {
context.setName();
context.setState(State.ATTRIBUTE_KEY);
} else if (c == ':') {
context.setName();
context.setState(State.MODIFIER);
} else if (c == ' ') {
context.setName();
context.finishSelectorSegment();
context.setState(START);
} else if (c == ',' || c == 0) {
context.setName();
context.finishSelectorSegment();
context.finishSelector();
context.setState(START);
} else if (c == '\'') {
context.setState(State.ESCAPED_NAME);
} else {
context.append(c);
}
}
},
ESCAPED_NAME {
@Override
public void process(ParserContext context, char c) {
if (c == '\'') {
context.setName();
context.setState(IDLE);
} else {
context.append(c);
}
}
},
ATTRIBUTE_KEY {
@Override
public void process(ParserContext context, char c) {
if (c == ']') {
context.setAttributeKey();
context.addAttribute();
context.setState(State.IDLE);
} else if (ArrayUtils.contains(OPERATORS, c)) {
context.setAttributeKey();
context.setState(State.ATTRIBUTE_OPERATOR);
context.append(c);
} else {
context.append(c);
}
}
},
ATTRIBUTE_OPERATOR {
@Override
public void process(ParserContext context, char c) {
if (!ArrayUtils.contains(OPERATORS, c)) {
context.setAttributeOperator();
context.append(c);
context.setState(ATTRIBUTE_VALUE);
} else {
context.append(c);
}
}
},
ATTRIBUTE_VALUE {
@Override
public void process(ParserContext context, char c) {
if (c == ']') {
context.setState(State.IDLE);
context.setAttributeValue();
context.addAttribute();
} else {
context.append(c);
}
}
},
MODIFIER {
@Override
public void process(ParserContext context, char c) {
if (c == ':') {
context.addModifier();
} else if (c == '(') {
context.setModifierName();
context.setState(State.MODIFIER_ARGUMENT);
context.increaseParentheses();
} else if (c == ' ') {
context.addModifier();
context.finishSelectorSegment();
context.setState(START);
} else if (c == ',' || c == 0) {
context.addModifier();
context.finishSelectorSegment();
context.finishSelector();
context.setState(START);
} else {
context.append(c);
}
}
},
MODIFIER_ARGUMENT {
@Override
public void process(ParserContext context, char c) {
if (c == ')') {
if (context.decreaseParentheses() == 0) {
context.addModifier();
context.setState(IDLE);
} else {
context.append(c);
}
} else if (c == '(') {
context.increaseParentheses();
context.append(c);
} else {
context.append(c);
}
}
};
public abstract void process(ParserContext context, char c);
private static final char[] OPERATORS = "*~$!^=".toCharArray();
}