[jboss-cvs] JBossBlog SVN: r154 - in trunk: lib and 16 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Dec 5 11:22:24 EST 2007


Author: adamw
Date: 2007-12-05 11:22:23 -0500 (Wed, 05 Dec 2007)
New Revision: 154

Added:
   trunk/lib/jericho-html-2.5.jar
   trunk/src/action/org/jboss/blog/session/search/
   trunk/src/action/org/jboss/blog/session/search/PostSearchBean.java
   trunk/src/action/org/jboss/blog/session/search/StripHtmlBridge.java
   trunk/src/action/org/jboss/blog/session/search/SummaryBridge.java
   trunk/src/test/org/jboss/blog/tools/
   trunk/src/test/org/jboss/blog/tools/StripHtmlTest.java
   trunk/view/common/
   trunk/view/common/next_previous_navigation.xhtml
   trunk/view/search/
   trunk/view/search/search.xhtml
Modified:
   trunk/blog.iml
   trunk/build.xml
   trunk/resources/META-INF/persistence-dev.xml
   trunk/resources/META-INF/persistence-prod.xml
   trunk/resources/WEB-INF/pages.xml
   trunk/resources/messages_en.properties
   trunk/src/action/org/jboss/blog/session/view/FeedViewBean.java
   trunk/src/action/org/jboss/blog/tools/StringTools.java
   trunk/src/model/org/jboss/blog/model/Post.java
   trunk/view/layout/menu.xhtml
   trunk/view/manage/index.xhtml
   trunk/view/view/feed.xhtml
Log:


Modified: trunk/blog.iml
===================================================================
--- trunk/blog.iml	2007-12-04 23:38:14 UTC (rev 153)
+++ trunk/blog.iml	2007-12-05 16:22:23 UTC (rev 154)
@@ -117,6 +117,26 @@
         <SOURCES />
       </library>
     </orderEntry>
+    <orderEntry type="module-library">
+      <library name="search">
+        <CLASSES>
+          <root url="jar://$MODULE_DIR$/lib/lucene-core.jar!/" />
+          <root url="jar://$MODULE_DIR$/lib/hibernate-commons-annotations.jar!/" />
+          <root url="jar://$MODULE_DIR$/lib/hibernate-search.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
+    <orderEntry type="module-library">
+      <library>
+        <CLASSES>
+          <root url="jar://$MODULE_DIR$/lib/jericho-html-2.5.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
     <orderEntryProperties />
   </component>
 </module>

Modified: trunk/build.xml
===================================================================
--- trunk/build.xml	2007-12-04 23:38:14 UTC (rev 153)
+++ trunk/build.xml	2007-12-05 16:22:23 UTC (rev 154)
@@ -161,7 +161,12 @@
                 <include name="lib/richfaces-api*.jar" />
                 <include name="lib/rome*.jar" />
                 <include name="lib/jdom*.jar" />
+                <include name="lib/jericho-html-*.jar" />
 
+                <include name="lib/lucene-core.jar" />
+                <include name="lib/hibernate-search.jar" />
+                <include name="lib/hibernate-commons-annotations.jar" />
+
                 <!-- moved from the war goal -->
                 <include name="lib/richfaces-impl*.jar" />
                 <include name="lib/richfaces-ui*.jar" />

Added: trunk/lib/jericho-html-2.5.jar
===================================================================
(Binary files differ)


Property changes on: trunk/lib/jericho-html-2.5.jar
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:mime-type
   + application/octet-stream

Modified: trunk/resources/META-INF/persistence-dev.xml
===================================================================
--- trunk/resources/META-INF/persistence-dev.xml	2007-12-04 23:38:14 UTC (rev 153)
+++ trunk/resources/META-INF/persistence-dev.xml	2007-12-05 16:22:23 UTC (rev 154)
@@ -1,22 +1,37 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- Persistence deployment descriptor for dev profile -->
-<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
+<persistence xmlns="http://java.sun.com/xml/ns/persistence"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" 
+             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
              version="1.0">
