001/* 002 * Copyright 2017 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.content.referencetable.search; 017 018import java.util.Collection; 019import java.util.Collections; 020import java.util.List; 021import java.util.Map; 022 023import org.apache.avalon.framework.service.ServiceException; 024import org.apache.avalon.framework.service.ServiceManager; 025import org.apache.solr.client.solrj.util.ClientUtils; 026 027import org.ametys.cms.content.referencetable.HierarchicalReferenceTablesHelper; 028import org.ametys.cms.data.ContentValue; 029import org.ametys.cms.data.type.ModelItemTypeConstants; 030import org.ametys.cms.data.type.indexing.IndexableElementType; 031import org.ametys.cms.model.CMSDataContext; 032import org.ametys.cms.model.ContentElementDefinition; 033import org.ametys.cms.repository.Content; 034import org.ametys.cms.search.model.CriterionDefinitionAwareElementDefinition; 035import org.ametys.cms.search.model.CriterionDefinitionHelper; 036import org.ametys.cms.search.model.SystemProperty; 037import org.ametys.cms.search.query.Query; 038import org.ametys.cms.search.query.Query.Operator; 039import org.ametys.cms.search.systemprop.AbstractSystemProperty; 040import org.ametys.cms.search.systemprop.IndexationAwareSystemProperty; 041import org.ametys.plugins.repository.AmetysObjectResolver; 042import org.ametys.runtime.model.ModelItem; 043 044/** 045 * {@link SystemProperty} which represents all parents (parent, parent of the parent, etc.) of a simple content. 046 */ 047public class ParentContentSystemProperty extends AbstractSystemProperty<ContentValue, Content> implements ContentElementDefinition, CriterionDefinitionAwareElementDefinition<ContentValue>, IndexationAwareSystemProperty<ContentValue, Content> 048{ 049 /** Solr field name. */ 050 public static final String SOLR_FIELD_NAME = "refParents"; 051 052 /** The helper component for hierarchical simple contents */ 053 protected HierarchicalReferenceTablesHelper _hierarchicalSimpleContentsHelper; 054 /** The ametys object resolver */ 055 protected AmetysObjectResolver _resolver; 056 /** The criterion definition helper */ 057 protected CriterionDefinitionHelper _criterionDefinitionHelper; 058 059 @Override 060 public void service(ServiceManager manager) throws ServiceException 061 { 062 super.service(manager); 063 _hierarchicalSimpleContentsHelper = (HierarchicalReferenceTablesHelper) manager.lookup(HierarchicalReferenceTablesHelper.ROLE); 064 _resolver = (AmetysObjectResolver) manager.lookup(AmetysObjectResolver.ROLE); 065 _criterionDefinitionHelper = (CriterionDefinitionHelper) manager.lookup(CriterionDefinitionHelper.ROLE); 066 } 067 068 @Override 069 public boolean isMultiple() 070 { 071 return true; 072 } 073 074 @Override 075 public String getRenderer() 076 { 077 return "Ametys.plugins.cms.search.SearchGridHelper.renderContent"; 078 } 079 080 @Override 081 public String getDefaultCriterionWidget() 082 { 083 return "edition.hidden"; 084 // return "edition.select-referencetable-content"; 085 } 086 087 @Override 088 public Query getQuery(Object value, Operator operator, String language, Map<String, Object> contextualParameters) 089 { 090 if (value instanceof String) 091 { 092 return () -> SOLR_FIELD_NAME + ":" + ClientUtils.escapeQueryChars((String) value); 093 } 094 else 095 { 096 return null; 097 } 098 } 099 100 public String getSolrFieldName() 101 { 102 return SOLR_FIELD_NAME; 103 } 104 105 public String getSolrSortFieldName() 106 { 107 // Not sortable. 108 return null; 109 } 110 111 public String getSolrFacetFieldName() 112 { 113 return SOLR_FIELD_NAME + "_dv"; 114 } 115 116 @Override 117 public Object getValue(Content content) 118 { 119 List<String> parentsAndMe = _hierarchicalSimpleContentsHelper.getAllParents(content); 120 parentsAndMe.add(content.getId()); 121 122 return parentsAndMe.stream() 123 .map(id -> new ContentValue(_resolver, id)) 124 .toArray(ContentValue[]::new); 125 } 126 127 @Override 128 protected String getTypeId() 129 { 130 return ModelItemTypeConstants.CONTENT_ELEMENT_TYPE_ID; 131 } 132 133 public IndexableElementType getDefaultCriterionType() 134 { 135 CMSDataContext context = CMSDataContext.newInstance() 136 .withModelItem(this); 137 138 String typeId = getType().getDefaultCriterionTypeId(context); 139 return _criterionDefinitionHelper.getCriterionDefinitionType(typeId); 140 } 141 142 @Override 143 public String getContentTypeId() 144 { 145 return null; 146 } 147 148 @Override 149 public void setContentTypeId(String contentTypeId) 150 { 151 // Do nothing by default 152 } 153 154 @Override 155 public Collection< ? extends ModelItem> getModelItems() 156 { 157 return Collections.EMPTY_LIST; 158 } 159}