Author: ivol37 at gmail.com
Date: Wed Jan 26 17:02:20 2011
New Revision: 712
Log:
Added:
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/SolrApi.java
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrApiImpl.java
- copied, changed from r711,
/sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrApi.java
Removed:
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrApi.java
Modified:
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/SolrRestService.java
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrDaemonServiceImpl.java
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrRestServiceImpl.java
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrTest.java
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrUtil.java
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/osgi/Activator.java
Added:
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/SolrApi.java
==============================================================================
--- (empty file)
+++
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/SolrApi.java
Wed Jan 26 17:02:20 2011
@@ -0,0 +1,38 @@
+/*
+ Copyright (C) 2010 Amdatu.org
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.amdatu.searchandindex.solr;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
+
+import javax.xml.stream.XMLStreamException;
+
+import org.amdatu.core.tenant.Tenant;
+import org.apache.solr.client.solrj.SolrServerException;
+import org.apache.solr.client.solrj.response.QueryResponse;
+import org.apache.solr.common.SolrInputDocument;
+
+public interface SolrApi {
+ void updateIndex(Tenant tenant, String index, List<SolrInputDocument>
solrDocuments) throws XMLStreamException, SolrServerException, IOException;
+
+ QueryResponse queryIndex(Tenant tenant, String index, String query) throws
SolrServerException;
+
+ Collection<String> getIndices(Tenant tenant) throws SolrServerException;
+
+ String getSchema(Tenant tenant, String index) throws IOException;
+}
Modified:
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/SolrRestService.java
==============================================================================
---
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/SolrRestService.java
(original)
+++
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/SolrRestService.java
Wed Jan 26 17:02:20 2011
@@ -1,3 +1,19 @@
+/*
+ Copyright (C) 2010 Amdatu.org
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
package org.amdatu.searchandindex.solr;
public interface SolrRestService {
Copied:
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrApiImpl.java
(from r711,
/sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrApi.java)
==============================================================================
---
/sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrApi.java
(original)
+++
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrApiImpl.java
Wed Jan 26 17:02:20 2011
@@ -21,15 +21,20 @@
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
+import java.util.Collection;
+import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.stream.XMLStreamException;
import org.amdatu.core.config.templates.ConfigTemplateManager;
import org.amdatu.core.tenant.Tenant;
+import org.amdatu.searchandindex.solr.SolrApi;
+import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
+import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.core.CoreContainer;
import org.apache.solr.core.CoreDescriptor;
@@ -44,10 +49,11 @@
import org.osgi.service.log.LogService;
import org.xml.sax.SAXException;
-public class SolrApi {
+ at SuppressWarnings("restriction")
+public class SolrApiImpl implements SolrApi {
// Statics
- private static final String DEFAULT_SCHEMA = "nutch_schema.xml";
- private static final String DEFAULT_SOLRCONFIG = "nutch_solrconfig.xml";
+ private static final String DEFAULT_SCHEMA = "conf/default_schema.xml";
+ private static final String DEFAULT_SOLRCONFIG =
"conf/default_solrconfig.xml";
// Service dependencies injected by the dependency manager
private volatile LogService m_logService;
@@ -58,7 +64,7 @@
private File m_workDir;
private CoreContainer m_coreContainer;
- public SolrApi(File workDir, CoreContainer coreContainer) {
+ public SolrApiImpl(File workDir, CoreContainer coreContainer) {
m_workDir = workDir;
m_coreContainer = coreContainer;
}
@@ -83,16 +89,47 @@
catch (SAXException e) {
m_logService.log(LogService.LOG_ERROR, "Could not create Solr
core configuration for '" + coreName + "'", e);
}
- } else {
- m_logService.log(LogService.LOG_INFO, "Solr index '" + index + "'
for tenant '" + tenant.getId() + "' not created since it already exists");
}
}
public void updateIndex(Tenant tenant, String index, InputStream is)
throws XMLStreamException, SolrServerException, IOException {
String coreName = tenant.getId() + "_" + index;
+ m_logService.log(LogService.LOG_DEBUG, "Starting update for index '" +
coreName + "'");
SolrServer server = new EmbeddedSolrServer(m_coreContainer, coreName);
- SolrInputDocument solrDocument = SolrUtil.fromXMLStream(is);
- server.add(solrDocument);
+ List<SolrInputDocument> solrDocuments = SolrUtil.fromXMLStream(is);
+ for (SolrInputDocument solrDocument : solrDocuments) {
+ server.add(solrDocument);
+ }
+ server.commit();
+ m_logService.log(LogService.LOG_DEBUG, "Index '" + coreName + "'
updated");
+ }
+
+ public void updateIndex(Tenant tenant, String index,
List<SolrInputDocument> solrDocuments) throws XMLStreamException,
SolrServerException, IOException {
+ String coreName = tenant.getId() + "_" + index;
+ SolrServer server = new EmbeddedSolrServer(m_coreContainer, coreName);
+ for (SolrInputDocument solrDocument : solrDocuments) {
+ server.add(solrDocument);
+ }
+ server.commit();
+ m_logService.log(LogService.LOG_DEBUG, "Index '" + coreName + "'
updated");
+ }
+
+ public Collection<String> getIndices(Tenant tenant) throws
SolrServerException {
+ return m_coreContainer.getCoreNames();
+ }
+
+ public QueryResponse queryIndex(Tenant tenant, String index, String query)
throws SolrServerException {
+ String coreName = tenant.getId() + "_" + index;
+ SolrServer server = new EmbeddedSolrServer(m_coreContainer, coreName);
+ SolrQuery solrQuery = new SolrQuery();
+ solrQuery.setQuery(query);
+ return server.query(solrQuery);
+ }
+
+ public String getSchema(Tenant tenant, String index) throws IOException {
+ File schema = new File(m_workDir, tenant.getId() + "/" + index +
"/conf/schema.xml");
+ String contents = SolrUtil.loadFromFile(schema);
+ return contents;
}
private void createCore(String coreName, String coreDirName) throws
IOException, ParserConfigurationException, SAXException {
@@ -110,7 +147,7 @@
coreConfDir.delete();
}
coreConfDir.mkdirs();
- File coresConfigFile = new File(m_workDir,
SolrDaemonServiceImpl.SOLR_CONFIG_XML);
+ File coresConfigFile = new File(m_workDir,
SolrDaemonServiceImpl.SOLR);
Bundle bundle = m_bundleContext.getBundle();
Modified:
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrDaemonServiceImpl.java
==============================================================================
---
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrDaemonServiceImpl.java
(original)
+++
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrDaemonServiceImpl.java
Wed Jan 26 17:02:20 2011
@@ -23,6 +23,7 @@
import org.amdatu.core.config.templates.ConfigTemplateManager;
import org.amdatu.core.tenant.TenantManagementService;
+import org.amdatu.searchandindex.solr.SolrApi;
import org.amdatu.searchandindex.solr.SolrRestService;
import org.amdatu.searchandindex.solr.SolrService;
import org.amdatu.web.httpcontext.HttpContextServiceFactory;
@@ -44,7 +45,7 @@
// Statics
private static final String DEFAULT_SOLAR_CONFIG =
"default_solrconfig.xml";
private static final String DEFAULT_SCHEMA = "default_schema.xml";
- private static final String SOLR = "solr.xml";
+ static final String SOLR = "solr.xml";
private static final String CONFIG_DIR = "conf";
// Services injected by the Felix dependency manager
@@ -69,7 +70,7 @@
m_workDir.mkdirs();
try {
// Write the solr.xml file to the solr root directory
- copyConfig("conf/" + SOLR, solrFile);
+ copyConfig(SOLR, solrFile);
// Solr uses this system property to find its storage
location.
System.setProperty("solr.solr.home",
solrFile.getParentFile().getAbsolutePath());
@@ -79,11 +80,14 @@
mainConfigDir.mkdirs();
// Write default schema and solr config to /conf
- copyConfig("conf/" + DEFAULT_SOLAR_CONFIG, new
File(mainConfigDir, "solrconfig.xml"));
- copyConfig("conf/" + DEFAULT_SCHEMA, new
File(mainConfigDir, "schema.xml"));
+ copyConfig(DEFAULT_SOLAR_CONFIG, new File(mainConfigDir,
"solrconfig.xml"));
+ copyConfig(DEFAULT_SCHEMA, new File(mainConfigDir,
"schema.xml"));
} catch (IOException e) {
m_logService.log(LogService.LOG_ERROR, "Could not replace
configuration entries in storage-conf.xml", e);
}
+ } else {
+ // Solr uses this system property to find its storage location.
+ System.setProperty("solr.solr.home",
solrFile.getParentFile().getAbsolutePath());
}
} catch (Exception e) {
m_logService.log(LogService.LOG_ERROR, "Could not create context
component", e);
@@ -96,7 +100,7 @@
startSolrDaemon();
// Register the Solr API service
- SolrApi solrApi = registerSolrApi();
+ SolrApiImpl solrApi = registerSolrApi();
// Register the Solr dispatch filter
registerRestAPI(solrApi);
@@ -157,17 +161,18 @@
}
// Register the Solr API
- private SolrApi registerSolrApi() {
- SolrApi solrApiService = new SolrApi(m_workDir, m_coreContainer);
+ private SolrApiImpl registerSolrApi() {
+ SolrApiImpl solrApiService = new SolrApiImpl(m_workDir,
m_coreContainer);
m_dependencyManager.add(m_dependencyManager.createComponent()
.setImplementation(solrApiService)
+ .setInterface(SolrApi.class.getName(), null)
.add(createServiceDependency(ConfigTemplateManager.class))
.add(createServiceDependency(LogService.class)));
return solrApiService;
}
// Register the REST service
- private void registerRestAPI(SolrApi solrApi) {
+ private void registerRestAPI(SolrApiImpl solrApi) {
SolrRestServiceImpl restService = new SolrRestServiceImpl(m_workDir,
solrApi);
m_dependencyManager.add(m_dependencyManager.createComponent()
.setImplementation(restService)
Modified:
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrRestServiceImpl.java
==============================================================================
---
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrRestServiceImpl.java
(original)
+++
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrRestServiceImpl.java
Wed Jan 26 17:02:20 2011
@@ -16,15 +16,10 @@
*/
package org.amdatu.searchandindex.solr.impl;
-import java.io.BufferedReader;
import java.io.File;
-import java.io.IOException;
import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.io.StringWriter;
-import java.io.Writer;
import java.net.URL;
+import java.util.Collection;
import java.util.Dictionary;
import java.util.Hashtable;
@@ -35,10 +30,10 @@
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-import javax.xml.stream.XMLStreamException;
import org.amdatu.core.tenant.Tenant;
import org.amdatu.core.tenant.TenantException;
@@ -49,7 +44,8 @@
import org.amdatu.web.httpcontext.ResourceProvider;
import org.apache.felix.dm.Component;
import org.apache.felix.dm.DependencyManager;
-import org.apache.solr.client.solrj.SolrServerException;
+import org.apache.solr.client.solrj.response.QueryResponse;
+import org.apache.solr.common.SolrDocumentList;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.service.log.LogService;
@@ -68,12 +64,12 @@
private volatile BundleContext m_bundleContext;
private volatile DependencyManager m_dependencyManager;
private volatile TenantManagementService m_tenantService;
- private volatile SolrApi m_solrApi;
+ private volatile SolrApiImpl m_solrApi;
// Private members
private File m_workDir;
- public SolrRestServiceImpl(File workDir, SolrApi solrApi) {
+ public SolrRestServiceImpl(File workDir, SolrApiImpl solrApi) {
m_workDir = workDir;
m_solrApi = solrApi;
}
@@ -115,73 +111,107 @@
/**
* This method can be used to check the availability of the Index Service.
- * GET /rest/index
+ * GET /rest/index/status
* @return The text "Index service online"
*/
@GET
+ @Path("{status}")
@Produces( { MediaType.TEXT_PLAIN })
public String status() {
return "Index service online";
}
+ /**
+ * This method can be used to add a new index or update it.
+ * PUT /rest/index/[indexname]
+ * @return The text "Index service online"
+ */
@PUT
@Path("{index}")
@Produces({MediaType.APPLICATION_XML})
public Response createIndex(@PathParam("index") final String index,
@Context final HttpServletRequest request, InputStream is) {
- // Resolve tenant from hostname
- String serverName = request.getServerName();
try {
- for (Tenant tenant : m_tenantService.getTenants()) {
- if (serverName.equals(tenant.getProperties().get("hostname")))
{
- // This is the tenant for which the index should be created
- m_solrApi.createIndex(tenant, index);
- if (is.available() > 0) {
- // When more then 0 bytes are available, a document is
send along with the PUT request
- // that should be added to this index
- m_solrApi.updateIndex(tenant, index, is);
- }
- }
+ // Resolve tenant from hostname
+ Tenant tenant = resolveTenant(request);
+ // This is the tenant for which the index should be created
+ m_solrApi.createIndex(tenant, index);
+ if (is.available() > 0) {
+ // When more then 0 bytes are available, a document is send
along with the PUT request
+ // that should be added to this index
+ m_solrApi.updateIndex(tenant, index, is);
}
- }
- catch (TenantException e) {
- // TODO Auto-generated catch block
+ } catch (Exception e) {
e.printStackTrace();
}
- catch (IOException e) {
- // TODO Auto-generated catch block
+ return Response.status(Response.Status.OK).build();
+ }
+
+ /**
+ * Perform Solr query on the specified index.
+ * GET /rest/index/[indexname]/?q=[Solr query]
+ */
+ @GET
+ @Path("{index}")
+ @Produces( { MediaType.TEXT_PLAIN })
+ public String queryIndex(@PathParam("index") final String index,
@QueryParam("q") final String q,
+ @Context final HttpServletRequest request) {
+ try {
+ Tenant tenant = resolveTenant(request);
+ QueryResponse response = m_solrApi.queryIndex(tenant, index, q);
+ SolrDocumentList solrDocuments = response.getResults();
+ return "<found>"+solrDocuments.getNumFound()+"</found>";
+ } catch (Exception e) {
e.printStackTrace();
}
- catch (XMLStreamException e) {
- // TODO Auto-generated catch block
+ return "NOPE";
+
+ }
+
+ /**
+ * Returns a list of all available incdices for this tenant.
+ * GET /rest/index
+ */
+ @GET
+ @Produces( { MediaType.TEXT_PLAIN })
+ public String getIndices(@PathParam("index") final String index, @Context
final HttpServletRequest request) {
+ try {
+ Tenant tenant = resolveTenant(request);
+ Collection<String> indices = m_solrApi.getIndices(tenant);
+ return "<found>" + indices + "</found>";
+ } catch (Exception e) {
e.printStackTrace();
}
- catch (SolrServerException e) {
- // TODO Auto-generated catch block
+ return "NOPE";
+ }
+
+ /**
+ * Returns a list of all available incdices for this tenant.
+ * GET /rest/index/[indexname]/schema
+ */
+ @GET
+ @Path("{index}/schema")
+ @Produces( { MediaType.TEXT_PLAIN })
+ public String getSchema(@PathParam("index") final String index, @Context
final HttpServletRequest request) {
+ try {
+ Tenant tenant = resolveTenant(request);
+ String schema = m_solrApi.getSchema(tenant, index);
+ return schema;
+ } catch (Exception e) {
e.printStackTrace();
}
- return Response.status(Response.Status.OK).build();
+ return "NOPE";
}
-
- public String convertStreamToString(InputStream is)
- throws IOException {
- if (is != null) {
- Writer writer = new StringWriter();
- char[] buffer = new char[1024];
- try {
- Reader reader = new BufferedReader(
- new InputStreamReader(is, "UTF-8"));
- int n;
- while ((n = reader.read(buffer)) != -1) {
- writer.write(buffer, 0, n);
- }
- } finally {
- is.close();
+ private Tenant resolveTenant(HttpServletRequest request) throws
TenantException {
+ // Resolve tenant from hostname
+ String serverName = request.getServerName();
+ for (Tenant tenant : m_tenantService.getTenants()) {
+ if (serverName.equals(tenant.getProperties().get("hostname"))) {
+ // This is the tenant for which the index should be created
+ return tenant;
}
- return writer.toString();
- } else {
- return "";
}
- }
+ return null;
+ }
}
Modified:
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrTest.java
==============================================================================
---
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrTest.java
(original)
+++
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrTest.java
Wed Jan 26 17:02:20 2011
@@ -2,10 +2,15 @@
import java.io.IOException;
import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.stream.XMLStreamException;
import org.amdatu.core.tenant.TenantEntity;
import org.amdatu.core.tenant.TenantException;
import org.amdatu.core.tenant.TenantManagementService;
+import org.amdatu.searchandindex.solr.SolrApi;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpMethod;
@@ -16,6 +21,7 @@
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.PutMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
+import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.common.SolrInputDocument;
/**
@@ -31,7 +37,10 @@
*/
public class SolrTest {
private volatile TenantManagementService m_tenantService;
+ private volatile SolrApi m_solrApi;
+
private static int ID = 0;
+ private static int SIZE = 1;
public void start() {
try {
@@ -62,6 +71,7 @@
}
class TestThread extends Thread {
+
public void run() {
try {
String baseUrl1 = "http://localhost:2237/rest/index";
@@ -77,17 +87,31 @@
invokePUT(baseUrl1 + "/course");
invokePUT(baseUrl2 + "/course");
- // Index a document
- SolrInputDocument document = new SolrInputDocument();
- document.addField( "id", "id1", 1.0f );
- document.addField( "name", "doc1", 1.0f );
- document.addField( "price", 10 );
+ // Now do the same but without REST
+ TenantEntity tenant1 =
m_tenantService.getTenantById("school_1");
+ TenantEntity tenant2 =
m_tenantService.getTenantById("school_1");
+ List<SolrInputDocument> docs1 = new
ArrayList<SolrInputDocument>();
+ List<SolrInputDocument> docs2 = new
ArrayList<SolrInputDocument>();
+ for (int i=0; i<SIZE; i++) {
+ docs1.add(generateSolrDocument());
+ docs2.add(generateSolrDocument());
+ }
+ long before = System.currentTimeMillis();
+ m_solrApi.updateIndex(tenant1, "course", docs1);
+ m_solrApi.updateIndex(tenant2, "course", docs2);
+ long diff = System.currentTimeMillis() - before;
+ System.out.println("Added " + 2*SIZE + " documents to Solr
index using SPI in " + diff + " ms");
// Add 10.000 Solr documents to the indices
- for (int i=0; i<10000; i++) {
- streamPUT(baseUrl1 + "/course",
SolrUtil.toXMLStream(generateSolrDocument()));
- streamPUT(baseUrl2 + "/course",
SolrUtil.toXMLStream(generateSolrDocument()));
- }
+ before = System.currentTimeMillis();
+ InputStream xml1 = SolrUtil.toXMLStream(docs1);
+ InputStream xml2 = SolrUtil.toXMLStream(docs2);
+ long beforerest = System.currentTimeMillis();
+ streamPUT(baseUrl1 + "/course", xml1);
+ streamPUT(baseUrl2 + "/course", xml2);
+ diff = System.currentTimeMillis() - before;
+ long diff2 = System.currentTimeMillis() - beforerest;
+ System.out.println("Added " + 2*SIZE + " documents to Solr
index using REST in " + diff + " ms / " + diff2 + " ms");
}
catch (InterruptedException e) {
// TODO Auto-generated catch block
@@ -97,14 +121,26 @@
// TODO Auto-generated catch block
e.printStackTrace();
}
+ catch (TenantException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ catch (XMLStreamException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ catch (SolrServerException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
}
}
private SolrInputDocument generateSolrDocument() {
SolrInputDocument document = new SolrInputDocument();
- document.addField( "id", ID++, 0.5f);
- document.addField( "name", "Solr document " + ID, 1.0f );
- document.addField( "price", 100*Math.random(), 0.5f);
+ document.addField("id", ID++, 0.5f);
+ document.addField("name_s", "Solr document " + ID, 1.0f );
+ document.addField("price_d", 100*Math.random(), 0.5f);
return document;
}
Modified:
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrUtil.java
==============================================================================
---
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrUtil.java
(original)
+++
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrUtil.java
Wed Jan 26 17:02:20 2011
@@ -1,8 +1,18 @@
package org.amdatu.searchandindex.solr.impl;
+import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.List;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
@@ -15,6 +25,16 @@
import org.apache.solr.common.util.StrUtils;
public class SolrUtil {
+ public static InputStream toXMLStream(List<SolrInputDocument> documents)
throws UnsupportedEncodingException {
+ StringBuffer xml = new StringBuffer("<docs>");
+ for (SolrInputDocument doc : documents) {
+ xml.append(ClientUtils.toXML(doc));
+ }
+ xml.append("</docs>");
+ InputStream is = new
ByteArrayInputStream(xml.toString().getBytes("UTF-8"));
+ return is;
+ }
+
public static InputStream toXMLStream(SolrInputDocument document) throws
UnsupportedEncodingException {
String xml = ClientUtils.toXML(document);
InputStream is = new ByteArrayInputStream(xml.getBytes("UTF-8"));
@@ -22,7 +42,7 @@
}
@SuppressWarnings("restriction")
- public static SolrInputDocument fromXMLStream(InputStream is) throws
UnsupportedEncodingException, XMLStreamException {
+ public static List<SolrInputDocument> fromXMLStream(InputStream is) throws
UnsupportedEncodingException, XMLStreamException {
// Save the current context classloader first
final ClassLoader contextClassLoader =
Thread.currentThread().getContextClassLoader();
try {
@@ -32,18 +52,18 @@
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader parser = factory.createXMLStreamReader(is);
- SolrInputDocument doc = null;
+ List<SolrInputDocument> documents = new
ArrayList<SolrInputDocument>();
while (true) {
int event = parser.next();
switch (event) {
case XMLStreamConstants.END_DOCUMENT:
parser.close();
- return doc;
+ return documents;
case XMLStreamConstants.START_ELEMENT:
String currTag = parser.getLocalName();
if ("doc".equals(currTag)) {
- doc = readDoc(parser);
+ documents.add(readDoc(parser));
}
break;
}
@@ -124,6 +144,32 @@
}
}
+ public static String loadFromFile(File file) throws IOException {
+ FileInputStream fis = new FileInputStream(file);
+ String contents = convertStreamToString(fis);
+ return contents;
+ }
+
+ public static String convertStreamToString(InputStream is) throws
IOException {
+ if (is != null) {
+ Writer writer = new StringWriter();
+ char[] buffer = new char[1024];
+ try {
+ Reader reader = new BufferedReader(
+ new InputStreamReader(is, "UTF-8"));
+ int n;
+ while ((n = reader.read(buffer)) != -1) {
+ writer.write(buffer, 0, n);
+ }
+ } finally {
+ is.close();
+ }
+ return writer.toString();
+ } else {
+ return "";
+ }
+ }
+
public static void executeInContextClassLoader(ContextExecutor executor) {
// Save the current context classloader first
final ClassLoader contextClassLoader =
Thread.currentThread().getContextClassLoader();
Modified:
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/osgi/Activator.java
==============================================================================
---
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/osgi/Activator.java
(original)
+++
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/osgi/Activator.java
Wed Jan 26 17:02:20 2011
@@ -18,6 +18,7 @@
import org.amdatu.core.config.templates.ConfigTemplateManager;
import org.amdatu.core.tenant.TenantManagementService;
+import org.amdatu.searchandindex.solr.SolrApi;
import org.amdatu.searchandindex.solr.SolrRestService;
import org.amdatu.searchandindex.solr.SolrService;
import org.amdatu.searchandindex.solr.impl.SolrDaemonServiceImpl;
@@ -44,6 +45,7 @@
manager.add(createComponent()
.setImplementation(SolrTest.class)
.add(createServiceDependency().setService(SolrRestService.class).setRequired(true))
+
.add(createServiceDependency().setService(SolrApi.class).setRequired(true))
.add(createServiceDependency().setService(TenantManagementService.class).setRequired(true)));
// Create and register the Solr service.