-             
-   <persistence-unit name="blog">
-      <provider>org.hibernate.ejb.HibernatePersistence</provider>
-      <jta-data-source>java:/blogDatasource</jta-data-source>
-      <properties>
-         <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
-         <property name="hibernate.hbm2ddl.auto" value="update"/>
-         <property name="hibernate.show_sql" value="false"/>
-         <property name="hibernate.format_sql" value="true"/>
-         <property name="jboss.entity.manager.factory.jndi.name" value="java:/blogEntityManagerFactory"/>
-         <property name="hibernate.connection.useUnicode" value="true" />
-         <property name="hibernate.connection.characterEncoding" value="UTF-8" />
-      </properties>
-   </persistence-unit>
-    
+
+    <persistence-unit name="blog">
+        <provider>org.hibernate.ejb.HibernatePersistence</provider>
+        <jta-data-source>java:/blogDatasource</jta-data-source>
+        <properties>
+            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
+            <property name="hibernate.hbm2ddl.auto" value="update"/>
+            <property name="hibernate.show_sql" value="false"/>
+            <property name="hibernate.format_sql" value="true"/>
+            <property name="jboss.entity.manager.factory.jndi.name" value="java:/blogEntityManagerFactory"/>
+            <property name="hibernate.connection.useUnicode" value="true" />
+            <property name="hibernate.connection.characterEncoding" value="UTF-8" />
+
+            <!-- Search -->
+            <!-- use a file system based index -->
+            <property name="hibernate.search.default.directory_provider"
+                      value="org.hibernate.search.store.FSDirectoryProvider"/>
+            <!-- directory where the indexes will be stored -->
+            <property name="hibernate.search.default.indexBase"
+                      value="/Users/adamwarski/jboss/blog-index"/>
+
+            <property name="hibernate.ejb.event.post-insert"
+                      value="org.hibernate.search.event.FullTextIndexEventListener"/>
+            <property name="hibernate.ejb.event.post-update"
+                      value="org.hibernate.search.event.FullTextIndexEventListener"/>
+            <property name="hibernate.ejb.event.post-delete"
+                      value="org.hibernate.search.event.FullTextIndexEventListener"/>
+        </properties>
+    </persistence-unit>
+
 </persistence>

Modified: trunk/resources/META-INF/persistence-prod.xml
===================================================================
--- trunk/resources/META-INF/persistence-prod.xml	2007-12-04 23:38:14 UTC (rev 153)
+++ trunk/resources/META-INF/persistence-prod.xml	2007-12-05 16:22:23 UTC (rev 154)
@@ -1,21 +1,36 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- Persistence deployment descriptor for prod profile -->
-<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
+<persistence xmlns="http://java.sun.com/xml/ns/persistence"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" 
+             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
              version="1.0">
-             
-   <persistence-unit name="blog">
-      <provider>org.hibernate.ejb.HibernatePersistence</provider>
-      <jta-data-source>java:/blogDatasource</jta-data-source>
-      <properties>
-         <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
-         <property name="hibernate.hbm2ddl.auto" value="update"/>
-         <property name="hibernate.jdbc.batch_size" value="20"/>
-         <property name="jboss.entity.manager.factory.jndi.name" value="java:/blogEntityManagerFactory"/>
-         <property name="hibernate.connection.useUnicode" value="true" />
-         <property name="hibernate.connection.characterEncoding" value="UTF-8" />
-      </properties>
-   </persistence-unit>
-    
+
+    <persistence-unit name="blog">
+        <provider>org.hibernate.ejb.HibernatePersistence</provider>
+        <jta-data-source>java:/blogDatasource</jta-data-source>
+        <properties>
+            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
+            <property name="hibernate.hbm2ddl.auto" value="update"/>
+            <property name="hibernate.jdbc.batch_size" value="20"/>
+            <property name="jboss.entity.manager.factory.jndi.name" value="java:/blogEntityManagerFactory"/>
+            <property name="hibernate.connection.useUnicode" value="true" />
+            <property name="hibernate.connection.characterEncoding" value="UTF-8" />
+
+            <!-- Search -->
+            <!-- use a file system based index -->
+            <property name="hibernate.search.default.directory_provider"
+                      value="org.hibernate.search.store.FSDirectoryProvider"/>
+            <!-- directory where the indexes will be stored -->
+            <property name="hibernate.search.default.indexBase"
+                      value="/home/awarski/blog/index"/>
+
+            <property name="hibernate.ejb.event.post-insert"
+                      value="org.hibernate.search.event.FullTextIndexEventListener"/>
+            <property name="hibernate.ejb.event.post-update"
+                      value="org.hibernate.search.event.FullTextIndexEventListener"/>
+            <property name="hibernate.ejb.event.post-delete"
+                      value="org.hibernate.search.event.FullTextIndexEventListener"/>
+        </properties>
+    </persistence-unit>
+
 </persistence>

