From c886a13bda95c3cc074c361d2bcdaa85fd635be4 Mon Sep 17 00:00:00 2001 From: tgrall Date: Tue, 12 Feb 2013 11:04:42 +0100 Subject: [PATCH 1/5] JCBC-244 - gitignore & fix welcome file that is not working in Jetty --- .gitignore | 27 ++++++++++++++++++++++++++- src/main/webapp/welcome | 4 ++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 src/main/webapp/welcome diff --git a/.gitignore b/.gitignore index 84eb4f2..f0d1b61 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,28 @@ -target/ +# General Ignores +*~ +.classpath .DS_Store +.project +build/ +lib/ivy-2.2.0.jar +bin/ +target/ +log/ + +# IDE Support +# IntelliJ specific files/directories +.idea/ +*.ipr +*.iws +*.iml +atlassian-ide-plugin.xml + +# Eclipse +.factorypath +.settings/ +.externalToolBuilders + +# NetBeans +.nbattrs nb-configuration.xml + diff --git a/src/main/webapp/welcome b/src/main/webapp/welcome new file mode 100644 index 0000000..6069703 --- /dev/null +++ b/src/main/webapp/welcome @@ -0,0 +1,4 @@ +Dummy file to let Jetty use the welcome servlet in the welcome-list +http://docs.codehaus.org/display/JETTY/Welcome+files+not+working +using a dummy file is a simpler workaround + From 291f1cf4e576c87c53aec7f03c0d618434530195 Mon Sep 17 00:00:00 2001 From: tgrall Date: Wed, 13 Feb 2013 12:23:26 +0100 Subject: [PATCH 2/5] JCBC-244 - gitignore & fix welcome file that is not working in Jetty --- .../beersample/BreweryAndBeerServlet.java | 85 +++++++++++++++++++ src/main/webapp/WEB-INF/breweries/all.jsp | 40 +++++++++ src/main/webapp/WEB-INF/breweries/index.jsp | 6 +- src/main/webapp/WEB-INF/tags/layout.tag | 3 +- src/main/webapp/WEB-INF/web.xml | 18 +++- src/main/webapp/WEB-INF/welcome/index.jsp | 47 +++++----- 6 files changed, 172 insertions(+), 27 deletions(-) create mode 100644 src/main/java/com/couchbase/beersample/BreweryAndBeerServlet.java create mode 100644 src/main/webapp/WEB-INF/breweries/all.jsp diff --git a/src/main/java/com/couchbase/beersample/BreweryAndBeerServlet.java b/src/main/java/com/couchbase/beersample/BreweryAndBeerServlet.java new file mode 100644 index 0000000..e20248c --- /dev/null +++ b/src/main/java/com/couchbase/beersample/BreweryAndBeerServlet.java @@ -0,0 +1,85 @@ +package com.couchbase.beersample; + + +import com.couchbase.client.CouchbaseClient; +import com.couchbase.client.protocol.views.Query; +import com.couchbase.client.protocol.views.View; +import com.couchbase.client.protocol.views.ViewResponse; +import com.couchbase.client.protocol.views.ViewRow; +import com.google.gson.Gson; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.concurrent.ExecutionException; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * The BreweryServlet handles all Brewery-related HTTP Queries. + * + * The BreweryServlet is used to handle all HTTP queries under the /breweries + * namespace. The "web.xml" defines a wildcard route for every /breweries/* + * route, so the doGet() method needs to determine what should be dispatched. + */ +public class BreweryAndBeerServlet extends HttpServlet { + + /** + * Obtains the current CouchbaseClient connection. + */ + final CouchbaseClient client = ConnectionManager.getInstance(); + + /** + * Google GSON is used for JSON encoding/decoding. + */ + final Gson gson = new Gson(); + + /** + * Dispatch all incoming GET HTTP requests. + * + * @param request the HTTP request object. + * @param response the HTTP response object. + * @throws javax.servlet.ServletException + * @throws java.io.IOException + */ + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + if(request.getPathInfo() == null) { + handleIndex(request, response); + } + } + + private void handleIndex(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + View view = client.getView("brewery", "all_with_beers"); + Query query = new Query(); + query.setIncludeDocs(true).setLimit(100); + ViewResponse result = client.query(view, query); + + ArrayList> items = + new ArrayList>(); + for(ViewRow row : result) { + HashMap parsedDoc = gson.fromJson( + (String)row.getDocument(), HashMap.class); + + HashMap item = new HashMap(); + item.put("id", row.getId()); + item.put("name", parsedDoc.get("name")); + item.put("type", parsedDoc.get("type")); + + + items.add(item); + } + request.setAttribute("items", items); + + request.getRequestDispatcher("/WEB-INF/breweries/all.jsp") + .forward(request, response); + } + + +} diff --git a/src/main/webapp/WEB-INF/breweries/all.jsp b/src/main/webapp/WEB-INF/breweries/all.jsp new file mode 100644 index 0000000..033f22c --- /dev/null +++ b/src/main/webapp/WEB-INF/breweries/all.jsp @@ -0,0 +1,40 @@ +<%@taglib prefix="t" tagdir="/WEB-INF/tags" %> +<%@page contentType="text/html" pageEncoding="UTF-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + +

