mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
RSOLR 049: Trash can and deleted items - store <-> url configuration and unsupported store exception
- redirection complete RSOLR 049: HTTPClient pooling and sharing by query - connection to solr shared by query git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@29381 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -139,38 +139,6 @@
|
|||||||
</property>
|
</property>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="search.solr.fts.alfresco" class="org.alfresco.repo.search.impl.solr.SolrAlfrescoFTSQueryLanguage" >
|
|
||||||
<property name="nodeDAO">
|
|
||||||
<ref bean="nodeDAO" />
|
|
||||||
</property>
|
|
||||||
<property name="permissionService">
|
|
||||||
<ref bean="permissionService" />
|
|
||||||
</property>
|
|
||||||
<property name="factories">
|
|
||||||
<list>
|
|
||||||
<ref bean="search.admLuceneIndexerAndSearcherFactory" />
|
|
||||||
<ref bean="search.admLuceneUnIndexedIndexerAndSearcherFactory" />
|
|
||||||
<ref bean="search.avmLuceneIndexerAndSearcherFactory" />
|
|
||||||
</list>
|
|
||||||
</property>
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
<bean id="search.solr.cmis" class="org.alfresco.repo.search.impl.solr.SolrCMISQueryLanguage" >
|
|
||||||
<property name="nodeDAO">
|
|
||||||
<ref bean="nodeDAO" />
|
|
||||||
</property>
|
|
||||||
<property name="permissionService">
|
|
||||||
<ref bean="permissionService" />
|
|
||||||
</property>
|
|
||||||
<property name="factories">
|
|
||||||
<list>
|
|
||||||
<ref bean="search.admLuceneIndexerAndSearcherFactory" />
|
|
||||||
<ref bean="search.admLuceneUnIndexedIndexerAndSearcherFactory" />
|
|
||||||
<ref bean="search.avmLuceneIndexerAndSearcherFactory" />
|
|
||||||
</list>
|
|
||||||
</property>
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
<bean id="search.abstractLuceneIndexerAndSearcherFactory" abstract="true">
|
<bean id="search.abstractLuceneIndexerAndSearcherFactory" abstract="true">
|
||||||
<property name="indexRootLocation">
|
<property name="indexRootLocation">
|
||||||
<value>${dir.indexes}</value>
|
<value>${dir.indexes}</value>
|
||||||
|
@@ -29,21 +29,37 @@
|
|||||||
</property>
|
</property>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
|
<bean id="search.solrQueryHTTPCLient" class="org.alfresco.repo.search.impl.solr.SolrQueryHTTPClient" >
|
||||||
<bean id="search.abstract.query.language" abstract="true">
|
|
||||||
<property name="baseUrl">
|
<property name="baseUrl">
|
||||||
<value>${solr.base.url}</value>
|
<value>${solr.base.url}</value>
|
||||||
</property>
|
</property>
|
||||||
</bean>
|
|
||||||
|
|
||||||
<bean id="search.lucene.alfresco" class="org.alfresco.repo.search.impl.solr.SolrAlfrescoQueryLanguage"
|
|
||||||
parent="search.abstract.query.language" >
|
|
||||||
<property name="nodeDAO">
|
<property name="nodeDAO">
|
||||||
<ref bean="nodeDAO" />
|
<ref bean="nodeDAO" />
|
||||||
</property>
|
</property>
|
||||||
<property name="permissionService">
|
<property name="permissionService">
|
||||||
<ref bean="permissionService" />
|
<ref bean="permissionService" />
|
||||||
</property>
|
</property>
|
||||||
|
<property name="languageMappings">
|
||||||
|
<map>
|
||||||
|
<entry key="lucene" value="alfresco" />
|
||||||
|
<entry key="solr-alfresco" value="alfresco" />
|
||||||
|
<entry key="cmis-strict" value="cmis" />
|
||||||
|
<entry key="cmis-alfresco" value="cmis" />
|
||||||
|
<entry key="solr-cmis" value="cmis" />
|
||||||
|
<entry key="fts-alfresco" value="afts" />
|
||||||
|
<entry key="solr-fts-alfresco" value="afts" />
|
||||||
|
</map>
|
||||||
|
</property>
|
||||||
|
<property name="storeMappings">
|
||||||
|
<map>
|
||||||
|
<entry key="workspace://SpacesStore" value="alfresco" />
|
||||||
|
<entry key="archive://SpacesStore" value="archive" />
|
||||||
|
</map>
|
||||||
|
</property>
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
|
||||||
|
<bean id="search.lucene.alfresco" class="org.alfresco.repo.search.impl.solr.SolrQueryLanguage" >
|
||||||
<property name="factories">
|
<property name="factories">
|
||||||
<list>
|
<list>
|
||||||
<ref bean="search.indexerAndSearcherFactory" />
|
<ref bean="search.indexerAndSearcherFactory" />
|
||||||
@@ -52,18 +68,30 @@
|
|||||||
<property name="name">
|
<property name="name">
|
||||||
<value>lucene</value>
|
<value>lucene</value>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="solrQueryHTTPClient">
|
||||||
|
<ref bean="search.solrQueryHTTPCLient" />
|
||||||
|
</property>
|
||||||
|
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
<bean id="search.solr.alfresco" class="org.alfresco.repo.search.impl.solr.SolrQueryLanguage" >
|
||||||
|
<property name="factories">
|
||||||
|
<list>
|
||||||
|
<ref bean="search.indexerAndSearcherFactory" />
|
||||||
|
</list>
|
||||||
|
</property>
|
||||||
|
<property name="name">
|
||||||
|
<value>solr-alfresco</value>
|
||||||
|
</property>
|
||||||
|
<property name="solrQueryHTTPClient">
|
||||||
|
<ref bean="search.solrQueryHTTPCLient" />
|
||||||
|
</property>
|
||||||
|
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<!-- TODO: XPATH -->
|
<!-- TODO: XPATH -->
|
||||||
|
|
||||||
<bean id="search.lucene.fts.alfresco" class="org.alfresco.repo.search.impl.solr.SolrAlfrescoFTSQueryLanguage"
|
<bean id="search.lucene.fts.alfresco" class="org.alfresco.repo.search.impl.solr.SolrQueryLanguage" >
|
||||||
parent="search.abstract.query.language" >
|
|
||||||
<property name="nodeDAO">
|
|
||||||
<ref bean="nodeDAO" />
|
|
||||||
</property>
|
|
||||||
<property name="permissionService">
|
|
||||||
<ref bean="permissionService" />
|
|
||||||
</property>
|
|
||||||
<property name="factories">
|
<property name="factories">
|
||||||
<list>
|
<list>
|
||||||
<ref bean="search.indexerAndSearcherFactory" />
|
<ref bean="search.indexerAndSearcherFactory" />
|
||||||
@@ -72,36 +100,65 @@
|
|||||||
<property name="name">
|
<property name="name">
|
||||||
<value>fts-alfresco</value>
|
<value>fts-alfresco</value>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="solrQueryHTTPClient">
|
||||||
|
<ref bean="search.solrQueryHTTPCLient" />
|
||||||
|
</property>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="search.solr.fts.alfresco" class="org.alfresco.repo.search.impl.solr.SolrAlfrescoFTSQueryLanguage"
|
<bean id="search.solr.fts.alfresco" class="org.alfresco.repo.search.impl.solr.SolrQueryLanguage" >
|
||||||
parent="search.abstract.query.language" >
|
|
||||||
<property name="nodeDAO">
|
|
||||||
<ref bean="nodeDAO" />
|
|
||||||
</property>
|
|
||||||
<property name="permissionService">
|
|
||||||
<ref bean="permissionService" />
|
|
||||||
</property>
|
|
||||||
<property name="factories">
|
<property name="factories">
|
||||||
<list>
|
<list>
|
||||||
<ref bean="search.indexerAndSearcherFactory" />
|
<ref bean="search.indexerAndSearcherFactory" />
|
||||||
</list>
|
</list>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="name">
|
||||||
|
<value>solr-fts-alfresco</value>
|
||||||
|
</property>
|
||||||
|
<property name="solrQueryHTTPClient">
|
||||||
|
<ref bean="search.solrQueryHTTPCLient" />
|
||||||
|
</property>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="search.solr.cmis" class="org.alfresco.repo.search.impl.solr.SolrCMISQueryLanguage"
|
<bean id="search.solr.cmis" class="org.alfresco.repo.search.impl.solr.SolrQueryLanguage" >
|
||||||
parent="search.abstract.query.language" >
|
|
||||||
<property name="nodeDAO">
|
|
||||||
<ref bean="nodeDAO" />
|
|
||||||
</property>
|
|
||||||
<property name="permissionService">
|
|
||||||
<ref bean="permissionService" />
|
|
||||||
</property>
|
|
||||||
<property name="factories">
|
<property name="factories">
|
||||||
<list>
|
<list>
|
||||||
<ref bean="search.indexerAndSearcherFactory" />
|
<ref bean="search.indexerAndSearcherFactory" />
|
||||||
</list>
|
</list>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="name">
|
||||||
|
<value>solr-cmis</value>
|
||||||
|
</property>
|
||||||
|
<property name="solrQueryHTTPClient">
|
||||||
|
<ref bean="search.solrQueryHTTPCLient" />
|
||||||
|
</property>
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
<bean id="search.lucene.sql.alfresco" class="org.alfresco.repo.search.impl.solr.SolrQueryLanguage" >
|
||||||
|
<property name="factories">
|
||||||
|
<list>
|
||||||
|
<ref bean="search.indexerAndSearcherFactory" />
|
||||||
|
</list>
|
||||||
|
</property>
|
||||||
|
<property name="name">
|
||||||
|
<value>cmis-alfrecso</value>
|
||||||
|
</property>
|
||||||
|
<property name="solrQueryHTTPClient">
|
||||||
|
<ref bean="search.solrQueryHTTPCLient" />
|
||||||
|
</property>
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
<bean id="search.lucene.sql.cmis.strict" class="org.alfresco.repo.search.impl.solr.SolrQueryLanguage" >
|
||||||
|
<property name="factories">
|
||||||
|
<list>
|
||||||
|
<ref bean="search.indexerAndSearcherFactory" />
|
||||||
|
</list>
|
||||||
|
</property>
|
||||||
|
<property name="name">
|
||||||
|
<value>cmis-strict</value>
|
||||||
|
</property>
|
||||||
|
<property name="solrQueryHTTPClient">
|
||||||
|
<ref bean="search.solrQueryHTTPCLient" />
|
||||||
|
</property>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1,291 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2005-2010 Alfresco Software Limited.
|
|
||||||
*
|
|
||||||
* This file is part of Alfresco
|
|
||||||
*
|
|
||||||
* 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/>.
|
|
||||||
*/
|
|
||||||
package org.alfresco.repo.search.impl.solr;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.io.Reader;
|
|
||||||
import java.io.UnsupportedEncodingException;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Locale;
|
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
|
|
||||||
import org.alfresco.repo.domain.node.NodeDAO;
|
|
||||||
import org.alfresco.repo.search.impl.lucene.ADMLuceneSearcherImpl;
|
|
||||||
import org.alfresco.repo.search.impl.lucene.AbstractLuceneQueryLanguage;
|
|
||||||
import org.alfresco.repo.search.impl.lucene.LuceneQueryParserException;
|
|
||||||
import org.alfresco.repo.search.impl.lucene.SolrJSONResultSet;
|
|
||||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
|
||||||
import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter;
|
|
||||||
import org.alfresco.service.cmr.search.ResultSet;
|
|
||||||
import org.alfresco.service.cmr.search.ResultSetRow;
|
|
||||||
import org.alfresco.service.cmr.search.SearchParameters;
|
|
||||||
import org.alfresco.service.cmr.search.SearchService;
|
|
||||||
import org.alfresco.service.cmr.search.SearchParameters.SortDefinition;
|
|
||||||
import org.alfresco.service.cmr.security.PermissionService;
|
|
||||||
import org.apache.commons.codec.net.URLCodec;
|
|
||||||
import org.apache.commons.httpclient.HttpClient;
|
|
||||||
import org.apache.commons.httpclient.HttpException;
|
|
||||||
import org.apache.commons.httpclient.UsernamePasswordCredentials;
|
|
||||||
import org.apache.commons.httpclient.auth.AuthScope;
|
|
||||||
import org.apache.commons.httpclient.methods.ByteArrayRequestEntity;
|
|
||||||
import org.apache.commons.httpclient.methods.PostMethod;
|
|
||||||
import org.apache.commons.httpclient.methods.RequestEntity;
|
|
||||||
import org.apache.commons.httpclient.params.HttpClientParams;
|
|
||||||
import org.apache.commons.logging.Log;
|
|
||||||
import org.apache.commons.logging.LogFactory;
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.json.JSONTokener;
|
|
||||||
import org.springframework.extensions.surf.util.I18NUtil;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Andy
|
|
||||||
*/
|
|
||||||
public class SolrAlfrescoFTSQueryLanguage extends AbstractSolrQueryLanguage
|
|
||||||
{
|
|
||||||
static Log s_logger = LogFactory.getLog(SolrAlfrescoFTSQueryLanguage.class);
|
|
||||||
|
|
||||||
private NodeDAO nodeDAO;
|
|
||||||
|
|
||||||
private PermissionService permissionService;
|
|
||||||
|
|
||||||
public SolrAlfrescoFTSQueryLanguage()
|
|
||||||
{
|
|
||||||
this.setName(SearchService.LANGUAGE_SOLR_FTS_ALFRESCO);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param nodeDAO the nodeDAO to set
|
|
||||||
*/
|
|
||||||
public void setNodeDAO(NodeDAO nodeDAO)
|
|
||||||
{
|
|
||||||
this.nodeDAO = nodeDAO;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param permissionService the permissionService to set
|
|
||||||
*/
|
|
||||||
public void setPermissionService(PermissionService permissionService)
|
|
||||||
{
|
|
||||||
this.permissionService = permissionService;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* (non-Javadoc)
|
|
||||||
* @seeorg.alfresco.repo.search.impl.lucene.LuceneQueryLanguageSPI#executeQuery(org.alfresco.service.cmr.search.
|
|
||||||
* SearchParameters, org.alfresco.repo.search.impl.lucene.ADMLuceneSearcherImpl)
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public ResultSet executeQuery(SearchParameters searchParameters, ADMLuceneSearcherImpl admLuceneSearcher)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
HttpClient httpClient = new HttpClient();
|
|
||||||
httpClient.getParams().setBooleanParameter(HttpClientParams.PREEMPTIVE_AUTHENTICATION, true);
|
|
||||||
httpClient.getState().setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT), new UsernamePasswordCredentials("admin", "admin"));
|
|
||||||
|
|
||||||
URLCodec encoder = new URLCodec();
|
|
||||||
StringBuilder url = new StringBuilder();
|
|
||||||
url.append(getBaseUrl());
|
|
||||||
url.append("/alfresco/afts");
|
|
||||||
//duplicate the query in the URL
|
|
||||||
url.append("?q=");
|
|
||||||
|
|
||||||
url.append(encoder.encode(searchParameters.getQuery(), "UTF-8"));
|
|
||||||
url.append("&wt=").append(encoder.encode("json", "UTF-8"));
|
|
||||||
url.append("&fl=").append(encoder.encode("*,score", "UTF-8"));
|
|
||||||
if(searchParameters.getMaxItems() > 0)
|
|
||||||
{
|
|
||||||
url.append("&rows=").append(encoder.encode(""+searchParameters.getMaxItems(), "UTF-8"));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
url.append("&rows=").append(encoder.encode(""+Integer.MAX_VALUE, "UTF-8"));
|
|
||||||
}
|
|
||||||
url.append("&df=").append(encoder.encode(searchParameters.getDefaultFieldName(), "UTF-8"));
|
|
||||||
url.append("&start=").append(encoder.encode(""+searchParameters.getSkipCount(), "UTF-8"));
|
|
||||||
|
|
||||||
Locale locale = I18NUtil.getLocale();
|
|
||||||
if(searchParameters.getLocales().size() > 0)
|
|
||||||
{
|
|
||||||
locale = searchParameters.getLocales().get(0);
|
|
||||||
}
|
|
||||||
url.append("&locale=");
|
|
||||||
url.append(encoder.encode(locale.toString(), "UTF-8"));
|
|
||||||
|
|
||||||
StringBuffer sortBuffer = new StringBuffer();
|
|
||||||
for(SortDefinition sortDefinition : searchParameters.getSortDefinitions())
|
|
||||||
{
|
|
||||||
if(sortBuffer.length() == 0)
|
|
||||||
{
|
|
||||||
sortBuffer.append("&sort=");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sortBuffer.append(encoder.encode(", ", "UTF-8"));
|
|
||||||
}
|
|
||||||
sortBuffer.append(encoder.encode(sortDefinition.getField(), "UTF-8")).append(encoder.encode(" ", "UTF-8"));
|
|
||||||
if(sortDefinition.isAscending())
|
|
||||||
{
|
|
||||||
sortBuffer.append(encoder.encode("asc", "UTF-8"));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sortBuffer.append(encoder.encode("desc", "UTF-8"));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
url.append(sortBuffer);
|
|
||||||
|
|
||||||
// Authorities go over in body
|
|
||||||
|
|
||||||
StringBuilder authQuery = new StringBuilder();
|
|
||||||
for(String authority : permissionService.getAuthorisations())
|
|
||||||
{
|
|
||||||
if(authQuery.length() > 0)
|
|
||||||
{
|
|
||||||
authQuery.append(" ");
|
|
||||||
}
|
|
||||||
authQuery.append("AUTHORITY:\"").append(authority).append("\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
//url.append("&fq=");
|
|
||||||
//encoder = new URLCodec();
|
|
||||||
//url.append(encoder.encode(authQuery.toString(), "UTF-8"));
|
|
||||||
|
|
||||||
url.append("&fq=").append(encoder.encode("{!afts}AUTHORITY_FILTER_FROM_JSON", "UTF-8"));
|
|
||||||
|
|
||||||
// facets would go on url?
|
|
||||||
|
|
||||||
JSONObject body = new JSONObject();
|
|
||||||
body.put("query", searchParameters.getQuery());
|
|
||||||
//body.put("defaultField", searchParameters.getDefaultFieldName());
|
|
||||||
|
|
||||||
body.put("filter", authQuery);
|
|
||||||
|
|
||||||
JSONArray locales = new JSONArray();
|
|
||||||
for(Locale currentLocale : searchParameters.getLocales())
|
|
||||||
{
|
|
||||||
locales.put(DefaultTypeConverter.INSTANCE.convert(String.class, currentLocale));
|
|
||||||
}
|
|
||||||
if(locales.length() == 0)
|
|
||||||
{
|
|
||||||
locales.put(I18NUtil.getLocale());
|
|
||||||
}
|
|
||||||
body.put("locales", locales);
|
|
||||||
|
|
||||||
JSONArray templates = new JSONArray();
|
|
||||||
for(String templateName : searchParameters.getQueryTemplates().keySet())
|
|
||||||
{
|
|
||||||
JSONObject template = new JSONObject();
|
|
||||||
template.put("name", templateName);
|
|
||||||
template.put("template", searchParameters.getQueryTemplates().get(templateName));
|
|
||||||
templates.put(template);
|
|
||||||
}
|
|
||||||
body.put("templates", templates);
|
|
||||||
|
|
||||||
JSONArray allAttributes = new JSONArray();
|
|
||||||
for(String attribute : searchParameters.getAllAttributes())
|
|
||||||
{
|
|
||||||
allAttributes.put(attribute);
|
|
||||||
}
|
|
||||||
body.put("allAttributes", allAttributes);
|
|
||||||
|
|
||||||
body.put("defaultFTSOperator", searchParameters.getDefaultFTSOperator());
|
|
||||||
body.put("defaultFTSFieldOperator", searchParameters.getDefaultFTSFieldOperator());
|
|
||||||
if(searchParameters.getMlAnalaysisMode() != null)
|
|
||||||
{
|
|
||||||
body.put("mlAnalaysisMode", searchParameters.getMlAnalaysisMode().toString());
|
|
||||||
}
|
|
||||||
body.put("defaultNamespace", searchParameters.getNamespace());
|
|
||||||
|
|
||||||
|
|
||||||
JSONArray textAttributes = new JSONArray();
|
|
||||||
for(String attribute : searchParameters.getTextAttributes())
|
|
||||||
{
|
|
||||||
textAttributes.put(attribute);
|
|
||||||
}
|
|
||||||
body.put("textAttributes", textAttributes);
|
|
||||||
|
|
||||||
PostMethod post = new PostMethod(url.toString());
|
|
||||||
post.setRequestEntity(new ByteArrayRequestEntity(body.toString().getBytes("UTF-8"), "application/json"));
|
|
||||||
|
|
||||||
httpClient.executeMethod(post);
|
|
||||||
|
|
||||||
if (post.getStatusCode() != HttpServletResponse.SC_OK)
|
|
||||||
{
|
|
||||||
throw new LuceneQueryParserException("Request failed " + post.getStatusCode()+" "+url.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Reader reader = new BufferedReader(new InputStreamReader(post.getResponseBodyAsStream()));
|
|
||||||
// TODO - replace with streaming-based solution e.g. SimpleJSON ContentHandler
|
|
||||||
JSONObject json = new JSONObject(new JSONTokener(reader));
|
|
||||||
SolrJSONResultSet results = new SolrJSONResultSet(json, nodeDAO, searchParameters);
|
|
||||||
if(s_logger.isDebugEnabled())
|
|
||||||
{
|
|
||||||
s_logger.debug("Sent :"+url);
|
|
||||||
s_logger.debug(" with: "+body.toString());
|
|
||||||
s_logger.debug("Got: "+results.getNumberFound()+ " in "+results.getQueryTime()+ " ms");
|
|
||||||
}
|
|
||||||
|
|
||||||
return results;
|
|
||||||
}
|
|
||||||
catch (UnsupportedEncodingException e)
|
|
||||||
{
|
|
||||||
throw new LuceneQueryParserException("", e);
|
|
||||||
}
|
|
||||||
catch (HttpException e)
|
|
||||||
{
|
|
||||||
throw new LuceneQueryParserException("", e);
|
|
||||||
}
|
|
||||||
catch (IOException e)
|
|
||||||
{
|
|
||||||
throw new LuceneQueryParserException("", e);
|
|
||||||
}
|
|
||||||
catch (JSONException e)
|
|
||||||
{
|
|
||||||
throw new LuceneQueryParserException("", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args)
|
|
||||||
{
|
|
||||||
SolrAlfrescoFTSQueryLanguage solrAlfrescoFTSQueryLanguage = new SolrAlfrescoFTSQueryLanguage();
|
|
||||||
SearchParameters sp = new SearchParameters();
|
|
||||||
sp.setQuery("PATH:\"//.\"");
|
|
||||||
sp.setMaxItems(100);
|
|
||||||
sp.setSkipCount(12);
|
|
||||||
ResultSet rs = solrAlfrescoFTSQueryLanguage.executeQuery(sp, null);
|
|
||||||
System.out.println("Found "+rs.length());
|
|
||||||
System.out.println("More "+rs.hasMore());
|
|
||||||
System.out.println("Start "+rs.getStart());
|
|
||||||
|
|
||||||
for(ResultSetRow row : rs)
|
|
||||||
{
|
|
||||||
System.out.println("Score "+row.getScore());
|
|
||||||
}
|
|
||||||
rs.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@@ -1,292 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2005-2010 Alfresco Software Limited.
|
|
||||||
*
|
|
||||||
* This file is part of Alfresco
|
|
||||||
*
|
|
||||||
* 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/>.
|
|
||||||
*/
|
|
||||||
package org.alfresco.repo.search.impl.solr;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.io.Reader;
|
|
||||||
import java.io.UnsupportedEncodingException;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Locale;
|
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
|
|
||||||
import org.alfresco.repo.domain.node.NodeDAO;
|
|
||||||
import org.alfresco.repo.search.impl.lucene.ADMLuceneSearcherImpl;
|
|
||||||
import org.alfresco.repo.search.impl.lucene.AbstractLuceneQueryLanguage;
|
|
||||||
import org.alfresco.repo.search.impl.lucene.LuceneQueryParserException;
|
|
||||||
import org.alfresco.repo.search.impl.lucene.SolrJSONResultSet;
|
|
||||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
|
||||||
import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter;
|
|
||||||
import org.alfresco.service.cmr.search.ResultSet;
|
|
||||||
import org.alfresco.service.cmr.search.ResultSetRow;
|
|
||||||
import org.alfresco.service.cmr.search.SearchParameters;
|
|
||||||
import org.alfresco.service.cmr.search.SearchService;
|
|
||||||
import org.alfresco.service.cmr.search.SearchParameters.SortDefinition;
|
|
||||||
import org.alfresco.service.cmr.security.PermissionService;
|
|
||||||
import org.apache.commons.codec.net.URLCodec;
|
|
||||||
import org.apache.commons.httpclient.HttpClient;
|
|
||||||
import org.apache.commons.httpclient.HttpException;
|
|
||||||
import org.apache.commons.httpclient.UsernamePasswordCredentials;
|
|
||||||
import org.apache.commons.httpclient.auth.AuthScope;
|
|
||||||
import org.apache.commons.httpclient.methods.ByteArrayRequestEntity;
|
|
||||||
import org.apache.commons.httpclient.methods.PostMethod;
|
|
||||||
import org.apache.commons.httpclient.methods.RequestEntity;
|
|
||||||
import org.apache.commons.httpclient.params.HttpClientParams;
|
|
||||||
import org.apache.commons.logging.Log;
|
|
||||||
import org.apache.commons.logging.LogFactory;
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.json.JSONTokener;
|
|
||||||
import org.springframework.extensions.surf.util.I18NUtil;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Andy
|
|
||||||
*/
|
|
||||||
public class SolrAlfrescoQueryLanguage extends AbstractSolrQueryLanguage
|
|
||||||
{
|
|
||||||
static Log s_logger = LogFactory.getLog(SolrAlfrescoQueryLanguage.class);
|
|
||||||
|
|
||||||
private NodeDAO nodeDAO;
|
|
||||||
|
|
||||||
private PermissionService permissionService;
|
|
||||||
|
|
||||||
public SolrAlfrescoQueryLanguage()
|
|
||||||
{
|
|
||||||
this.setName(SearchService.LANGUAGE_SOLR_ALFRESCO);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param nodeDAO the nodeDAO to set
|
|
||||||
*/
|
|
||||||
public void setNodeDAO(NodeDAO nodeDAO)
|
|
||||||
{
|
|
||||||
this.nodeDAO = nodeDAO;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param permissionService the permissionService to set
|
|
||||||
*/
|
|
||||||
public void setPermissionService(PermissionService permissionService)
|
|
||||||
{
|
|
||||||
this.permissionService = permissionService;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* (non-Javadoc)
|
|
||||||
* @seeorg.alfresco.repo.search.impl.lucene.LuceneQueryLanguageSPI#executeQuery(org.alfresco.service.cmr.search.
|
|
||||||
* SearchParameters, org.alfresco.repo.search.impl.lucene.ADMLuceneSearcherImpl)
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public ResultSet executeQuery(SearchParameters searchParameters, ADMLuceneSearcherImpl admLuceneSearcher)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
HttpClient httpClient = new HttpClient();
|
|
||||||
httpClient.getParams().setBooleanParameter(HttpClientParams.PREEMPTIVE_AUTHENTICATION, true);
|
|
||||||
httpClient.getState().setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT), new UsernamePasswordCredentials("admin", "admin"));
|
|
||||||
|
|
||||||
URLCodec encoder = new URLCodec();
|
|
||||||
StringBuilder url = new StringBuilder();
|
|
||||||
url.append(getBaseUrl());
|
|
||||||
url.append("/alfresco/alfresco");
|
|
||||||
//duplicate the query in the URL
|
|
||||||
//duplicate the query in the URL
|
|
||||||
url.append("?q=");
|
|
||||||
|
|
||||||
url.append(encoder.encode(searchParameters.getQuery(), "UTF-8"));
|
|
||||||
url.append("&wt=").append(encoder.encode("json", "UTF-8"));
|
|
||||||
url.append("&fl=").append(encoder.encode("*,score", "UTF-8"));
|
|
||||||
if(searchParameters.getMaxItems() > 0)
|
|
||||||
{
|
|
||||||
url.append("&rows=").append(encoder.encode(""+searchParameters.getMaxItems(), "UTF-8"));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
url.append("&rows=").append(encoder.encode(""+Integer.MAX_VALUE, "UTF-8"));
|
|
||||||
}
|
|
||||||
url.append("&df=").append(encoder.encode(searchParameters.getDefaultFieldName(), "UTF-8"));
|
|
||||||
url.append("&start=").append(encoder.encode(""+searchParameters.getSkipCount(), "UTF-8"));
|
|
||||||
|
|
||||||
Locale locale = I18NUtil.getLocale();
|
|
||||||
if(searchParameters.getLocales().size() > 0)
|
|
||||||
{
|
|
||||||
locale = searchParameters.getLocales().get(0);
|
|
||||||
}
|
|
||||||
url.append("&locale=");
|
|
||||||
url.append(encoder.encode(locale.toString(), "UTF-8"));
|
|
||||||
|
|
||||||
StringBuffer sortBuffer = new StringBuffer();
|
|
||||||
for(SortDefinition sortDefinition : searchParameters.getSortDefinitions())
|
|
||||||
{
|
|
||||||
if(sortBuffer.length() == 0)
|
|
||||||
{
|
|
||||||
sortBuffer.append("&sort=");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sortBuffer.append(encoder.encode(", ", "UTF-8"));
|
|
||||||
}
|
|
||||||
sortBuffer.append(encoder.encode(sortDefinition.getField(), "UTF-8")).append(encoder.encode(" ", "UTF-8"));
|
|
||||||
if(sortDefinition.isAscending())
|
|
||||||
{
|
|
||||||
sortBuffer.append(encoder.encode("asc", "UTF-8"));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sortBuffer.append(encoder.encode("desc", "UTF-8"));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
url.append(sortBuffer);
|
|
||||||
|
|
||||||
// Authorities go over in body
|
|
||||||
|
|
||||||
StringBuilder authQuery = new StringBuilder();
|
|
||||||
for(String authority : permissionService.getAuthorisations())
|
|
||||||
{
|
|
||||||
if(authQuery.length() > 0)
|
|
||||||
{
|
|
||||||
authQuery.append(" ");
|
|
||||||
}
|
|
||||||
authQuery.append("AUTHORITY:\"").append(authority).append("\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
//url.append("&fq=");
|
|
||||||
//encoder = new URLCodec();
|
|
||||||
//url.append(encoder.encode(authQuery.toString(), "UTF-8"));
|
|
||||||
|
|
||||||
url.append("&fq=").append(encoder.encode("{!afts}AUTHORITY_FILTER_FROM_JSON", "UTF-8"));
|
|
||||||
|
|
||||||
// facets would go on url?
|
|
||||||
|
|
||||||
JSONObject body = new JSONObject();
|
|
||||||
body.put("query", searchParameters.getQuery());
|
|
||||||
//body.put("defaultField", searchParameters.getDefaultFieldName());
|
|
||||||
|
|
||||||
body.put("filter", authQuery);
|
|
||||||
|
|
||||||
JSONArray locales = new JSONArray();
|
|
||||||
for(Locale currentLocale : searchParameters.getLocales())
|
|
||||||
{
|
|
||||||
locales.put(DefaultTypeConverter.INSTANCE.convert(String.class, currentLocale));
|
|
||||||
}
|
|
||||||
if(locales.length() == 0)
|
|
||||||
{
|
|
||||||
locales.put(I18NUtil.getLocale());
|
|
||||||
}
|
|
||||||
body.put("locales", locales);
|
|
||||||
|
|
||||||
JSONArray templates = new JSONArray();
|
|
||||||
for(String templateName : searchParameters.getQueryTemplates().keySet())
|
|
||||||
{
|
|
||||||
JSONObject template = new JSONObject();
|
|
||||||
template.put("name", templateName);
|
|
||||||
template.put("template", searchParameters.getQueryTemplates().get(templateName));
|
|
||||||
templates.put(template);
|
|
||||||
}
|
|
||||||
body.put("templates", templates);
|
|
||||||
|
|
||||||
JSONArray allAttributes = new JSONArray();
|
|
||||||
for(String attribute : searchParameters.getAllAttributes())
|
|
||||||
{
|
|
||||||
allAttributes.put(attribute);
|
|
||||||
}
|
|
||||||
body.put("allAttributes", allAttributes);
|
|
||||||
|
|
||||||
body.put("defaultFTSOperator", searchParameters.getDefaultFTSOperator());
|
|
||||||
body.put("defaultFTSFieldOperator", searchParameters.getDefaultFTSFieldOperator());
|
|
||||||
if(searchParameters.getMlAnalaysisMode() != null)
|
|
||||||
{
|
|
||||||
body.put("mlAnalaysisMode", searchParameters.getMlAnalaysisMode().toString());
|
|
||||||
}
|
|
||||||
body.put("defaultNamespace", searchParameters.getNamespace());
|
|
||||||
|
|
||||||
|
|
||||||
JSONArray textAttributes = new JSONArray();
|
|
||||||
for(String attribute : searchParameters.getTextAttributes())
|
|
||||||
{
|
|
||||||
textAttributes.put(attribute);
|
|
||||||
}
|
|
||||||
body.put("textAttributes", textAttributes);
|
|
||||||
|
|
||||||
PostMethod post = new PostMethod(url.toString());
|
|
||||||
post.setRequestEntity(new ByteArrayRequestEntity(body.toString().getBytes("UTF-8"), "application/json"));
|
|
||||||
|
|
||||||
httpClient.executeMethod(post);
|
|
||||||
|
|
||||||
if (post.getStatusCode() != HttpServletResponse.SC_OK)
|
|
||||||
{
|
|
||||||
throw new LuceneQueryParserException("Request failed " + post.getStatusCode()+" "+url.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Reader reader = new BufferedReader(new InputStreamReader(post.getResponseBodyAsStream()));
|
|
||||||
// TODO - replace with streaming-based solution e.g. SimpleJSON ContentHandler
|
|
||||||
JSONObject json = new JSONObject(new JSONTokener(reader));
|
|
||||||
SolrJSONResultSet results = new SolrJSONResultSet(json, nodeDAO, searchParameters);
|
|
||||||
if(s_logger.isDebugEnabled())
|
|
||||||
{
|
|
||||||
s_logger.debug("Sent :"+url);
|
|
||||||
s_logger.debug(" with: "+body.toString());
|
|
||||||
s_logger.debug("Got: "+results.getNumberFound()+ " in "+results.getQueryTime()+ " ms");
|
|
||||||
}
|
|
||||||
|
|
||||||
return results;
|
|
||||||
}
|
|
||||||
catch (UnsupportedEncodingException e)
|
|
||||||
{
|
|
||||||
throw new LuceneQueryParserException("", e);
|
|
||||||
}
|
|
||||||
catch (HttpException e)
|
|
||||||
{
|
|
||||||
throw new LuceneQueryParserException("", e);
|
|
||||||
}
|
|
||||||
catch (IOException e)
|
|
||||||
{
|
|
||||||
throw new LuceneQueryParserException("", e);
|
|
||||||
}
|
|
||||||
catch (JSONException e)
|
|
||||||
{
|
|
||||||
throw new LuceneQueryParserException("", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args)
|
|
||||||
{
|
|
||||||
SolrAlfrescoQueryLanguage solrAlfrescoFTSQueryLanguage = new SolrAlfrescoQueryLanguage();
|
|
||||||
SearchParameters sp = new SearchParameters();
|
|
||||||
sp.setQuery("PATH:\"//.\"");
|
|
||||||
sp.setMaxItems(100);
|
|
||||||
sp.setSkipCount(12);
|
|
||||||
ResultSet rs = solrAlfrescoFTSQueryLanguage.executeQuery(sp, null);
|
|
||||||
System.out.println("Found "+rs.length());
|
|
||||||
System.out.println("More "+rs.hasMore());
|
|
||||||
System.out.println("Start "+rs.getStart());
|
|
||||||
|
|
||||||
for(ResultSetRow row : rs)
|
|
||||||
{
|
|
||||||
System.out.println("Score "+row.getScore());
|
|
||||||
}
|
|
||||||
rs.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@@ -24,24 +24,23 @@ import java.io.InputStreamReader;
|
|||||||
import java.io.Reader;
|
import java.io.Reader;
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import org.alfresco.error.AlfrescoRuntimeException;
|
||||||
import org.alfresco.repo.domain.node.NodeDAO;
|
import org.alfresco.repo.domain.node.NodeDAO;
|
||||||
import org.alfresco.repo.search.impl.lucene.ADMLuceneSearcherImpl;
|
|
||||||
import org.alfresco.repo.search.impl.lucene.AbstractLuceneQueryLanguage;
|
|
||||||
import org.alfresco.repo.search.impl.lucene.LuceneQueryParserException;
|
import org.alfresco.repo.search.impl.lucene.LuceneQueryParserException;
|
||||||
import org.alfresco.repo.search.impl.lucene.SolrJSONResultSet;
|
import org.alfresco.repo.search.impl.lucene.SolrJSONResultSet;
|
||||||
import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter;
|
import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter;
|
||||||
import org.alfresco.service.cmr.search.ResultSet;
|
import org.alfresco.service.cmr.search.ResultSet;
|
||||||
import org.alfresco.service.cmr.search.ResultSetRow;
|
|
||||||
import org.alfresco.service.cmr.search.SearchParameters;
|
import org.alfresco.service.cmr.search.SearchParameters;
|
||||||
import org.alfresco.service.cmr.search.SearchParameters.SortDefinition;
|
import org.alfresco.service.cmr.search.SearchParameters.SortDefinition;
|
||||||
import org.alfresco.service.cmr.search.SearchService;
|
|
||||||
import org.alfresco.service.cmr.security.PermissionService;
|
import org.alfresco.service.cmr.security.PermissionService;
|
||||||
import org.apache.commons.codec.net.URLCodec;
|
import org.apache.commons.codec.net.URLCodec;
|
||||||
import org.apache.commons.httpclient.HttpClient;
|
import org.apache.commons.httpclient.HttpClient;
|
||||||
import org.apache.commons.httpclient.HttpException;
|
import org.apache.commons.httpclient.HttpException;
|
||||||
|
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
|
||||||
import org.apache.commons.httpclient.UsernamePasswordCredentials;
|
import org.apache.commons.httpclient.UsernamePasswordCredentials;
|
||||||
import org.apache.commons.httpclient.auth.AuthScope;
|
import org.apache.commons.httpclient.auth.AuthScope;
|
||||||
import org.apache.commons.httpclient.methods.ByteArrayRequestEntity;
|
import org.apache.commons.httpclient.methods.ByteArrayRequestEntity;
|
||||||
@@ -58,56 +57,80 @@ import org.springframework.extensions.surf.util.I18NUtil;
|
|||||||
/**
|
/**
|
||||||
* @author Andy
|
* @author Andy
|
||||||
*/
|
*/
|
||||||
public class SolrCMISQueryLanguage extends AbstractSolrQueryLanguage
|
public class SolrQueryHTTPClient
|
||||||
{
|
{
|
||||||
static Log s_logger = LogFactory.getLog(SolrCMISQueryLanguage.class);
|
static Log s_logger = LogFactory.getLog(SolrQueryHTTPClient.class);
|
||||||
|
|
||||||
private NodeDAO nodeDAO;
|
private NodeDAO nodeDAO;
|
||||||
|
|
||||||
private PermissionService permissionService;
|
private PermissionService permissionService;
|
||||||
|
|
||||||
public SolrCMISQueryLanguage()
|
private Map<String, String> languageMappings;
|
||||||
|
|
||||||
|
private Map<String, String> storeMappings;
|
||||||
|
|
||||||
|
private String baseUrl;
|
||||||
|
|
||||||
|
private HttpClient httpClient;
|
||||||
|
|
||||||
|
public SolrQueryHTTPClient()
|
||||||
{
|
{
|
||||||
this.setName(SearchService.LANGUAGE_SOLR_CMIS);
|
MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
|
||||||
|
httpClient = new HttpClient(connectionManager);
|
||||||
|
httpClient.getParams().setBooleanParameter(HttpClientParams.PREEMPTIVE_AUTHENTICATION, true);
|
||||||
|
httpClient.getState().setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT), new UsernamePasswordCredentials("admin", "admin"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param nodeDAO
|
|
||||||
* the nodeDAO to set
|
|
||||||
*/
|
|
||||||
public void setNodeDAO(NodeDAO nodeDAO)
|
public void setNodeDAO(NodeDAO nodeDAO)
|
||||||
{
|
{
|
||||||
this.nodeDAO = nodeDAO;
|
this.nodeDAO = nodeDAO;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param permissionService
|
|
||||||
* the permissionService to set
|
|
||||||
*/
|
|
||||||
public void setPermissionService(PermissionService permissionService)
|
public void setPermissionService(PermissionService permissionService)
|
||||||
{
|
{
|
||||||
this.permissionService = permissionService;
|
this.permissionService = permissionService;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
public void setLanguageMappings(Map<String, String> languageMappings)
|
||||||
* (non-Javadoc)
|
{
|
||||||
* @seeorg.alfresco.repo.search.impl.lucene.LuceneQueryLanguageSPI#executeQuery(org.alfresco.service.cmr.search.
|
this.languageMappings = languageMappings;
|
||||||
* SearchParameters, org.alfresco.repo.search.impl.lucene.ADMLuceneSearcherImpl)
|
}
|
||||||
*/
|
|
||||||
@Override
|
public void setStoreMappings(Map<String, String> storeMappings)
|
||||||
public ResultSet executeQuery(SearchParameters searchParameters, ADMLuceneSearcherImpl admLuceneSearcher)
|
{
|
||||||
|
this.storeMappings = storeMappings;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBaseUrl(String baseUrl)
|
||||||
|
{
|
||||||
|
this.baseUrl = baseUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ResultSet executeQuery(SearchParameters searchParameters, String language)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
HttpClient httpClient = new HttpClient();
|
|
||||||
httpClient.getParams().setBooleanParameter(HttpClientParams.PREEMPTIVE_AUTHENTICATION, true);
|
|
||||||
httpClient.getState().setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT), new UsernamePasswordCredentials("admin", "admin"));
|
|
||||||
|
|
||||||
URLCodec encoder = new URLCodec();
|
URLCodec encoder = new URLCodec();
|
||||||
StringBuilder url = new StringBuilder();
|
StringBuilder url = new StringBuilder();
|
||||||
url.append(getBaseUrl());
|
url.append(baseUrl);
|
||||||
url.append("/alfresco/cmis");
|
if (searchParameters.getStores().size() == 0)
|
||||||
//duplicate the query in the URL
|
{
|
||||||
|
throw new AlfrescoRuntimeException("No store for query");
|
||||||
|
}
|
||||||
|
String storeUrlFragment = storeMappings.get(searchParameters.getStores().get(0).toString());
|
||||||
|
if (storeUrlFragment == null)
|
||||||
|
{
|
||||||
|
throw new AlfrescoRuntimeException("No solr query support for store " + searchParameters.getStores().get(0).toString());
|
||||||
|
}
|
||||||
|
url.append("/").append(storeUrlFragment);
|
||||||
|
String languageUrlFragment = languageMappings.get(language);
|
||||||
|
if (languageUrlFragment == null)
|
||||||
|
{
|
||||||
|
throw new AlfrescoRuntimeException("No solr query support for language " + language);
|
||||||
|
}
|
||||||
|
url.append("/").append(languageUrlFragment);
|
||||||
|
|
||||||
// duplicate the query in the URL
|
// duplicate the query in the URL
|
||||||
url.append("?q=");
|
url.append("?q=");
|
||||||
|
|
||||||
@@ -194,7 +217,6 @@ public class SolrCMISQueryLanguage extends AbstractSolrQueryLanguage
|
|||||||
}
|
}
|
||||||
body.put("locales", locales);
|
body.put("locales", locales);
|
||||||
|
|
||||||
// templates etc may affect CONTAINS() clause
|
|
||||||
JSONArray templates = new JSONArray();
|
JSONArray templates = new JSONArray();
|
||||||
for (String templateName : searchParameters.getQueryTemplates().keySet())
|
for (String templateName : searchParameters.getQueryTemplates().keySet())
|
||||||
{
|
{
|
||||||
@@ -230,6 +252,8 @@ public class SolrCMISQueryLanguage extends AbstractSolrQueryLanguage
|
|||||||
PostMethod post = new PostMethod(url.toString());
|
PostMethod post = new PostMethod(url.toString());
|
||||||
post.setRequestEntity(new ByteArrayRequestEntity(body.toString().getBytes("UTF-8"), "application/json"));
|
post.setRequestEntity(new ByteArrayRequestEntity(body.toString().getBytes("UTF-8"), "application/json"));
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
httpClient.executeMethod(post);
|
httpClient.executeMethod(post);
|
||||||
|
|
||||||
if (post.getStatusCode() != HttpServletResponse.SC_OK)
|
if (post.getStatusCode() != HttpServletResponse.SC_OK)
|
||||||
@@ -250,6 +274,11 @@ public class SolrCMISQueryLanguage extends AbstractSolrQueryLanguage
|
|||||||
|
|
||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
post.releaseConnection();
|
||||||
|
}
|
||||||
|
}
|
||||||
catch (UnsupportedEncodingException e)
|
catch (UnsupportedEncodingException e)
|
||||||
{
|
{
|
||||||
throw new LuceneQueryParserException("", e);
|
throw new LuceneQueryParserException("", e);
|
||||||
@@ -268,23 +297,4 @@ public class SolrCMISQueryLanguage extends AbstractSolrQueryLanguage
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args)
|
|
||||||
{
|
|
||||||
SolrCMISQueryLanguage solrAlfrescoFTSQueryLanguage = new SolrCMISQueryLanguage();
|
|
||||||
SearchParameters sp = new SearchParameters();
|
|
||||||
sp.setQuery("PATH:\"//.\"");
|
|
||||||
sp.setMaxItems(100);
|
|
||||||
sp.setSkipCount(12);
|
|
||||||
ResultSet rs = solrAlfrescoFTSQueryLanguage.executeQuery(sp, null);
|
|
||||||
System.out.println("Found " + rs.length());
|
|
||||||
System.out.println("More " + rs.hasMore());
|
|
||||||
System.out.println("Start " + rs.getStart());
|
|
||||||
|
|
||||||
for (ResultSetRow row : rs)
|
|
||||||
{
|
|
||||||
System.out.println("Score " + row.getScore());
|
|
||||||
}
|
|
||||||
rs.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
@@ -18,25 +18,35 @@
|
|||||||
*/
|
*/
|
||||||
package org.alfresco.repo.search.impl.solr;
|
package org.alfresco.repo.search.impl.solr;
|
||||||
|
|
||||||
|
import org.alfresco.repo.search.impl.lucene.ADMLuceneSearcherImpl;
|
||||||
import org.alfresco.repo.search.impl.lucene.AbstractLuceneQueryLanguage;
|
import org.alfresco.repo.search.impl.lucene.AbstractLuceneQueryLanguage;
|
||||||
|
import org.alfresco.service.cmr.search.ResultSet;
|
||||||
|
import org.alfresco.service.cmr.search.SearchParameters;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Andy
|
* @author Andy
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractSolrQueryLanguage extends AbstractLuceneQueryLanguage
|
public class SolrQueryLanguage extends AbstractLuceneQueryLanguage
|
||||||
{
|
{
|
||||||
private String baseUrl;
|
private SolrQueryHTTPClient solrQueryHTTPClient;
|
||||||
|
|
||||||
public String getBaseUrl()
|
|
||||||
{
|
|
||||||
return baseUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBaseUrl(String baseUrl)
|
|
||||||
|
public void setSolrQueryHTTPClient(SolrQueryHTTPClient solrQueryHTTPClient)
|
||||||
{
|
{
|
||||||
this.baseUrl = baseUrl;
|
this.solrQueryHTTPClient = solrQueryHTTPClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.alfresco.repo.search.impl.lucene.LuceneQueryLanguageSPI#executeQuery(org.alfresco.service.cmr.search.SearchParameters, org.alfresco.repo.search.impl.lucene.ADMLuceneSearcherImpl)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public ResultSet executeQuery(SearchParameters searchParameters, ADMLuceneSearcherImpl admLuceneSearcher)
|
||||||
|
{
|
||||||
|
return solrQueryHTTPClient.executeQuery(searchParameters, getName());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
Reference in New Issue
Block a user