Modified: trunk/resources/WEB-INF/pages.xml
===================================================================
--- trunk/resources/WEB-INF/pages.xml	2007-12-04 23:38:14 UTC (rev 153)
+++ trunk/resources/WEB-INF/pages.xml	2007-12-05 16:22:23 UTC (rev 154)
@@ -30,6 +30,15 @@
         </navigation>
     </page>
 
+    <!-- Search -->
+
+    <page view-id="/search/search.xhtml">
+        <param name="query" value="#{postSearch.query}" />
+        <param name="from" value="#{postSearch.from}" />
+
+        <action execute="#{postSearch.search}" />
+    </page>
+
     <!-- Manage feeds -->
 
     <page view-id="/manage/add.xhtml" />

Modified: trunk/resources/messages_en.properties
===================================================================
--- trunk/resources/messages_en.properties	2007-12-04 23:38:14 UTC (rev 153)
+++ trunk/resources/messages_en.properties	2007-12-05 16:22:23 UTC (rev 154)
@@ -105,4 +105,7 @@
 
 blog.template.new.existingname=A template with that name already exists.
 
-blog.post.deleted=Post '{0}' deleted.
\ No newline at end of file
+blog.post.deleted=Post '{0}' deleted.
+
+blog.search.exception=Malformed search query: {0}.
+blog.search.emptyquery=Your query is empty.
\ No newline at end of file