Browse Breweries and Beers

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
${item.name}Delete +
${item.name} + Delete + Edit +
+
+
\ No newline at end of file diff --git a/src/main/webapp/WEB-INF/breweries/index.jsp b/src/main/webapp/WEB-INF/breweries/index.jsp index fde4fcd..f51a219 100644 --- a/src/main/webapp/WEB-INF/breweries/index.jsp +++ b/src/main/webapp/WEB-INF/breweries/index.jsp @@ -18,11 +18,11 @@ - + - ${brewery.name} + ${items.name} Delete + href="/breweries/delete/${items.id}">Delete diff --git a/src/main/webapp/WEB-INF/tags/layout.tag b/src/main/webapp/WEB-INF/tags/layout.tag index ebabffe..c1b6a59 100644 --- a/src/main/webapp/WEB-INF/tags/layout.tag +++ b/src/main/webapp/WEB-INF/tags/layout.tag @@ -25,7 +25,8 @@

Couchbase Beer-Sample

diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 51472a1..c6669b4 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -1,5 +1,6 @@ - + com.couchbase.beersample.ConnectionManager @@ -15,6 +16,10 @@ BeerServlet com.couchbase.beersample.BeerServlet + + BreweryBeerServlet + com.couchbase.beersample.BreweryAndBeerServlet + WelcomeServlet /welcome @@ -29,7 +34,12 @@ /beers/* /beers - - welcome - + + BreweryBeerServlet + /all/* + /all + + + welcome + diff --git a/src/main/webapp/WEB-INF/welcome/index.jsp b/src/main/webapp/WEB-INF/welcome/index.jsp index c813bb8..c5dc571 100644 --- a/src/main/webapp/WEB-INF/welcome/index.jsp +++ b/src/main/webapp/WEB-INF/welcome/index.jsp @@ -1,29 +1,38 @@ <%@taglib prefix="t" tagdir="/WEB-INF/tags" %> -<%@page contentType="text/html" pageEncoding="UTF-8"%> +<%@page contentType="text/html" pageEncoding="UTF-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-
-

Browse all Beers

- Show me all beers -
-
-
-

Browse all Breweries

- Take me to the breweries -
+
+

Browse all Beers

+ Show me all beers +
+
+
+

Browse all Breweries

+ Take me to the breweries +
+
+
+

Browse all Breweries and Beers

+ Take me to the all records +
+
-
-

About this App

-

Welcome to Couchbase!

-

This application helps you to get started on application - development with Couchbase. It shows how to create, update and - delete documents and how to work with JSON documents.

-

The official tutorial can be found - here!

-
+
+

About this App

+ +

Welcome to Couchbase!

+ +

This application helps you to get started on application + development with Couchbase. It shows how to create, update and + delete documents and how to work with JSON documents.

+ +

The official tutorial can be found + here!

+
\ No newline at end of file From 99e7a1240d1404e15c55a45df79f7b259ad65f49 Mon Sep 17 00:00:00 2001 From: tgrall Date: Thu, 4 Apr 2013 21:04:37 +0200 Subject: [PATCH 3/5] Views are created by the application when needed --- .../com/couchbase/beersample/BeerServlet.java | 54 +++--- .../beersample/BreweryAndBeerServlet.java | 45 ++--- .../couchbase/beersample/BreweryServlet.java | 53 +++--- .../beersample/InstallViewServlet.java | 154 ++++++++++++++++++ src/main/webapp/WEB-INF/web.xml | 8 + 5 files changed, 237 insertions(+), 77 deletions(-) create mode 100644 src/main/java/com/couchbase/beersample/InstallViewServlet.java diff --git a/src/main/java/com/couchbase/beersample/BeerServlet.java b/src/main/java/com/couchbase/beersample/BeerServlet.java index 10735cf..79f4e6b 100644 --- a/src/main/java/com/couchbase/beersample/BeerServlet.java +++ b/src/main/java/com/couchbase/beersample/BeerServlet.java @@ -23,12 +23,7 @@ package com.couchbase.beersample; import com.couchbase.client.CouchbaseClient; -import com.couchbase.client.protocol.views.ComplexKey; -import com.couchbase.client.protocol.views.Query; -import com.couchbase.client.protocol.views.Stale; -import com.couchbase.client.protocol.views.View; -import com.couchbase.client.protocol.views.ViewResponse; -import com.couchbase.client.protocol.views.ViewRow; +import com.couchbase.client.protocol.views.*; import com.google.gson.Gson; import java.io.IOException; import java.io.PrintWriter; @@ -147,28 +142,31 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) */ private void handleIndex(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - - View view = client.getView("beer", "by_name"); - Query query = new Query(); - query.setIncludeDocs(true).setLimit(20); - ViewResponse result = client.query(view, query); - - ArrayList> beers = - new ArrayList>(); - for(ViewRow row : result) { - HashMap parsedDoc = gson.fromJson( - (String)row.getDocument(), HashMap.class); - - HashMap beer = new HashMap(); - beer.put("id", row.getId()); - beer.put("name", parsedDoc.get("name")); - beer.put("brewery", parsedDoc.get("brewery_id")); - beers.add(beer); - } - request.setAttribute("beers", beers); - - request.getRequestDispatcher("/WEB-INF/beers/index.jsp") - .forward(request, response); + try { + View view = client.getView("beer", "by_name"); + Query query = new Query(); + query.setIncludeDocs(true).setLimit(20); + ViewResponse result = client.query(view, query); + + ArrayList> beers = + new ArrayList>(); + for (ViewRow row : result) { + HashMap parsedDoc = gson.fromJson( + (String) row.getDocument(), HashMap.class); + + HashMap beer = new HashMap(); + beer.put("id", row.getId()); + beer.put("name", parsedDoc.get("name")); + beer.put("brewery", parsedDoc.get("brewery_id")); + beers.add(beer); + } + request.setAttribute("beers", beers); + + request.getRequestDispatcher("/WEB-INF/beers/index.jsp") + .forward(request, response); + } catch (InvalidViewException e) { + response.getWriter().print( InstallViewServlet.printNoViewMessage() ); + } } /** diff --git a/src/main/java/com/couchbase/beersample/BreweryAndBeerServlet.java b/src/main/java/com/couchbase/beersample/BreweryAndBeerServlet.java index e20248c..4c5ca99 100644 --- a/src/main/java/com/couchbase/beersample/BreweryAndBeerServlet.java +++ b/src/main/java/com/couchbase/beersample/BreweryAndBeerServlet.java @@ -2,10 +2,7 @@ import com.couchbase.client.CouchbaseClient; -import com.couchbase.client.protocol.views.Query; -import com.couchbase.client.protocol.views.View; -import com.couchbase.client.protocol.views.ViewResponse; -import com.couchbase.client.protocol.views.ViewRow; +import com.couchbase.client.protocol.views.*; import com.google.gson.Gson; import javax.servlet.ServletException; @@ -56,29 +53,33 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) } private void handleIndex(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - View view = client.getView("brewery", "all_with_beers"); - Query query = new Query(); - query.setIncludeDocs(true).setLimit(100); - ViewResponse result = client.query(view, query); + try { + View view = client.getView("brewery", "all_with_beers"); + Query query = new Query(); + query.setIncludeDocs(true).setLimit(100); + ViewResponse result = client.query(view, query); - ArrayList> items = - new ArrayList>(); - for(ViewRow row : result) { - HashMap parsedDoc = gson.fromJson( - (String)row.getDocument(), HashMap.class); + ArrayList> items = + new ArrayList>(); + for (ViewRow row : result) { + HashMap parsedDoc = gson.fromJson( + (String) row.getDocument(), HashMap.class); - HashMap item = new HashMap(); - item.put("id", row.getId()); - item.put("name", parsedDoc.get("name")); - item.put("type", parsedDoc.get("type")); + HashMap item = new HashMap(); + item.put("id", row.getId()); + item.put("name", parsedDoc.get("name")); + item.put("type", parsedDoc.get("type")); - items.add(item); - } - request.setAttribute("items", items); + items.add(item); + } + request.setAttribute("items", items); - request.getRequestDispatcher("/WEB-INF/breweries/all.jsp") - .forward(request, response); + request.getRequestDispatcher("/WEB-INF/breweries/all.jsp") + .forward(request, response); + } catch (InvalidViewException e) { + response.getWriter().print( InstallViewServlet.printNoViewMessage() ); + } } diff --git a/src/main/java/com/couchbase/beersample/BreweryServlet.java b/src/main/java/com/couchbase/beersample/BreweryServlet.java index fd18c80..d040aea 100644 --- a/src/main/java/com/couchbase/beersample/BreweryServlet.java +++ b/src/main/java/com/couchbase/beersample/BreweryServlet.java @@ -23,12 +23,7 @@ package com.couchbase.beersample; import com.couchbase.client.CouchbaseClient; -import com.couchbase.client.protocol.views.ComplexKey; -import com.couchbase.client.protocol.views.Query; -import com.couchbase.client.protocol.views.Stale; -import com.couchbase.client.protocol.views.View; -import com.couchbase.client.protocol.views.ViewResponse; -import com.couchbase.client.protocol.views.ViewRow; +import com.couchbase.client.protocol.views.*; import com.google.gson.Gson; import java.io.IOException; import java.io.PrintWriter; @@ -111,27 +106,31 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) */ private void handleIndex(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - - View view = client.getView("brewery", "by_name"); - Query query = new Query(); - query.setIncludeDocs(true).setLimit(20); - ViewResponse result = client.query(view, query); - - ArrayList> breweries = - new ArrayList>(); - for(ViewRow row : result) { - HashMap parsedDoc = gson.fromJson( - (String)row.getDocument(), HashMap.class); - - HashMap brewery = new HashMap(); - brewery.put("id", row.getId()); - brewery.put("name", parsedDoc.get("name")); - breweries.add(brewery); - } - request.setAttribute("breweries", breweries); - - request.getRequestDispatcher("/WEB-INF/breweries/index.jsp") - .forward(request, response); + try { + View view = client.getView("brewery", "by_name"); + Query query = new Query(); + query.setIncludeDocs(true).setLimit(20); + ViewResponse result = client.query(view, query); + + ArrayList> breweries = + new ArrayList>(); + for (ViewRow row : result) { + HashMap parsedDoc = gson.fromJson( + (String) row.getDocument(), HashMap.class); + + HashMap brewery = new HashMap(); + brewery.put("id", row.getId()); + brewery.put("name", parsedDoc.get("name")); + breweries.add(brewery); + } + request.setAttribute("breweries", breweries); + + request.getRequestDispatcher("/WEB-INF/breweries/index.jsp") + .forward(request, response); + + } catch (InvalidViewException e) { + response.getWriter().print(InstallViewServlet.printNoViewMessage()); + } } /** diff --git a/src/main/java/com/couchbase/beersample/InstallViewServlet.java b/src/main/java/com/couchbase/beersample/InstallViewServlet.java new file mode 100644 index 0000000..b79bc88 --- /dev/null +++ b/src/main/java/com/couchbase/beersample/InstallViewServlet.java @@ -0,0 +1,154 @@ +/** + * Copyright (C) 2009-2012 Couchbase, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALING + * IN THE SOFTWARE. + */ + +package com.couchbase.beersample; + + +import com.couchbase.client.CouchbaseClient; +import com.couchbase.client.protocol.views.DesignDocument; +import com.couchbase.client.protocol.views.InvalidViewException; +import com.couchbase.client.protocol.views.View; +import com.couchbase.client.protocol.views.ViewDesign; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * This servlet is just a servet that is used to install the view + */ +public class InstallViewServlet extends HttpServlet{ + + public final static String BEER_DESIGN_DOC_NAME = "beer"; + public final static String BREWERY_DESIGN_DOC_NAME = "brewery"; + public final static String BY_NAME_VIEW_NAME = "by_name"; + public final static String ALL_WITH_BEERS_VIEW_NAME = "all_with_beers"; + + + + /** + * Obtains the current CouchbaseClient connection. + */ + final CouchbaseClient client = ConnectionManager.getInstance(); + + + /** + * Install views if they are not present + * + * @param request the servlet request instance. + * @param response the servlet response instance. + * @throws javax.servlet.ServletException + * @throws java.io.IOException + */ + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + installBeerViews(); + installBreweryViews(); + + response.sendRedirect("/"); + } + + + private void installBeerViews() { + + boolean installView = false; + try { + View view = client.getView(BEER_DESIGN_DOC_NAME, BY_NAME_VIEW_NAME); + } catch (InvalidViewException e) { + installView = true; + } + + if (installView) { + Logger.getLogger(this.getClass().getName()).log(Level.INFO, "Installing Beer views...."); + DesignDocument designDoc = new DesignDocument(BEER_DESIGN_DOC_NAME); + String viewName = BY_NAME_VIEW_NAME; + String mapFunction = + "function (doc, meta) {\n" + + " if(doc.type && doc.type == \"beer\") {\n" + + " emit(doc.name);\n" + + " }\n" + + "}"; + ViewDesign viewDesign = new ViewDesign(viewName, mapFunction); + designDoc.getViews().add(viewDesign); + client.createDesignDoc(designDoc); + } + } + + private void installBreweryViews() { + + boolean installView = false; + try { + View view = client.getView(BREWERY_DESIGN_DOC_NAME, BY_NAME_VIEW_NAME); + view = client.getView(BREWERY_DESIGN_DOC_NAME, ALL_WITH_BEERS_VIEW_NAME); + } catch (InvalidViewException e) { + installView = true; + } + + if (installView) { + Logger.getLogger(this.getClass().getName()).log(Level.INFO, "Installing Brewery views...."); + DesignDocument designDoc = new DesignDocument(BREWERY_DESIGN_DOC_NAME); + + // add brewery by name + String viewName = BY_NAME_VIEW_NAME; + String mapFunctionName = + "function (doc, meta) {\n" + + " if(doc.type && doc.type == \"brewery\") {\n" + + " emit(doc.name);\n" + + " }\n" + + "}"; + ViewDesign viewNameDesign = new ViewDesign(viewName, mapFunctionName); + designDoc.getViews().add(viewNameDesign); + + // add brewery and beer (collated views) + String viewBreweryAndBeer = "all_with_beers"; + String mapFunctionBreweryAndBeer = + "function(doc, meta) {\n" + + " switch(doc.type) {\n" + + " case \"brewery\":\n" + + " emit([meta.id, 0, doc.name]);\n" + + " break;\n" + + " case \"beer\":\n" + + " if (doc.name && doc.brewery_id) {\n" + + " emit([doc.brewery_id, 1, doc.name], null);\n" + + " }\n" + + " }\n" + + "}"; + ViewDesign viewCollatedDesign = new ViewDesign(viewBreweryAndBeer, mapFunctionBreweryAndBeer); + designDoc.getViews().add(viewCollatedDesign); + + // save the new views in the design doc + client.createDesignDoc(designDoc); + } + } + + + public static String printNoViewMessage() { + return "

View are not installed; click here to install them.

"; + } + +} diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index c6669b4..596ad8d 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -20,6 +20,10 @@ BreweryBeerServlet com.couchbase.beersample.BreweryAndBeerServlet + + InstallViewServlet + com.couchbase.beersample.InstallViewServlet + WelcomeServlet /welcome @@ -39,6 +43,10 @@ /all/* /all + + InstallViewServlet + /admin/install-views + welcome From 1c149ba60f79663039de22f0ff9ad971eb8115ca Mon Sep 17 00:00:00 2001 From: tgrall Date: Fri, 5 Apr 2013 12:30:26 +0200 Subject: [PATCH 4/5] Add full text search with Elasticsearch plugin --- pom.xml | 5 + .../couchbase/beersample/SearchServlet.java | 117 ++++++++++++++++++ src/main/webapp/WEB-INF/search/index.jsp | 47 +++++++ src/main/webapp/WEB-INF/web.xml | 8 ++ src/main/webapp/WEB-INF/welcome/index.jsp | 5 + 5 files changed, 182 insertions(+) create mode 100644 src/main/java/com/couchbase/beersample/SearchServlet.java create mode 100644 src/main/webapp/WEB-INF/search/index.jsp diff --git a/pom.xml b/pom.xml index 54daa21..49576da 100644 --- a/pom.xml +++ b/pom.xml @@ -27,6 +27,11 @@ + + org.elasticsearch + elasticsearch + 0.20.2 + couchbase couchbase-client diff --git a/src/main/java/com/couchbase/beersample/SearchServlet.java b/src/main/java/com/couchbase/beersample/SearchServlet.java new file mode 100644 index 0000000..ad29138 --- /dev/null +++ b/src/main/java/com/couchbase/beersample/SearchServlet.java @@ -0,0 +1,117 @@ +/** + * Copyright (C) 2009-2012 Couchbase, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALING + * IN THE SOFTWARE. + */ +package com.couchbase.beersample; + +import com.couchbase.client.CouchbaseClient; +import com.google.gson.Gson; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.client.Client; +import org.elasticsearch.client.transport.TransportClient; +import org.elasticsearch.common.transport.InetSocketTransportAddress; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.SearchHit; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; + + +/** + * The SearchServlet handles full text search query using Elasticsearch. + * + */ +public class SearchServlet extends HttpServlet { + + /** + * Obtains the current CouchbaseClient connection. + */ + final CouchbaseClient client = ConnectionManager.getInstance(); + + /** + * Google GSON is used for JSON encoding/decoding. + */ + final Gson gson = new Gson(); + + /** + * Dispatch all incoming GET HTTP requests. + * + * Since the /breweries/* routes are wildcarded and will all end up here, the + * method needs to check agains the PATH (through getPathInfo()) and + * determine which helper method should be called. The helper method then + * does the actual request and response handling. + * + * @param request the HTTP request object. + * @param response the HTTP response object. + * @throws javax.servlet.ServletException + * @throws java.io.IOException + */ + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + handleSearch(request, response); + } + + /** + * Handle the full text search action. + * + * Based Elasticsearch query + * + * @param request the HTTP request object. + * @param response the HTTP response object. + * @throws IOException + * @throws ServletException + */ + private void handleSearch(HttpServletRequest request, + HttpServletResponse response) throws IOException, ServletException { + + String query = request.getParameter("q"); + if (query == null) { + + } else { + Client elasticSearchClient = new TransportClient() + .addTransportAddress(new InetSocketTransportAddress("127.0.0.1", 9300)); + SearchResponse searchResponse = elasticSearchClient.prepareSearch("beer-sample") + .setQuery(QueryBuilders.queryString(query)) + .execute() + .actionGet(); + + ArrayList> results = new ArrayList>(); + for (SearchHit hit : searchResponse.getHits()) { + HashMap parsedDoc = gson.fromJson( + (String) client.get(hit.getId()), HashMap.class); + HashMap item = new HashMap(); + item.put("id", hit.getId()); + item.put("name", parsedDoc.get("name")); + item.put("type", parsedDoc.get("type")); + results.add(item); + } + request.setAttribute("results", results); + request.setAttribute("query", query); + } + request.getRequestDispatcher("/WEB-INF/search/index.jsp").forward(request, response); + } + +} diff --git a/src/main/webapp/WEB-INF/search/index.jsp b/src/main/webapp/WEB-INF/search/index.jsp new file mode 100644 index 0000000..438bff8 --- /dev/null +++ b/src/main/webapp/WEB-INF/search/index.jsp @@ -0,0 +1,47 @@ +<%@taglib prefix="t" tagdir="/WEB-INF/tags" %> +<%@page contentType="text/html" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + +

Search Beer and Brewery Database

+ + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
${item.name}${item.type}Edit + Delete + ${item.name}${item.type}Delete +
+
+
\ No newline at end of file diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 596ad8d..9611a05 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -24,6 +24,10 @@ InstallViewServlet com.couchbase.beersample.InstallViewServlet + + SearchServlet + com.couchbase.beersample.SearchServlet + WelcomeServlet /welcome @@ -47,6 +51,10 @@ InstallViewServlet /admin/install-views + + SearchServlet + /search + welcome diff --git a/src/main/webapp/WEB-INF/welcome/index.jsp b/src/main/webapp/WEB-INF/welcome/index.jsp index c5dc571..777082a 100644 --- a/src/main/webapp/WEB-INF/welcome/index.jsp +++ b/src/main/webapp/WEB-INF/welcome/index.jsp @@ -19,6 +19,11 @@ Take me to the all records
+
+

Search Beer Database

+ Generic search +
+
From 3effee9bf78f14444f012dfea3b9188a810e36b4 Mon Sep 17 00:00:00 2001 From: tgrall Date: Mon, 10 Jun 2013 11:32:12 +0200 Subject: [PATCH 5/5] Update to SDK 1.1.7 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 49576da..10cb851 100644 --- a/pom.xml +++ b/pom.xml @@ -35,7 +35,7 @@ couchbase couchbase-client - 1.1.0 + 1.1.7 com.google.code.gson