001/* 002 * Copyright 2016 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.search.query; 017 018import org.apache.commons.lang.StringUtils; 019import org.apache.solr.client.solrj.util.ClientUtils; 020 021import org.ametys.cms.content.indexing.solr.SolrFieldNames; 022 023/** 024 * Represents a {@link Query} testing the resource location. 025 */ 026public class ResourceLocationQuery implements Query 027{ 028 029 private String _rootId; 030 private String _path; 031 032 /** 033 * Build a resource location query finding resources in a specific root. 034 * @param rootId The root id. 035 */ 036 public ResourceLocationQuery(String rootId) 037 { 038 this(rootId, null); 039 } 040 041 /** 042 * Build a resource location query testing the resource under a folder in a specific root. 043 * @param rootId The root id. 044 * @param path The folder path. 045 */ 046 public ResourceLocationQuery(String rootId, String path) 047 { 048 _rootId = rootId; 049 _path = StringUtils.defaultString(path); 050 } 051 052 @Override 053 public String build() throws QuerySyntaxException 054 { 055 StringBuilder query = new StringBuilder(); 056 057 String path = StringUtils.stripEnd(_path, "/"); 058 059 // (path:\/folder\/* AND resourceRootId:"collection://xxx") 060 query.append('(').append(SolrFieldNames.PATH).append(':') 061 .append(ClientUtils.escapeQueryChars(path)).append("\\/*") 062 .append(" AND ").append(SolrFieldNames.RESOURCE_ROOT_ID) 063 .append(":\"").append(_rootId).append("\")"); 064 065 return query.toString(); 066 } 067 068 @Override 069 public int hashCode() 070 { 071 final int prime = 31; 072 int result = 1; 073 result = prime * result + ((_path == null) ? 0 : _path.hashCode()); 074 result = prime * result + ((_rootId == null) ? 0 : _rootId.hashCode()); 075 return result; 076 } 077 078 @Override 079 public boolean equals(Object obj) 080 { 081 if (this == obj) 082 { 083 return true; 084 } 085 if (obj == null) 086 { 087 return false; 088 } 089 if (getClass() != obj.getClass()) 090 { 091 return false; 092 } 093 ResourceLocationQuery other = (ResourceLocationQuery) obj; 094 if (_path == null) 095 { 096 if (other._path != null) 097 { 098 return false; 099 } 100 } 101 else if (!_path.equals(other._path)) 102 { 103 return false; 104 } 105 if (_rootId == null) 106 { 107 if (other._rootId != null) 108 { 109 return false; 110 } 111 } 112 else if (!_rootId.equals(other._rootId)) 113 { 114 return false; 115 } 116 return true; 117 } 118}