Added: trunk/src/action/org/jboss/blog/session/search/PostSearchBean.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/search/PostSearchBean.java	                        (rev 0)
+++ trunk/src/action/org/jboss/blog/session/search/PostSearchBean.java	2007-12-05 16:22:23 UTC (rev 154)
@@ -0,0 +1,132 @@
+package org.jboss.blog.session.search;
+
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.apache.lucene.queryParser.MultiFieldQueryParser;
+import org.apache.lucene.queryParser.ParseException;
+import org.apache.lucene.search.Query;
+import org.hibernate.search.jpa.FullTextEntityManager;
+import org.hibernate.search.jpa.FullTextQuery;
+import org.jboss.blog.model.Post;
+import org.jboss.seam.ScopeType;
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Scope;
+import org.jboss.seam.faces.FacesMessages;
+
+import javax.faces.application.FacesMessage;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author <a href="mailto:adam at warski.org">Adam Warski</a>
+ */
+ at Name("postSearch")
+ at Scope(ScopeType.CONVERSATION)
+public class PostSearchBean {
+    @In
+    private FullTextEntityManager entityManager;
+
+    @In
+    private FacesMessages facesMessages;
+
+    private String query;
+
+    private int from;
+
+    private List<Object[]> results;
+
+    private int resultsCount;
+
+    public String getQuery() {
+        return query;
+    }
+
+    public void setQuery(String query) {
+        this.query = query;
+    }
+
+    private int getNumberOfResultsPerPage() {
+        return 10;
+    }
+
+    public int getFrom() {
+        return from;
+    }
+
+    public void setFrom(int from) {
+        this.from = from;
+    }
+
+    public boolean getShowNext() {
+        return getNextFrom() < resultsCount;
+    }
+
+    public boolean getShowPrevious() {
+        return from != 0;
+    }
+
+    public int getNextFrom() {
+        return from + getNumberOfResultsPerPage();
+    }
+
+    public int getPreviousFrom() {
+        return Math.max(0, from - getNumberOfResultsPerPage());
+    }
+
+    public int getResultsCount() {
+        return resultsCount;
+    }
+
+    public List<Object[]> getResults() {
+        return results;
+    }
+
+    private FullTextQuery getFullTextQuery() throws ParseException {
+        MultiFieldQueryParser parser = new MultiFieldQueryParser(
+                new String[]{ "title", "content", "author" },
+                new StandardAnalyzer());
+        Query luceneQuery = parser.parse(getQuery());
+
+        FullTextQuery fullTextQuery = entityManager.createFullTextQuery(luceneQuery);
+        fullTextQuery.setProjection(FullTextQuery.SCORE, "title", "titleAsId", "summary");
+
+        return fullTextQuery;
+    }
+
+    @SuppressWarnings("unchecked")
+    public void search() {
+        if (query == null || "".equals(query.trim())) {
+            facesMessages.addFromResourceBundle(FacesMessage.SEVERITY_INFO, "blog.search.emptyquery");
+            results = new ArrayList<Object[]>();
+            resultsCount = 0;
+            return;
+        }
+
+        FullTextQuery fullTextQuery;
+        try {
+            fullTextQuery = getFullTextQuery();
+        } catch (ParseException e) {
+            facesMessages.addFromResourceBundle(FacesMessage.SEVERITY_ERROR, "blog.search.exception",
+                    e.getMessage());
+            results = new ArrayList<Object[]>();
+            resultsCount = 0;
+            return;
+        }
+
+        results = fullTextQuery.setFirstResult(getFrom()).setMaxResults(getNumberOfResultsPerPage())
+                .getResultList();
+        resultsCount = fullTextQuery.getResultSize();
+    }
+
+    public String formatScore(float f) {
+        return String.format("%.2f", f*100);
+    }
+
+    @SuppressWarnings("unchecked")
+    public void reindex() {
+        List<Post> posts = entityManager.createQuery("select post from Post post").getResultList();
+        for (Post post : posts) {
+            entityManager.index(post);
+        }
+    }
+}

Added: trunk/src/action/org/jboss/blog/session/search/StripHtmlBridge.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/search/StripHtmlBridge.java	                        (rev 0)
+++ trunk/src/action/org/jboss/blog/session/search/StripHtmlBridge.java	2007-12-05 16:22:23 UTC (rev 154)
@@ -0,0 +1,17 @@
+package org.jboss.blog.session.search;
+
+import org.hibernate.search.bridge.StringBridge;
+import org.jboss.blog.tools.StringTools;
+
+/**
+ * @author <a href="mailto:adam at warski.org">Adam Warski</a>
+ */
+public class StripHtmlBridge implements StringBridge {
+    public String objectToString(Object o) {
+        if (o == null) {
+            return null;
+        }
+
+        return StringTools.stripHtml(o.toString());
+    }
+}

Added: trunk/src/action/org/jboss/blog/session/search/SummaryBridge.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/search/SummaryBridge.java	                        (rev 0)
+++ trunk/src/action/org/jboss/blog/session/search/SummaryBridge.java	2007-12-05 16:22:23 UTC (rev 154)
@@ -0,0 +1,26 @@
+package org.jboss.blog.session.search;
+
+import org.hibernate.search.bridge.TwoWayStringBridge;
+import org.jboss.blog.tools.StringTools;
+
+/**
+ * @author <a href="mailto:adam at warski.org">Adam Warski</a>
+ */
+public class SummaryBridge implements TwoWayStringBridge {
+    public String objectToString(Object o) {
+        if (o == null) {
+            return null;
+        }
+
+        String s = o.toString();
+        if (s.length() > 300) {
+            s = s.substring(0, 300);
+        }
+
+        return StringTools.stripHtml(s) + " ...";
+    }
+
+    public Object stringToObject(String s) {
+        return s;
+    }
+}

