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 ametys object resolver */ 053 protected AmetysObjectResolver _resolver; 054 /** The criterion definition helper */ 055 protected CriterionDefinitionHelper _criterionDefinitionHelper; 056 /** The helper component for hierarchical simple contents */ 057 private HierarchicalReferenceTablesHelper _hierarchicalReferenceTablesHelper; 058 059 @Override 060 public void service(ServiceManager manager) throws ServiceException 061 { 062 super.service(manager); 063 _resolver = (AmetysObjectResolver) manager.lookup(AmetysObjectResolver.ROLE); 064 _criterionDefinitionHelper = (CriterionDefinitionHelper) manager.lookup(CriterionDefinitionHelper.ROLE); 065 } 066 067 @Override 068 public boolean isMultiple() 069 { 070 return true; 071 } 072 073 @Override 074 public String getRenderer() 075 { 076 return "Ametys.plugins.cms.search.SearchGridHelper.renderContent"; 077 } 078 079 @Override 080 public String getDefaultCriterionWidget() 081 { 082 return "edition.hidden"; 083 // return "edition.select-referencetable-content"; 084 } 085 086 @Override 087 public Query getQuery(Object value, Operator operator, String language, Map<String, Object> contextualParameters) 088 { 089 if (value instanceof String) 090 { 091 return () -> SOLR_FIELD_NAME + ":" + ClientUtils.escapeQueryChars((String) value); 092 } 093 else 094 { 095 return null; 096 } 097 } 098 099 public String getSolrFieldName() 100 { 101 return SOLR_FIELD_NAME; 102 } 103 104 public String getSolrSortFieldName() 105 { 106 // Not sortable. 107 return null; 108 } 109 110 public String getSolrFacetFieldName() 111 { 112 return SOLR_FIELD_NAME + "_dv"; 113 } 114 115 @Override 116 public Object getValue(Content content) 117 { 118 List<String> parentsAndMe = _getHierarchicalReferenceTablesHelper().getAllParents(content); 119 parentsAndMe.add(content.getId()); 120 121 return parentsAndMe.stream() 122 .map(id -> new ContentValue(_resolver, id)) 123 .toArray(ContentValue[]::new); 124 } 125 126 @Override 127 protected String getTypeId() 128 { 129 return ModelItemTypeConstants.CONTENT_ELEMENT_TYPE_ID; 130 } 131 132 public IndexableElementType getDefaultCriterionType() 133 { 134 CMSDataContext context = CMSDataContext.newInstance() 135 .withModelItem(this); 136 137 String typeId = getType().getDefaultCriterionTypeId(context); 138 return _criterionDefinitionHelper.getCriterionDefinitionType(typeId); 139 } 140 141 @Override 142 public String getContentTypeId() 143 { 144 return null; 145 } 146 147 @Override 148 public void setContentTypeId(String contentTypeId) 149 { 150 // Do nothing by default 151 } 152 153 @Override 154 public Collection< ? extends ModelItem> getModelItems() 155 { 156 return Collections.EMPTY_LIST; 157 } 158 159 /** 160 * Retrieves the hierarchical reference tables helper 161 * @return the hierarchical reference tables helper 162 */ 163 protected HierarchicalReferenceTablesHelper _getHierarchicalReferenceTablesHelper() 164 { 165 if (_hierarchicalReferenceTablesHelper == null) 166 { 167 try 168 { 169 _hierarchicalReferenceTablesHelper = (HierarchicalReferenceTablesHelper) _manager.lookup(HierarchicalReferenceTablesHelper.ROLE); 170 } 171 catch (ServiceException e) 172 { 173 throw new RuntimeException("Unable to lookup after the hierarchical reference tables helper", e); 174 } 175 } 176 177 return _hierarchicalReferenceTablesHelper; 178 } 179}