/* * #%L * Alfresco Records Management Module * %% * Copyright (C) 2005 - 2016 Alfresco Software Limited * %% * This file is part of the Alfresco software. * - * If the software was purchased under a paid Alfresco license, the terms of * the paid license agreement will prevail. Otherwise, the software is * provided under the following open source license terms: * - * Alfresco is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * Alfresco is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * - * You should have received a copy of the GNU Lesser General Public License * along with Alfresco. If not, see <http://www.gnu.org/licenses/>. * #L% */ package org.alfresco.module.org_alfresco_module_rm.search; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.ArrayList; import java.util.List; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; /** * Compatibility class. * * Used to bridge between the old style of saved search passed and required by the UI and the new actual saved search details. * Eventually will be factored out as web scripts are brought up to date. */ // Not @AlfrescoPublicApi at the moment as it requires RecordsManagementSearchServiceImpl which is not public API. public class SavedSearchDetailsCompatibility implements RecordsManagementModel { /** Saved search details */ private final SavedSearchDetails savedSearchDetails; /** Namespace service */ private final NamespaceService namespaceService; /** Records management search service implementation */ private final RecordsManagementSearchServiceImpl searchService; /** * Retrieve the search from the parameter string * @param params parameter string * @return String search term */ public static String getSearchFromParams(String params) { String search = null; String[] values = params.split("&"); for (String value : values) { if (value.startsWith("terms")) { String[] terms = value.trim().split("="); try { search = URLDecoder.decode(terms[1], "UTF-8"); } catch (UnsupportedEncodingException e) { // Do nothing just return null search = null; } break; } } return search; } public static RecordsManagementSearchParameters createSearchParameters(String params, String sort, NamespaceService namespaceService) { return createSearchParameters(params, new String[]{"&", "="}, sort, namespaceService); } /** * * @param params * @param sort * @param namespaceService * @return */ public static RecordsManagementSearchParameters createSearchParameters(String params, String[] paramsDelim, String sort, NamespaceService namespaceService) { RecordsManagementSearchParameters result = new RecordsManagementSearchParameters(); List<QName> includedContainerTypes = new ArrayList<QName>(2); // Map the param values into the search parameter object String[] values = params.split(paramsDelim[0]); for (String value : values) { String[] paramValues = value.split(paramsDelim[1]); String paramName = paramValues[0].trim(); String paramValue = paramValues[1].trim(); if ("records".equals(paramName)) { result.setIncludeRecords(Boolean.parseBoolean(paramValue)); } else if ("undeclared".equals(paramName)) { result.setIncludeUndeclaredRecords(Boolean.parseBoolean(paramValue)); } else if ("vital".equals(paramName)) { result.setIncludeVitalRecords(Boolean.parseBoolean(paramValue)); } else if ("folders".equals(paramName)) { result.setIncludeRecordFolders(Boolean.parseBoolean(paramValue)); } else if ("frozen".equals(paramName)) { result.setIncludeFrozen(Boolean.parseBoolean(paramValue)); } else if ("cutoff".equals(paramName)) { result.setIncludeCutoff(Boolean.parseBoolean(paramValue)); } else if ("categories".equals(paramName) && Boolean.parseBoolean(paramValue)) { includedContainerTypes.add(TYPE_RECORD_CATEGORY); } } result.setIncludedContainerTypes(includedContainerTypes); if (sort != null) { // Map the sort string into the search details String[] sortPairs = sort.split(","); List<SortItem> sortOrder = new ArrayList<SortItem>(sortPairs.length); for (String sortPairString : sortPairs) { String[] sortPair = sortPairString.split("/"); QName field = QName.createQName(sortPair[0], namespaceService); Boolean isAcsending = Boolean.FALSE; if ("asc".equals(sortPair[1])) { isAcsending = Boolean.TRUE; } sortOrder.add(new SortItem(field, isAcsending)); } result.setSortOrder(sortOrder); } return result; } /** * Constructor * @param savedSearchDetails */ public SavedSearchDetailsCompatibility(SavedSearchDetails savedSearchDetails, NamespaceService namespaceService, RecordsManagementSearchServiceImpl searchService) { this.savedSearchDetails = savedSearchDetails; this.namespaceService = namespaceService; this.searchService = searchService; } /** * Get the sort string from the saved search details * @return */ public String getSort() { StringBuilder builder = new StringBuilder(64); for (SortItem entry : this.savedSearchDetails.getSearchParameters().getSortOrder()) { if (builder.length() !=0) { builder.append(","); } String order = "desc"; if (entry.assc) { order = "asc"; } builder.append(entry.property.toPrefixString(this.namespaceService)) .append("/") .append(order); } return builder.toString(); } /** * Get the parameter string from the saved search details * @return */ public String getParams() { List<QName> includeContainerTypes = this.savedSearchDetails.getSearchParameters().getIncludedContainerTypes(); StringBuilder builder = new StringBuilder(128); builder.append("terms=").append(this.savedSearchDetails.getSearch()).append("&") .append("records=").append(this.savedSearchDetails.getSearchParameters().isIncludeRecords()).append("&") .append("undeclared=").append(this.savedSearchDetails.getSearchParameters().isIncludeUndeclaredRecords()).append("&") .append("vital=").append(this.savedSearchDetails.getSearchParameters().isIncludeVitalRecords()).append("&") .append("folders=").append(this.savedSearchDetails.getSearchParameters().isIncludeRecordFolders()).append("&") .append("frozen=").append(this.savedSearchDetails.getSearchParameters().isIncludeFrozen()).append("&") .append("cutoff=").append(this.savedSearchDetails.getSearchParameters().isIncludeCutoff()).append("&") .append("categories=").append(includeContainerTypes.contains(TYPE_RECORD_CATEGORY)).append("&") .append("series=").append(false); return builder.toString(); } /** * Build the full query string * @return */ public String getQuery() { return searchService.buildQueryString(this.savedSearchDetails.getSearch(), this.savedSearchDetails.getSearchParameters()); } }