/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.dynamic.data.mapping.form.values.query.internal; import com.liferay.dynamic.data.mapping.form.values.query.internal.model.DDMFormFieldValueMatcher; import com.liferay.dynamic.data.mapping.form.values.query.internal.model.DDMFormFieldValueMatchesAllMatcher; import com.liferay.dynamic.data.mapping.form.values.query.internal.model.DDMFormFieldValueMatchesAnyMatcher; import com.liferay.dynamic.data.mapping.form.values.query.internal.model.DDMFormFieldValueNameMatcher; import com.liferay.dynamic.data.mapping.form.values.query.internal.model.DDMFormFieldValueTypeMatcher; import com.liferay.dynamic.data.mapping.form.values.query.internal.model.DDMFormFieldValueValueMatcher; import com.liferay.dynamic.data.mapping.form.values.query.internal.model.DDMFormValuesFilter; import com.liferay.dynamic.data.mapping.form.values.query.internal.model.DDMFormValuesFilterImpl; import com.liferay.dynamic.data.mapping.form.values.query.internal.parser.DDMFormValuesQueryBaseListener; import com.liferay.dynamic.data.mapping.form.values.query.internal.parser.DDMFormValuesQueryParser.AttributeTypeContext; import com.liferay.dynamic.data.mapping.form.values.query.internal.parser.DDMFormValuesQueryParser.AttributeValueContext; import com.liferay.dynamic.data.mapping.form.values.query.internal.parser.DDMFormValuesQueryParser.FieldSelectorContext; import com.liferay.dynamic.data.mapping.form.values.query.internal.parser.DDMFormValuesQueryParser.FieldSelectorExpressionContext; import com.liferay.dynamic.data.mapping.form.values.query.internal.parser.DDMFormValuesQueryParser.LocaleExpressionContext; import com.liferay.dynamic.data.mapping.form.values.query.internal.parser.DDMFormValuesQueryParser.PredicateAndExpressionContext; import com.liferay.dynamic.data.mapping.form.values.query.internal.parser.DDMFormValuesQueryParser.PredicateEqualityExpressionContext; import com.liferay.dynamic.data.mapping.form.values.query.internal.parser.DDMFormValuesQueryParser.PredicateOrExpressionContext; import com.liferay.dynamic.data.mapping.form.values.query.internal.parser.DDMFormValuesQueryParser.SelectorExpressionContext; import com.liferay.dynamic.data.mapping.form.values.query.internal.parser.DDMFormValuesQueryParser.StepTypeContext; import com.liferay.portal.kernel.util.LocaleUtil; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.StringUtil; import java.util.ArrayList; import java.util.List; import java.util.Stack; import org.antlr.v4.runtime.tree.ParseTree; /** * @author Marcellus Tavares * @author Pablo Carvalho */ public class DDMFormValuesQueryListener extends DDMFormValuesQueryBaseListener { @Override public void enterAttributeType(AttributeTypeContext attributeTypeContext) { ddmFormFieldValueMatchers.push(new DDMFormFieldValueTypeMatcher()); } @Override public void enterAttributeValue( AttributeValueContext attributeValueContext) { ddmFormFieldValueMatchers.push(new DDMFormFieldValueValueMatcher()); } @Override public void enterFieldSelectorExpression( FieldSelectorExpressionContext fieldSelectorExpressionContext) { ddmFormFieldValueMatchers.push( new DDMFormFieldValueMatchesAllMatcher()); } @Override public void enterPredicateAndExpression( PredicateAndExpressionContext predicateAndExpressionContext) { ddmFormFieldValueMatchers.push( new DDMFormFieldValueMatchesAllMatcher()); } @Override public void enterPredicateOrExpression( PredicateOrExpressionContext predicateOrExpressionContext) { ddmFormFieldValueMatchers.push( new DDMFormFieldValueMatchesAnyMatcher()); } @Override public void enterSelectorExpression( SelectorExpressionContext selectorExpressionContext) { ddmFormValuesFilters.add(new DDMFormValuesFilterImpl()); } @Override public void exitFieldSelector(FieldSelectorContext fieldSelectorContext) { String text = fieldSelectorContext.getText(); if (text.equals(StringPool.STAR)) { return; } DDMFormFieldValueNameMatcher ddmFormFieldValueNameMatcher = new DDMFormFieldValueNameMatcher(); ddmFormFieldValueNameMatcher.setName(text); DDMFormFieldValueMatchesAllMatcher previousDDMFormFieldValueMatchesAllMatcher = (DDMFormFieldValueMatchesAllMatcher) ddmFormFieldValueMatchers.peek(); previousDDMFormFieldValueMatchesAllMatcher.addDDMFormFieldValueMatcher( ddmFormFieldValueNameMatcher); } @Override public void exitFieldSelectorExpression( FieldSelectorExpressionContext fieldSelectorExpressionContext) { DDMFormFieldValueMatcher ddmFormFieldValueMatcher = ddmFormFieldValueMatchers.pop(); DDMFormValuesFilter lastDDMFormValuesFilter = ddmFormValuesFilters.get( ddmFormValuesFilters.size() - 1); lastDDMFormValuesFilter.setDDMFormFieldValueMatcher( ddmFormFieldValueMatcher); } @Override public void exitLocaleExpression( LocaleExpressionContext localeExpressionContext) { ParseTree stringLiteral = localeExpressionContext.STRING_LITERAL(); String languageId = StringUtil.unquote(stringLiteral.getText()); DDMFormFieldValueValueMatcher lastDDMFormFieldValueValueMatcher = (DDMFormFieldValueValueMatcher)ddmFormFieldValueMatchers.peek(); lastDDMFormFieldValueValueMatcher.setLocale( LocaleUtil.fromLanguageId(languageId)); } @Override public void exitPredicateAndExpression( PredicateAndExpressionContext predicateAndExpressionContext) { DDMFormFieldValueMatcher andDDMFormFieldValueMatcher = ddmFormFieldValueMatchers.pop(); DDMFormFieldValueMatchesAnyMatcher orDDMFormFieldValueMatchesAnyMatcher = (DDMFormFieldValueMatchesAnyMatcher) ddmFormFieldValueMatchers.peek(); orDDMFormFieldValueMatchesAnyMatcher.addDDMFormFieldValueMatcher( andDDMFormFieldValueMatcher); } @Override public void exitPredicateEqualityExpression( PredicateEqualityExpressionContext predicateEqualityExpressionContext) { DDMFormFieldValueMatcher lastDDMFormFieldValueMatcher = ddmFormFieldValueMatchers.pop(); ParseTree stringLiteral = predicateEqualityExpressionContext.STRING_LITERAL(); String text = StringUtil.unquote(stringLiteral.getText()); if (lastDDMFormFieldValueMatcher instanceof DDMFormFieldValueTypeMatcher) { DDMFormFieldValueTypeMatcher ddmFormFieldValueTypeMatcher = (DDMFormFieldValueTypeMatcher)lastDDMFormFieldValueMatcher; ddmFormFieldValueTypeMatcher.setType(text); } else { DDMFormFieldValueValueMatcher ddmFormFieldValueValueMatcher = (DDMFormFieldValueValueMatcher)lastDDMFormFieldValueMatcher; ddmFormFieldValueValueMatcher.setValue(text); } DDMFormFieldValueMatchesAllMatcher andDDMFormFieldValueMatchesAllMatcher = (DDMFormFieldValueMatchesAllMatcher) ddmFormFieldValueMatchers.peek(); andDDMFormFieldValueMatchesAllMatcher.addDDMFormFieldValueMatcher( lastDDMFormFieldValueMatcher); } @Override public void exitPredicateOrExpression( PredicateOrExpressionContext predicateOrExpressionContext) { DDMFormFieldValueMatcher orDDMFormFieldValueMatcher = ddmFormFieldValueMatchers.pop(); DDMFormFieldValueMatchesAllMatcher previousDDMFormFieldValueMatchesAllMatcher = (DDMFormFieldValueMatchesAllMatcher) ddmFormFieldValueMatchers.peek(); previousDDMFormFieldValueMatchesAllMatcher.addDDMFormFieldValueMatcher( orDDMFormFieldValueMatcher); } @Override public void exitStepType(StepTypeContext stepTypeContext) { String text = stepTypeContext.getText(); DDMFormValuesFilter lastDDMFormValuesFilter = ddmFormValuesFilters.get( ddmFormValuesFilters.size() - 1); if (text.equals(StringPool.SLASH)) { lastDDMFormValuesFilter.setGreedy(false); } else { lastDDMFormValuesFilter.setGreedy(true); } } public List<DDMFormValuesFilter> getDDMFormValuesFilters() { return ddmFormValuesFilters; } public Stack<DDMFormFieldValueMatcher> ddmFormFieldValueMatchers = new Stack<>(); public List<DDMFormValuesFilter> ddmFormValuesFilters = new ArrayList<>(); }