/modules/apps/segments/segments-service/src/main/java/com/liferay/segments/internal/odata/filter/expression/ExportExpressionVisitorImpl.java

https://github.com/kiyoshilee/liferay-portal · Java · 214 lines · 151 code · 47 blank · 16 comment · 10 complexity · 9e5773a0e56fd6dafbfa9e48ea6a0fe8 MD5 · raw file

  1. /**
  2. * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
  3. *
  4. * This library is free software; you can redistribute it and/or modify it under
  5. * the terms of the GNU Lesser General Public License as published by the Free
  6. * Software Foundation; either version 2.1 of the License, or (at your option)
  7. * any later version.
  8. *
  9. * This library is distributed in the hope that it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  11. * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
  12. * details.
  13. */
  14. package com.liferay.segments.internal.odata.filter.expression;
  15. import com.liferay.expando.kernel.model.ExpandoColumn;
  16. import com.liferay.exportimport.kernel.lar.PortletDataContext;
  17. import com.liferay.petra.string.CharPool;
  18. import com.liferay.portal.kernel.model.ClassedModel;
  19. import com.liferay.portal.kernel.model.StagedModel;
  20. import com.liferay.portal.kernel.util.StringUtil;
  21. import com.liferay.portal.kernel.xml.Element;
  22. import com.liferay.portal.odata.entity.ComplexEntityField;
  23. import com.liferay.portal.odata.entity.EntityField;
  24. import com.liferay.portal.odata.entity.EntityModel;
  25. import com.liferay.portal.odata.filter.expression.BinaryExpression;
  26. import com.liferay.portal.odata.filter.expression.CollectionPropertyExpression;
  27. import com.liferay.portal.odata.filter.expression.ComplexPropertyExpression;
  28. import com.liferay.portal.odata.filter.expression.Expression;
  29. import com.liferay.portal.odata.filter.expression.ExpressionVisitException;
  30. import com.liferay.portal.odata.filter.expression.ExpressionVisitor;
  31. import com.liferay.portal.odata.filter.expression.LiteralExpression;
  32. import com.liferay.portal.odata.filter.expression.MemberExpression;
  33. import com.liferay.portal.odata.filter.expression.MethodExpression;
  34. import com.liferay.portal.odata.filter.expression.PrimitivePropertyExpression;
  35. import com.liferay.portal.odata.filter.expression.PropertyExpression;
  36. import com.liferay.portal.odata.filter.expression.UnaryExpression;
  37. import com.liferay.segments.field.customizer.SegmentsFieldCustomizer;
  38. import com.liferay.segments.field.customizer.SegmentsFieldCustomizerRegistry;
  39. import com.liferay.segments.internal.odata.entity.EntityModelFieldMapper;
  40. import java.util.List;
  41. import java.util.Map;
  42. import java.util.Objects;
  43. import java.util.Optional;
  44. /**
  45. * @author Eduardo García
  46. */
  47. public class ExportExpressionVisitorImpl implements ExpressionVisitor<Object> {
  48. public ExportExpressionVisitorImpl(
  49. PortletDataContext portletDataContext, StagedModel stagedModel,
  50. EntityModel entityModel, EntityModelFieldMapper entityModelFieldMapper,
  51. SegmentsFieldCustomizerRegistry segmentsFieldCustomizerRegistry) {
  52. _portletDataContext = portletDataContext;
  53. _stagedModel = stagedModel;
  54. _entityModel = entityModel;
  55. _entityModelFieldMapper = entityModelFieldMapper;
  56. _segmentsFieldCustomizerRegistry = segmentsFieldCustomizerRegistry;
  57. _customFieldEntityFields =
  58. entityModelFieldMapper.getCustomFieldEntityFields(entityModel);
  59. }
  60. @Override
  61. public Void visitBinaryExpressionOperation(
  62. BinaryExpression.Operation operation, Object left, Object right) {
  63. if (!Objects.equals(BinaryExpression.Operation.EQ, operation)) {
  64. return null;
  65. }
  66. EntityField entityField = (EntityField)left;
  67. if (Objects.equals(EntityField.Type.ID, entityField.getType())) {
  68. _exportEntityFieldIDReferences(entityField, right);
  69. }
  70. else if (_customFieldEntityFields.containsKey(entityField.getName())) {
  71. _exportEntityFieldCustomFieldReferences(entityField);
  72. }
  73. return null;
  74. }
  75. @Override
  76. public Object visitCollectionPropertyExpression(
  77. CollectionPropertyExpression collectionPropertyExpression) {
  78. return null;
  79. }
  80. @Override
  81. public Object visitComplexPropertyExpression(
  82. ComplexPropertyExpression complexPropertyExpression) {
  83. Map<String, EntityField> entityFieldsMap =
  84. _entityModel.getEntityFieldsMap();
  85. ComplexEntityField complexEntityField =
  86. (ComplexEntityField)entityFieldsMap.get(
  87. complexPropertyExpression.getName());
  88. PropertyExpression propertyExpression =
  89. complexPropertyExpression.getPropertyExpression();
  90. Map<String, EntityField> complexEntityFieldEntityFieldsMap =
  91. complexEntityField.getEntityFieldsMap();
  92. return complexEntityFieldEntityFieldsMap.get(
  93. propertyExpression.getName());
  94. }
  95. @Override
  96. public Object visitLiteralExpression(LiteralExpression literalExpression) {
  97. return StringUtil.removeChar(
  98. literalExpression.getText(), CharPool.APOSTROPHE);
  99. }
  100. @Override
  101. public Object visitMemberExpression(MemberExpression memberExpression)
  102. throws ExpressionVisitException {
  103. Expression expression = memberExpression.getExpression();
  104. return expression.accept(this);
  105. }
  106. @Override
  107. public Object visitMethodExpression(
  108. List<Object> expressions, MethodExpression.Type type) {
  109. return null;
  110. }
  111. @Override
  112. public Object visitPrimitivePropertyExpression(
  113. PrimitivePropertyExpression primitivePropertyExpression) {
  114. Map<String, EntityField> entityFieldsMap =
  115. _entityModel.getEntityFieldsMap();
  116. return entityFieldsMap.get(primitivePropertyExpression.getName());
  117. }
  118. @Override
  119. public Void visitUnaryExpressionOperation(
  120. UnaryExpression.Operation operation, Object operand) {
  121. return null;
  122. }
  123. private void _exportEntityFieldCustomFieldReferences(
  124. EntityField entityField) {
  125. ExpandoColumn expandoColumn = _entityModelFieldMapper.getExpandoColumn(
  126. entityField.getName());
  127. if (expandoColumn == null) {
  128. return;
  129. }
  130. Element entityElement = _portletDataContext.getExportDataElement(
  131. _stagedModel);
  132. _portletDataContext.addReferenceElement(
  133. _stagedModel, entityElement, expandoColumn,
  134. PortletDataContext.REFERENCE_TYPE_DEPENDENCY, false);
  135. }
  136. private void _exportEntityFieldIDReferences(
  137. EntityField entityField, Object value) {
  138. if (!Objects.equals(EntityField.Type.ID, entityField.getType())) {
  139. return;
  140. }
  141. Optional<SegmentsFieldCustomizer> segmentsFieldCustomizerOptional =
  142. _segmentsFieldCustomizerRegistry.getSegmentsFieldCustomizerOptional(
  143. _entityModel.getName(), entityField.getName());
  144. if (!segmentsFieldCustomizerOptional.isPresent()) {
  145. return;
  146. }
  147. SegmentsFieldCustomizer segmentsFieldCustomizer =
  148. segmentsFieldCustomizerOptional.get();
  149. ClassedModel classedModel = segmentsFieldCustomizer.getClassedModel(
  150. (String)value);
  151. if (classedModel == null) {
  152. return;
  153. }
  154. Element entityElement = _portletDataContext.getExportDataElement(
  155. _stagedModel);
  156. _portletDataContext.addReferenceElement(
  157. _stagedModel, entityElement, classedModel,
  158. PortletDataContext.REFERENCE_TYPE_DEPENDENCY, false);
  159. }
  160. private final Map<String, EntityField> _customFieldEntityFields;
  161. private final EntityModel _entityModel;
  162. private final EntityModelFieldMapper _entityModelFieldMapper;
  163. private final PortletDataContext _portletDataContext;
  164. private final SegmentsFieldCustomizerRegistry
  165. _segmentsFieldCustomizerRegistry;
  166. private final StagedModel _stagedModel;
  167. }