/*
* (C) Copyright 2016 Nuxeo SA (http://nuxeo.com/) and others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Contributors:
* Gabriel Barata <gbarata@nuxeo.com>
*/
package org.nuxeo.ecm.platform.search.core;
import java.io.IOException;
import java.security.Principal;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.nuxeo.ecm.core.api.CoreSession;
import org.nuxeo.ecm.core.api.DocumentModel;
import org.nuxeo.ecm.core.api.DocumentRef;
import org.nuxeo.ecm.core.api.IdRef;
import org.nuxeo.ecm.core.api.security.ACE;
import org.nuxeo.ecm.core.api.security.ACL;
import org.nuxeo.ecm.core.api.security.ACP;
import org.nuxeo.ecm.core.api.security.SecurityConstants;
import org.nuxeo.ecm.platform.query.api.PageProviderService;
import org.nuxeo.ecm.platform.userworkspace.api.UserWorkspaceService;
import org.nuxeo.runtime.api.Framework;
/**
* @since 8.3
*/
public class SavedSearchServiceImpl implements SavedSearchService {
@Override
public SavedSearch createSavedSearch(CoreSession session, String title, String queryParams,
Map<String, String> namedParams, String query, String queryLanguage, String pageProviderName,
Long pageSize, Long currentPageIndex, Long maxResults, String sortBy, String sortOrder,
String contentViewData) throws InvalidSearchParameterException, IOException {
if (StringUtils.isEmpty(title)) {
throw new InvalidSearchParameterException("title cannot be empty");
}
if ((!StringUtils.isEmpty(query) || !StringUtils.isEmpty(queryLanguage))
&& !StringUtils.isEmpty(pageProviderName)) {
throw new InvalidSearchParameterException("query and page provider parameters are mutually exclusive"
+ " (query, queryLanguage, pageProviderName)");
}
if (StringUtils.isEmpty(query) && StringUtils.isEmpty(queryLanguage)
&& StringUtils.isEmpty(pageProviderName)) {
throw new InvalidSearchParameterException("query or page provider parameters are missing"
+ " (query, queryLanguage, pageProviderName)");
}
if (!StringUtils.isEmpty(query) && StringUtils.isEmpty(queryLanguage)) {
throw new InvalidSearchParameterException("queryLanguage parameter is missing");
}
if (StringUtils.isEmpty(query) && !StringUtils.isEmpty(queryLanguage)) {
throw new InvalidSearchParameterException("query parameter is missing");
}
UserWorkspaceService userWorkspaceService = Framework.getService(UserWorkspaceService.class);
DocumentModel uws = userWorkspaceService.getCurrentUserPersonalWorkspace(session, null);
String searchDocumentType = (!StringUtils.isEmpty(pageProviderName)) ? Framework.getService(
PageProviderService.class).getPageProviderDefinition(pageProviderName).getSearchDocumentType()
: null;
DocumentModel savedSearchDoc = session.createDocumentModel(uws.getPathAsString(), title,
searchDocumentType != null ? searchDocumentType
: SavedSearchConstants.PARAMETERIZED_SAVED_SEARCH_TYPE_NAME);
SavedSearch savedSearch = savedSearchDoc.getAdapter(SavedSearch.class);
savedSearch.setTitle(title);
savedSearch.setQueryParams(queryParams);
savedSearch.setNamedParams(namedParams);
savedSearch.setQuery(query);
savedSearch.setQueryLanguage(queryLanguage);
savedSearch.setPageProviderName(pageProviderName);
savedSearch.setPageSize(pageSize);
savedSearch.setCurrentPageIndex(currentPageIndex);
savedSearch.setMaxResults(maxResults);
savedSearch.setSortBy(sortBy);
savedSearch.setSortOrder(sortOrder);
savedSearch.setContentViewData(contentViewData);
savedSearchDoc = session.createDocument(savedSearchDoc);
savedSearch = savedSearchDoc.getAdapter(SavedSearch.class);
ACP acp = savedSearchDoc.getACP();
ACL acl = acp.getOrCreateACL(ACL.LOCAL_ACL);
Principal principal = session.getPrincipal();
if (principal != null) {
acl.add(new ACE(principal.getName(), SecurityConstants.EVERYTHING, true));
}
acp.addACL(acl);
savedSearchDoc.setACP(acp, true);
return savedSearch;
}
@Override
public SavedSearch getSavedSearch(CoreSession session, String id) {
DocumentRef docRef = new IdRef(id);
DocumentModel savedSearchDoc = session.getDocument(docRef);
if (savedSearchDoc != null) {
return savedSearchDoc.getAdapter(SavedSearch.class);
}
return null;
}
@Override
public SavedSearch saveSavedSearch(CoreSession session, SavedSearch search) throws InvalidSearchParameterException,
IOException {
if (StringUtils.isEmpty(search.getTitle())) {
throw new InvalidSearchParameterException("title cannot be empty");
}
if ((!StringUtils.isEmpty(search.getQuery()) || !StringUtils.isEmpty(search.getQueryLanguage()))
&& !StringUtils.isEmpty(search.getPageProviderName())) {
throw new InvalidSearchParameterException("query and page provider parameters are mutually exclusive"
+ " (query, queryLanguage, pageProviderName)");
}
if (StringUtils.isEmpty(search.getQuery()) && StringUtils.isEmpty(search.getQueryLanguage())
&& StringUtils.isEmpty(search.getPageProviderName())) {
throw new InvalidSearchParameterException("query or page provider parameters are missing"
+ " (query, queryLanguage, pageProviderName)");
}
if (!StringUtils.isEmpty(search.getQuery()) && StringUtils.isEmpty(search.getQueryLanguage())) {
throw new InvalidSearchParameterException("queryLanguage parameter is missing");
}
if (StringUtils.isEmpty(search.getQuery()) && !StringUtils.isEmpty(search.getQueryLanguage())) {
throw new InvalidSearchParameterException("query parameter is missing");
}
DocumentModel doc = session.saveDocument(search.getDocument());
search.setDocument(doc);
return search;
}
@Override
public void deleteSavedSearch(CoreSession session, SavedSearch search) {
session.removeDocument(new IdRef(search.getId()));
}
}