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.plugins.workspaces.search.query; 017 018import java.util.Collection; 019import java.util.HashSet; 020import java.util.List; 021import java.util.Set; 022 023import org.apache.cocoon.environment.Request; 024 025import org.ametys.cms.content.indexing.solr.SolrFieldNames; 026import org.ametys.cms.search.query.OrQuery; 027import org.ametys.cms.search.query.Query; 028import org.ametys.plugins.repository.data.holder.ModelAwareDataHolder; 029import org.ametys.plugins.workspaces.indexing.solr.SolrWorkspacesConstants; 030import org.ametys.plugins.workspaces.project.ProjectWorkspaceSiteType; 031import org.ametys.web.frontoffice.AbstractSearchGenerator; 032import org.ametys.web.frontoffice.FrontOfficeSearcherFactory.QueryFacet; 033import org.ametys.web.frontoffice.QueryAdapterFOSearch; 034import org.ametys.web.indexing.solr.SolrWebFieldNames; 035import org.ametys.web.repository.page.ZoneItem; 036import org.ametys.web.search.query.SiteTypeQuery; 037 038/** 039 * The query adapter to handle the "with workspaces" FO search service parameter 040 */ 041public class WorkspacesQueryAdapterFOSearch implements QueryAdapterFOSearch 042{ 043 @Override 044 public int getPriority() 045 { 046 return QueryAdapterFOSearch.MIN_PRIORITY; 047 } 048 049 @Override 050 public Query modifyQuery(Query query, Request request, Collection<String> siteNames, String language) 051 { 052 return query; 053 } 054 055 @Override 056 public Query modifySiteQueryFilter(Query siteQuery, Request request, Collection<String> siteNames, String language) 057 { 058 if (_withWorkspaces(request)) 059 { 060 SiteTypeQuery siteTypeQuery = new SiteTypeQuery(ProjectWorkspaceSiteType.TYPE_ID); 061 return new OrQuery(siteQuery, siteTypeQuery); 062 } 063 064 return siteQuery; 065 } 066 067 @Override 068 public Query modifySitemapQueryFilter(Query sitemapQuery, Request request, Collection<String> siteNames, String language) 069 { 070 if (_withWorkspaces(request)) 071 { 072 SiteTypeQuery siteTypeQuery = new SiteTypeQuery(ProjectWorkspaceSiteType.TYPE_ID); 073 return new OrQuery(sitemapQuery, siteTypeQuery); 074 } 075 076 return sitemapQuery; 077 } 078 079 public Set<QueryFacet> modifyQueryFacets(Set<QueryFacet> queryFacets, Request request) 080 { 081 if (_withWorkspaces(request)) 082 { 083 Set<QueryFacet> modifiedQueryFacets = new HashSet<>(); 084 for (QueryFacet queryFacet : queryFacets) 085 { 086 if (queryFacet.getKeyName().equals(AbstractSearchGenerator.DOCUMENT_TYPE_IS_PAGE_RESOURCE_FACET_NAME)) 087 { 088 // add "projectResource" to facet for resources 089 modifiedQueryFacets.add(new QueryFacet(AbstractSearchGenerator.DOCUMENT_TYPE_IS_PAGE_RESOURCE_FACET_NAME, 090 SolrWebFieldNames.PAGE_CONTENT_TYPES, 091 SolrFieldNames.DOCUMENT_TYPE + ":" + SolrWebFieldNames.TYPE_PAGE_RESOURCE + " OR " + SolrFieldNames.DOCUMENT_TYPE + ":" + SolrWorkspacesConstants.TYPE_PROJECT_RESOURCE)); 092 } 093 else 094 { 095 // no modification 096 modifiedQueryFacets.add(queryFacet); 097 } 098 } 099 return modifiedQueryFacets; 100 } 101 102 return queryFacets; 103 } 104 105 @Override 106 public void addDocumentType(List<String> documentTypes) 107 { 108 documentTypes.add(SolrWorkspacesConstants.TYPE_PROJECT_RESOURCE); 109 } 110 111 private boolean _withWorkspaces(Request request) 112 { 113 ZoneItem zoneItem = (ZoneItem) request.getAttribute(ZoneItem.class.getName()); 114 if (zoneItem != null) 115 { 116 ModelAwareDataHolder serviceParameters = zoneItem.getServiceParameters(); 117 return serviceParameters.getValue("withWorkspaces", false, false); 118 } 119 120 return false; 121 } 122 123}