001/*
002 *  Copyright 2015 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.web.search.systemprop;
017
018import java.util.LinkedHashMap;
019import java.util.Map;
020
021import org.apache.avalon.framework.configuration.Configuration;
022import org.apache.avalon.framework.configuration.ConfigurationException;
023import org.apache.avalon.framework.service.ServiceException;
024import org.apache.avalon.framework.service.ServiceManager;
025
026import org.ametys.cms.data.type.indexing.IndexableElementType;
027import org.ametys.cms.model.CMSDataContext;
028import org.ametys.cms.repository.Content;
029import org.ametys.cms.search.model.CriterionDefinitionAwareElementDefinition;
030import org.ametys.cms.search.model.CriterionDefinitionHelper;
031import org.ametys.cms.search.model.SystemProperty;
032import org.ametys.cms.search.query.Query;
033import org.ametys.cms.search.query.Query.Operator;
034import org.ametys.cms.search.systemprop.AbstractSystemProperty;
035import org.ametys.cms.search.systemprop.IndexationAwareSystemProperty;
036import org.ametys.runtime.model.Enumerator;
037import org.ametys.runtime.model.exception.BadItemTypeException;
038import org.ametys.runtime.model.type.DataContext;
039import org.ametys.runtime.model.type.ModelItemTypeConstants;
040import org.ametys.runtime.plugin.component.ThreadSafeComponentManager;
041import org.ametys.web.indexing.solr.SolrWebFieldNames;
042import org.ametys.web.repository.content.WebContent;
043import org.ametys.web.repository.site.Site;
044import org.ametys.web.search.misc.SiteQueryHelper;
045import org.ametys.web.site.SiteEnumerator;
046
047/**
048 * {@link SystemProperty} which represents the site of a Content.
049 */
050public class SiteSystemProperty extends AbstractSystemProperty<String, Content> implements CriterionDefinitionAwareElementDefinition<String>, IndexationAwareSystemProperty<String, Content>
051{
052    /** Solr field name. */
053    public static final String SOLR_FIELD_NAME = SolrWebFieldNames.SITE_NAME;
054    
055    /** The site query helper */
056    protected SiteQueryHelper _siteQueryHelper;
057    /** The criterion definition helper */
058    protected CriterionDefinitionHelper _criterionDefinitionHelper;
059    
060    @Override
061    public void service(ServiceManager manager) throws ServiceException
062    {
063        super.service(manager);
064        _siteQueryHelper = (SiteQueryHelper) manager.lookup(SiteQueryHelper.ROLE);
065        _criterionDefinitionHelper = (CriterionDefinitionHelper) manager.lookup(CriterionDefinitionHelper.ROLE);
066    }
067    
068    public Object convertQueryValue(Object value, String language, Map<String, Object> contextualParameters) throws BadItemTypeException
069    {
070        return _siteQueryHelper.convertQueryValue(value, contextualParameters, getName());
071    }
072    
073    @SuppressWarnings("unchecked")
074    @Override
075    public Query getQuery(Object value, Operator operator, String language, Map<String, Object> contextualParameters)
076    {
077        return _siteQueryHelper.getQuery((Map<String, Object>) value, operator, contextualParameters);
078    }
079    
080    @Override
081    public String getDefaultCriterionWidget()
082    {
083        return "edition.select-site";
084    }
085    
086    @Override
087    public String getRenderer()
088    {
089        return "Ametys.plugins.web.search.ContentSearchTool.renderSite";
090    }
091    
092    @Override
093    public String getConverter()
094    {
095        return "Ametys.plugins.web.search.ContentSearchTool.convertSite";
096    }
097    
098    public String getSolrFieldName()
099    {
100        return SOLR_FIELD_NAME;
101    }
102    
103    public String getSolrSortFieldName()
104    {
105        return SOLR_FIELD_NAME + "_sort";
106    }
107    
108    public String getSolrFacetFieldName()
109    {
110        return SOLR_FIELD_NAME + "_dv";
111    }
112    
113    @Override
114    public Object getValue(Content content)
115    {
116        if (content instanceof WebContent webContent)
117        {
118            return webContent.getSiteName();
119        }
120        
121        return null;
122    }
123    
124    @Override
125    public Object valueToJSON(Content content, DataContext context)
126    {
127        String value = (String) getValue(content);
128        if (value != null)
129        {
130            Map<String, Object> info = new LinkedHashMap<>();
131            info.put("name", value);
132            
133            Site site = ((WebContent) content).getSite();
134            if (site != null)
135            {
136                info.put("title", site.getTitle());
137            }
138            return info;
139        }
140        
141        return value;
142    }
143    
144    @Override
145    public Object getSortValue(Content content)
146    {
147        if (content instanceof WebContent webContent)
148        {
149            return webContent.getSite().getTitle();
150        }
151        
152        return null;
153    }
154    
155    @Override
156    public Enumerator<String> getDefaultCriterionEnumerator(Configuration configuration, ThreadSafeComponentManager<Enumerator> enumeratorManager) throws ConfigurationException
157    {
158        String role = "enumerator";
159        enumeratorManager.addComponent(getPluginName(), null, role, SiteEnumerator.class, configuration);
160        
161        try
162        {
163            enumeratorManager.initialize();
164            return enumeratorManager.lookup(role);
165        }
166        catch (Exception e)
167        {
168            throw new ConfigurationException("Unable to initialize the site enumerator for system property '" + getName() + "'.", configuration, e);
169        }
170    }
171    
172    @Override
173    protected String getTypeId()
174    {
175        return ModelItemTypeConstants.STRING_TYPE_ID;
176    }
177    
178    public IndexableElementType getDefaultCriterionType()
179    {
180        CMSDataContext context = CMSDataContext.newInstance()
181                                               .withModelItem(this);
182        
183        String typeId = getType().getDefaultCriterionTypeId(context);
184        return _criterionDefinitionHelper.getCriterionDefinitionType(typeId);
185    }
186}