001/* 002 * Copyright 2024 Anyware Services 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package org.ametys.cms.search.model.impl; 017 018import java.util.Map; 019import java.util.Optional; 020 021import org.apache.cocoon.xml.XMLUtils; 022import org.xml.sax.ContentHandler; 023import org.xml.sax.SAXException; 024 025import org.ametys.cms.model.CMSDataContext; 026import org.ametys.cms.search.model.SearchModel; 027import org.ametys.cms.search.model.SearchModelCriterionDefinition; 028import org.ametys.cms.search.query.Query; 029import org.ametys.cms.search.query.Query.LogicalOperator; 030import org.ametys.cms.search.query.Query.Operator; 031import org.ametys.runtime.model.DefinitionContext; 032 033/** 034 * Default implementation for {@link SearchModelCriterionDefinition} 035 * @param <T> Type of the criterion value 036 */ 037public class DefaultSearchModelCriterionDefinition<T> extends AbstractCriterionDefinition<T> implements SearchModelCriterionDefinition<T> 038{ 039 /** The criteria operator */ 040 protected Operator _operator; 041 042 public Operator getOperator() 043 { 044 return Optional.ofNullable(_operator) 045 .orElseGet(this::_getDefaultOperator); 046 } 047 048 /** 049 * Retrieves the default operator for the criterion 050 * @return the default operator for the criterion 051 */ 052 protected Operator _getDefaultOperator() 053 { 054 return getType().getDefaultCriterionOperator(CMSDataContext.newInstance() 055 .withModelItem(this)); 056 } 057 058 public void setOperator(Operator operator) 059 { 060 _operator = operator; 061 } 062 063 public void setMultipleOperandOperator(LogicalOperator multipleOperand) 064 { 065 _multipleOperandOperator = multipleOperand; 066 } 067 068 @Override 069 protected Map<String, Object> _toJSON(DefinitionContext context) 070 { 071 Map<String, Object> json = super._toJSON(context); 072 // TODO use operator.getName()? 073 json.put("criterionOperator", getOperator().toString().toLowerCase()); 074 json.put("criterionMultipleOperand", getMultipleOperandOperator().name()); 075 return json; 076 } 077 078 @Override 079 public void toSAX(ContentHandler contentHandler, DefinitionContext context) throws SAXException 080 { 081 super.toSAX(contentHandler, context); 082 // TODO use operator.getName()? 083 XMLUtils.createElement(contentHandler, "test-operator", getOperator().toString().toLowerCase()); 084 XMLUtils.createElement(contentHandler, "multiple-operand", getMultipleOperandOperator().name()); 085 } 086 087 @Override 088 public Query getQuery(Object value, Operator operator, Map<String, Object> allValues, String language, Map<String, Object> contextualParameters) 089 { 090 return super.getQuery(value, operator != null ? operator : getOperator(), allValues, language, contextualParameters); 091 } 092 093 @SuppressWarnings("unchecked") 094 public void copyTo(SearchModelCriterionDefinition<T> criterion, Map<String, Object> contextualParameters) 095 { 096 criterion.setModel(getModel()); 097 098 criterion.setName(getName()); 099 criterion.setPluginName(getPluginName()); 100 criterion.setLabel(getLabel()); 101 criterion.setDescription(getDescription()); 102 criterion.setWidget(getWidget()); 103 criterion.setWidgetParameters(getWidgetParameters()); 104 105 criterion.setType(getType()); 106 criterion.setMultiple(isMultiple()); 107 108 criterion.setEnumerator(getEnumerator()); 109 criterion.setCustomEnumerator(getCustomEnumerator()); 110 criterion.setEnumeratorConfiguration(getEnumeratorConfiguration()); 111 112 criterion.setValidator(getValidator()); 113 criterion.setCustomValidator(getCustomValidator()); 114 criterion.setValidatorConfiguration(getValidatorConfiguration()); 115 116 criterion.setParsedDefaultValues(getParsedDefaultValues()); 117 118 criterion.setOperator(getOperator()); 119 criterion.setMultipleOperandOperator(getMultipleOperandOperator()); 120 121 if (criterion instanceof DefaultSearchModelCriterionDefinition defaultCriterion) 122 { 123 defaultCriterion.setSolrFacetFieldName(getSolrFacetFieldName(contextualParameters)); 124 defaultCriterion.setJoinedPaths(getJoinedPaths(contextualParameters)); 125 } 126 } 127 128 @Override 129 public SearchModel getModel() 130 { 131 return (SearchModel) super.getModel(); 132 } 133}