Modified: trunk/src/action/org/jboss/blog/session/view/FeedViewBean.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/view/FeedViewBean.java	2007-12-04 23:38:14 UTC (rev 153)
+++ trunk/src/action/org/jboss/blog/session/view/FeedViewBean.java	2007-12-05 16:22:23 UTC (rev 154)
@@ -49,19 +49,19 @@
         return posts;
     }
 
-    public boolean getShowNext() {
+    public boolean getShowPrevious() {
         return from != 0;
     }
 
-    public boolean getShowPrevious() {
+    public boolean getShowNext() {
         return getPosts().size() == feed.getMaxPostsOnPage()+1;
     }
 
-    public int getNextFrom() {
+    public int getPreviousFrom() {
         return Math.max(0, from - feed.getMaxPostsOnPage());
     }
 
-    public int getPreviousFrom() {
+    public int getNextFrom() {
         return from + feed.getMaxPostsOnPage();
     }
 }

Modified: trunk/src/action/org/jboss/blog/tools/StringTools.java
===================================================================
--- trunk/src/action/org/jboss/blog/tools/StringTools.java	2007-12-04 23:38:14 UTC (rev 153)
+++ trunk/src/action/org/jboss/blog/tools/StringTools.java	2007-12-05 16:22:23 UTC (rev 154)
@@ -1,5 +1,7 @@
 package org.jboss.blog.tools;
 
+import au.id.jericho.lib.html.Source;
+
 /**
  * @author <a href="mailto:adam at warski.org">Adam Warski</a>
  */
@@ -19,4 +21,12 @@
 
         return title.toLowerCase().replaceAll("[^a-z0-9_]", "_");
     }
+
+    public static String stripHtml(String html) {
+        Source source = new Source(html);
+
+        source.fullSequentialParse();
+
+        return source.getTextExtractor().toString();
+    }
 }

Modified: trunk/src/model/org/jboss/blog/model/Post.java
===================================================================
--- trunk/src/model/org/jboss/blog/model/Post.java	2007-12-04 23:38:14 UTC (rev 153)
+++ trunk/src/model/org/jboss/blog/model/Post.java	2007-12-05 16:22:23 UTC (rev 154)
@@ -1,9 +1,12 @@
 package org.jboss.blog.model;
 
+import org.hibernate.search.annotations.*;
 import org.hibernate.validator.Length;
 import org.hibernate.validator.NotEmpty;
 import org.hibernate.validator.NotNull;
 import org.hibernate.validator.Pattern;
+import org.jboss.blog.session.search.StripHtmlBridge;
+import org.jboss.blog.session.search.SummaryBridge;
 import org.jboss.blog.tools.StringTools;
 
 import javax.persistence.*;
@@ -14,22 +17,32 @@
  * @author <a href="mailto:adam at warski.org">Adam Warski</a>
  */
 @Entity
+ at Indexed
 public class Post {
     @Id
     @GeneratedValue
     @Column(updatable = false)
+    @DocumentId
     private Integer id;
 
     @NotEmpty
     @Length(max = 512)
+    @Field(store = Store.YES)
+    @Boost(2)
     private String title;
 
     @NotEmpty
     @Pattern(regex = "^[a-z0-9_]*$")
     @Column(unique = true)
+    @Field(store = Store.YES, index = Index.UN_TOKENIZED)
     private String titleAsId;
 
     @Lob
+    @Fields( {
+            @Field(bridge = @FieldBridge(impl = StripHtmlBridge.class)),
+            @Field(name = "summary", index = Index.UN_TOKENIZED, store = Store.YES,
+                    bridge = @FieldBridge(impl = SummaryBridge.class))
+            } )
     private String content;
 
     @Length(max = 512)
@@ -38,6 +51,7 @@
 
     @Length(max = 256)
     @NotEmpty
+    @Field
     private String author;
 
     @ManyToMany

Added: trunk/src/test/org/jboss/blog/tools/StripHtmlTest.java
===================================================================
--- trunk/src/test/org/jboss/blog/tools/StripHtmlTest.java	                        (rev 0)
+++ trunk/src/test/org/jboss/blog/tools/StripHtmlTest.java	2007-12-05 16:22:23 UTC (rev 154)
@@ -0,0 +1,26 @@
+package org.jboss.blog.tools;
+
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+/**
+ * @author <a href="mailto:adam at warski.org">Adam Warski</a>
+ */
+public class StripHtmlTest {
+    @DataProvider(name = "texts")
+    public Object[][] getData() {
+        return new Object[][] {
+                { "<p>Some text.</p>", "Some text." },
+                { "This: < shouldn't get removed.", "This: < shouldn't get removed." },
+                { "<p>Non-terminated tags. <a> And now this!. >", "Non-terminated tags. And now this!. >" },
+                { "<p > Tags with spaces, and some <a > not terminated </a>.",
+                        "Tags with spaces, and some not terminated ." }
+        };
+    }
+
+    @Test(dataProvider = "texts")
+    public void test(String original, String stripped) {
+        System.out.println(StringTools.stripHtml(original));
+        assert stripped.equals(StringTools.stripHtml(original));
+    }
+}

Added: trunk/view/common/next_previous_navigation.xhtml
===================================================================
--- trunk/view/common/next_previous_navigation.xhtml	                        (rev 0)
+++ trunk/view/common/next_previous_navigation.xhtml	2007-12-05 16:22:23 UTC (rev 154)
@@ -0,0 +1,23 @@
+<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:s="http://jboss.com/products/seam/taglib"
+                xmlns:ui="http://java.sun.com/jsf/facelets"
+                xmlns:f="http://java.sun.com/jsf/core"
+                xmlns:h="http://java.sun.com/jsf/html"
+                xmlns:rich="http://richfaces.org/rich"
+                xmlns:a="http://richfaces.org/a4j">
+    <p>
+        <s:link view="#{viewId}" value="&#171; Previous" rendered="#{navigationBean.showPrevious}"
+                propagation="none">
+            <f:param name="from" value="#{navigationBean.previousFrom}" />
+        </s:link>
+    </p>
+
+    <p>
+        <s:link view="#{viewId}" value="Next &#187;" rendered="#{navigationBean.showNext}"
+                propagation="none">
+            <f:param name="from" value="#{navigationBean.nextFrom}" />
+        </s:link>
+    </p>
+</ui:composition>
\ No newline at end of file

Modified: trunk/view/layout/menu.xhtml
===================================================================
--- trunk/view/layout/menu.xhtml	2007-12-04 23:38:14 UTC (rev 153)
+++ trunk/view/layout/menu.xhtml	2007-12-05 16:22:23 UTC (rev 154)
@@ -9,8 +9,15 @@
         <h:outputText value="#{projectName}:"/>
         <s:link view="/home.xhtml" value="Home"/>
     </rich:toolBarGroup>
-    <!-- @newMenuItem@ -->
     <rich:toolBarGroup location="right">
+        <h:form>
+            <h:inputText value="#{postSearch.query}" />
+            <h:commandButton value="Search" action="/search/search.xhtml">
+                <s:conversationPropagation value="none" />
+            </h:commandButton>      
+        </h:form>
+    </rich:toolBarGroup>
+    <rich:toolBarGroup location="right">
         <h:outputText value="Welcome, #{identity.username}!" rendered="#{identity.loggedIn}"/>
         <s:link view="/login.xhtml" value="Login" rendered="#{not identity.loggedIn}"/>
         <s:link view="/home.xhtml" action="#{identity.logout}" value="Logout" rendered="#{identity.loggedIn}"/>

Modified: trunk/view/manage/index.xhtml
===================================================================
--- trunk/view/manage/index.xhtml	2007-12-04 23:38:14 UTC (rev 153)
+++ trunk/view/manage/index.xhtml	2007-12-05 16:22:23 UTC (rev 154)
@@ -12,7 +12,9 @@
 
         <s:link value="Manage templates" view="/manage/template/template_list.xhtml" /> <br /> <br />
 
-        <s:link value="Add new feed" view="/manage/add.xhtml" />
+        <s:link value="Add new feed" view="/manage/add.xhtml" /> <br /> <br />
+
+        <s:link value="Re-index posts (for search)" action="#{postSearch.reindex}" />
         
         <h3>Current feeds:</h3>
 

Added: trunk/view/search/search.xhtml
===================================================================
--- trunk/view/search/search.xhtml	                        (rev 0)
+++ trunk/view/search/search.xhtml	2007-12-05 16:22:23 UTC (rev 154)
@@ -0,0 +1,40 @@
+<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:s="http://jboss.com/products/seam/taglib"
+                xmlns:ui="http://java.sun.com/jsf/facelets"
+                xmlns:f="http://java.sun.com/jsf/core"
+                xmlns:h="http://java.sun.com/jsf/html"
+                xmlns:rich="http://richfaces.org/rich"
+                template="../layout/template.xhtml">
+    <ui:define name="body">
+        <h1>Search</h1>
+
+        <s:div rendered="#{empty postSearch.results}">
+            <p>
+                Your search for: '#{postSearch.query}' didn't return any results.
+            </p>
+        </s:div>
+
+        <s:div rendered="#{not empty postSearch.results}">
+            <p>
+                Your search for: '#{postSearch.query}' returned #{postSearch.resultsCount} results.
+            </p>
+
+            <ui:include src="../common/next_previous_navigation.xhtml">
+                <ui:param name="viewId" value="/search/search.xhtml" />
+                <ui:param name="navigationBean" value="#{postSearch}" />
+            </ui:include>
+
+            <ui:repeat var="result" value="#{postSearch.results}">
+                <p>
+                    <s:link view="/view/post.xhtml" value="#{result[1]}">
+                        <f:param name="post" value="#{result[2]}" />
+                    </s:link> (#{postSearch.formatScore(result[0])}%)
+                    <br />
+                    #{result[3]}
+                </p>
+            </ui:repeat>
+        </s:div>
+    </ui:define>
+</ui:composition>

Modified: trunk/view/view/feed.xhtml
===================================================================
--- trunk/view/view/feed.xhtml	2007-12-04 23:38:14 UTC (rev 153)
+++ trunk/view/view/feed.xhtml	2007-12-05 16:22:23 UTC (rev 154)
@@ -24,20 +24,11 @@
             </s:link>
         </p>
 
-        <p>
-            <s:link view="/view/feed.xhtml" value="&#171; Next" rendered="#{feedView.showNext}"
-                    propagation="none">
-                <f:param name="from" value="#{feedView.nextFrom}" />
-            </s:link>
-        </p>
+        <ui:include src="../common/next_previous_navigation.xhtml">
+            <ui:param name="viewId" value="/view/feed.xhtml" />
+            <ui:param name="navigationBean" value="#{feedView}" />
+        </ui:include>
 
-        <p>
-            <s:link view="/view/feed.xhtml" value="Previous &#187;" rendered="#{feedView.showPrevious}"
-                    propagation="none">
-                <f:param name="from" value="#{feedView.previousFrom}" />
-            </s:link>
-        </p>
-
         <a:repeat var="post" value="#{feedView.posts}" rows="#{feedView.feed.maxPostsOnPage}">
             <rich:panel>
                 <f:facet name="header">




More information about the jboss-cvs-commits mailing list