knguyen 2005/02/14 15:30:18 CET
Modified files:
core/src/java/org/jahia/engines/search Search_Engine.java
Added files:
core/src/java/org/jahia/engines/search SearchHandler.java
SearchHandlerImpl.java
Log:
- updated search service with file properties indexation and adv search
Revision Changes Path
1.1 +28 -0
jahia/core/src/java/org/jahia/engines/search/SearchHandler.java (new)
http://jahia.mine.nu:8080/cgi-bin/cvsweb.cgi/jahia/core/src/java/org/jahia/engines/search/SearchHandler.java?rev=1.1&content-type=text/plain
1.1 +273 -0
jahia/core/src/java/org/jahia/engines/search/SearchHandlerImpl.java (new)
http://jahia.mine.nu:8080/cgi-bin/cvsweb.cgi/jahia/core/src/java/org/jahia/engines/search/SearchHandlerImpl.java?rev=1.1&content-type=text/plain
1.5 +113 -52
jahia/core/src/java/org/jahia/engines/search/Search_Engine.java
http://jahia.mine.nu:8080/cgi-bin/cvsweb.cgi/jahia/core/src/java/org/jahia/engines/search/Search_Engine.java.diff?r1=1.4&r2=1.5&f=h
Index: SearchHandler.java
====================================================================
package org.jahia.engines.search;
import org.jahia.params.ParamBean;
import org.jahia.data.search.JahiaSearchResult;
import org.jahia.exceptions.JahiaException;
import java.util.HashMap;
/**
* Created by IntelliJ IDEA.
* User: hollis
* Date: 8 f�vr. 2005
* Time: 15:02:10
* To change this template use File | Settings | File Templates.
*/
public interface SearchHandler {
public abstract void setName(String name);
public abstract String getName();
public abstract void init(ParamBean jParams, HashMap engineMap);
public abstract JahiaSearchResult getSearchResult();
public abstract JahiaSearchResult search(ParamBean jParams) throws
JahiaException;
}
Index: SearchHandlerImpl.java
====================================================================
package org.jahia.engines.search;
import org.jahia.params.ParamBean;
import org.jahia.data.search.JahiaSearchResult;
import org.jahia.registries.ServicesRegistry;
import org.jahia.services.search.JahiaSearchResultHandlerImpl;
import org.jahia.exceptions.JahiaException;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.StringTokenizer;
import java.util.HashMap;
import java.util.ArrayList;
/**
* Created by IntelliJ IDEA.
* User: hollis
* Date: 8 f�vr. 2005
* Time: 15:02:10
* To change this template use File | Settings | File Templates.
*/
public class SearchHandlerImpl implements SearchHandler {
private String name;
private String allWord = "";
private String exactPhrase = "";
private String oneOfWord = "";
private String withoutWord = "";
private ArrayList languageCodes = new ArrayList();
private String screen = "";
private String query = "";
private JahiaSearchResult searchResult = null;
public static final String ALL_WORD_SEARCH = "allWordSearch";
public static final String EXACT_PHRASE_SEARCH = "exactPhraseSearch";
public static final String ONE_OF_WORD_SEARCH = "oneOfWordSearch";
public static final String WITHOUT_WORD_SEARCH = "withoutWordSearch";
public SearchHandlerImpl(){
}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void init(ParamBean jParams, HashMap engineMap){
HttpServletRequest request = jParams.getRequest();
String value = (String) request.getParameter(ALL_WORD_SEARCH);
if ( value != null ){
this.allWord = value;
}
value = (String) request.getParameter(EXACT_PHRASE_SEARCH);
if ( value != null ){
this.exactPhrase = value;
}
value = (String) request.getParameter(ONE_OF_WORD_SEARCH);
if ( value != null ){
this.oneOfWord = value;
}
value = (String) request.getParameter(WITHOUT_WORD_SEARCH);
if ( value != null ){
this.withoutWord = value;
}
languageCodes = (ArrayList)engineMap.get("searchLanguageCodes");
if ( languageCodes == null ){
languageCodes = new ArrayList();
}
screen = (String)engineMap.get("screen");
if ( screen == null ){
screen = "execute";
}
buildQuery();
}
public JahiaSearchResult search(ParamBean jParams) throws JahiaException {
if ( screen.equals("execute") ){
searchResult = ServicesRegistry
.getInstance ().getJahiaSearchService ()
.doSearch (query, jParams, languageCodes);
}
if (searchResult == null) {
searchResult = new JahiaSearchResult(new
JahiaSearchResultHandlerImpl());
}
return searchResult;
}
public JahiaSearchResult getSearchResult(){
return this.searchResult;
}
public void buildQuery(){
StringBuffer buffer = new StringBuffer();
if ( !"".equals(this.getAllWord().trim()) ){
StringBuffer searchQueryBuffer = new StringBuffer("");
StringTokenizer tokenizer = new
StringTokenizer(this.getAllWord().trim()," ");
String token = null;
if ( tokenizer.hasMoreElements() ){
searchQueryBuffer.append("(");
}
while ( tokenizer.hasMoreElements() ){
token = tokenizer.nextToken();
searchQueryBuffer.append(" +");
searchQueryBuffer.append(token);
}
if ( searchQueryBuffer.length()>0 ){
searchQueryBuffer.append(") ");
}
buffer.append(searchQueryBuffer.toString());
}
if ( !"".equals(this.getExactPhrase().trim()) ){
if ( buffer.length()>0 ){
buffer.append(" AND ");
}
buffer.append("(");
buffer.append('"' + this.getExactPhrase().trim() + '"');
buffer.append(" )");
}
if ( !"".equals(this.getOneOfWord().trim()) ){
StringBuffer searchQueryBuffer = new StringBuffer();
StringTokenizer tokenizer = new
StringTokenizer(this.getOneOfWord().trim()," ");
String token = null;
if ( tokenizer.hasMoreElements() ){
if ( buffer.length()>0 ){
buffer.append(" AND ");
}
buffer.append("(");
}
while ( tokenizer.hasMoreElements() ){
token = tokenizer.nextToken();
searchQueryBuffer.append(token);
if ( tokenizer.hasMoreElements() ){
searchQueryBuffer.append(" OR ");
}
}
if ( searchQueryBuffer.length()>0 ){
searchQueryBuffer.append(") ");
}
buffer.append(searchQueryBuffer.toString());
}
if ( !"".equals(this.getWithoutWord()) ){
StringBuffer searchQueryBuffer = new StringBuffer();
StringTokenizer tokenizer = new
StringTokenizer(this.getWithoutWord().trim()," ");
String token = null;
if ( tokenizer.hasMoreElements() ){
if ( buffer.length()>0 ){
buffer.append(" AND ");
}
buffer.append("(");
}
while ( tokenizer.hasMoreElements() ){
token = tokenizer.nextToken();
searchQueryBuffer.append(" -");
searchQueryBuffer.append(token);
}
if ( searchQueryBuffer.length()>0 ){
searchQueryBuffer.append(") ");
}
buffer.append(searchQueryBuffer.toString());
}
query = buffer.toString();
/*
if ( ALL_WORD_SEARCH.equals(this.searchInput) ){
StringBuffer searchQueryBuffer = new StringBuffer();
StringTokenizer tokenizer = new StringTokenizer(query," ");
String token = null;
while ( tokenizer.hasMoreElements() ){
token = tokenizer.nextToken();
searchQueryBuffer.append(" +");
searchQueryBuffer.append(token);
}
query = searchQueryBuffer.toString();
} else if ( EXACT_PHRASE_SEARCH.equals(this.searchInput) ) {
query = '"' + query.trim() + '"';
} else if ( ONE_OF_WORD_SEARCH.equals(this.searchInput) ){
StringBuffer searchQueryBuffer = new StringBuffer();
StringTokenizer tokenizer = new StringTokenizer(query," ");
String token = null;
while ( tokenizer.hasMoreElements() ){
token = tokenizer.nextToken();
searchQueryBuffer.append(token);
if ( tokenizer.hasMoreElements() ){
searchQueryBuffer.append(" OR ");
}
}
query = searchQueryBuffer.toString();
} else if ( WITHOUT_WORD_SEARCH.equals(this.searchInput) ) {
StringBuffer searchQueryBuffer = new StringBuffer();
StringTokenizer tokenizer = new StringTokenizer(query," ");
String token = null;
while ( tokenizer.hasMoreElements() ){
token = tokenizer.nextToken();
searchQueryBuffer.append("-");
searchQueryBuffer.append(token);
}
query = searchQueryBuffer.toString();
}*/
}
public String getAllWord() {
return allWord;
}
public void setAllWord(String allWord) {
this.allWord = allWord;
}
public String getExactPhrase() {
return exactPhrase;
}
public void setExactPhrase(String exactPhrase) {
this.exactPhrase = exactPhrase;
}
public String getOneOfWord() {
return oneOfWord;
}
public void setOneOfWord(String oneOfWord) {
this.oneOfWord = oneOfWord;
}
public String getWithoutWord() {
return withoutWord;
}
public void setWithoutWord(String withoutWord) {
this.withoutWord = withoutWord;
}
public ArrayList getLanguageCodes() {
return languageCodes;
}
public void setLanguageCodes(ArrayList languageCodes) {
this.languageCodes = languageCodes;
}
public String getScreen() {
return screen;
}
public void setScreen(String screen) {
this.screen = screen;
}
public String getQuery() {
return query;
}
public void setQuery(String query) {
this.query = query;
}
}
Index: Search_Engine.java
===================================================================
RCS file:
/home/cvs/repository/jahia/core/src/java/org/jahia/engines/search/Search_Engine.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- Search_Engine.java 17 Aug 2004 13:56:49 -0000 1.4
+++ Search_Engine.java 14 Feb 2005 14:30:18 -0000 1.5
@@ -24,6 +24,7 @@
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.Properties;
import org.jahia.data.JahiaData;
import org.jahia.data.search.JahiaSearchResult;
@@ -34,6 +35,9 @@
import org.jahia.registries.ServicesRegistry;
import org.jahia.utils.JahiaTools;
import org.jahia.services.search.*;
+import org.jahia.services.fileextraction.FileExtractor;
+import org.jahia.bin.Jahia;
+import org.springframework.beans.factory.BeanFactory;
/**
@@ -54,6 +58,9 @@
/** The engine's name. */
public static final String ENGINE_NAME = "search";
+ public static final String SEARCH_HANDLER = "searchHandler";
+
+ public static final String DEFAULT_CONFIG = "default";
private static final String TEMPLATE_JSP =
"/jsp/jahia/engines/search/searchresult.jsp";
private static final String SEARCH_JSP_NAME = "searchresult.jsp";
@@ -123,11 +130,22 @@
*/
public EngineValidationHelper handleActions (ParamBean jParams,
JahiaData jData)
throws JahiaException {
- // initalizes the hashmap
-// HashMap engineMap = new HashMap();
- HashMap engineMap = (HashMap) jParams.getRequest ().getAttribute
("engineMap");
- if (engineMap == null)
+
+ // init engineMap
+ String theScreen = jParams.getRequest ().getParameter ("screen");
+ HashMap engineMap = null;
+ if (theScreen == null){
+ theScreen = "execute";
engineMap = new HashMap ();
+ } else {
+ engineMap = (HashMap) jParams.getSession().getAttribute
("engineMap");
+ }
+ if ( engineMap == null ){
+ engineMap = new HashMap();
+ }
+ engineMap.put("screen",theScreen);
+ jParams.getSession().setAttribute("engineMap",engineMap);
+ jParams.getRequest().setAttribute("engineMap", engineMap);
processScreen (jParams, jData, engineMap);
@@ -171,11 +189,73 @@
}
}
- String theScreen = jParams.getRequest ().getParameter ("screen");
- if (theScreen == null) {
- theScreen = "execute";
+ String searchString = jParams.getRequest ().getParameter ("search");
+ if (searchString == null) {
+ searchString = (String) engineMap.get ("searchString");
+ }
+ if (searchString == null) {
+ searchString = EMPTY_STRING;
+ } else {
+ searchString = searchString.trim ();
+ }
+ engineMap.put ("searchString", searchString);
+
+ // execute the search (called the 1st time)
+ engineMap.put (ENGINE_OUTPUT_FILE_PARAM, theTemplate);
+
+ engineMap.put (RENDER_TYPE_PARAM, new Integer
(JahiaEngine.RENDERTYPE_FORWARD));
+ engineMap.put (ENGINE_NAME_PARAM, ENGINE_NAME);
+ engineMap.put (ENGINE_URL_PARAM, jParams.composeEngineUrl
(ENGINE_NAME, EMPTY_STRING));
+ engineMap.put ("jahiaBuild", new Integer (jParams.settings
().getBuildNumber ()));
+ engineMap.put ("javascriptUrl", jParams.settings ().getJsHttpPath
());
+
+ ArrayList languageCodes = new ArrayList ();
+ String[] languageCodesVal = jParams.getRequest ().getParameterValues
("searchlang");
+ if (languageCodesVal != null) {
+ if (!JahiaTools.inValues (Search_Engine.SEARCH_ALL_LANG,
languageCodesVal)) {
+ for (int i = 0; i < languageCodesVal.length; i++) {
+ languageCodes.add (languageCodesVal[i]);
+ }
+ }
+ } else {
+ languageCodes.add (jParams.getLocale ().toString ());
+ }
+ engineMap.put ("searchLanguageCodes", languageCodes);
+
+ // load search handler
+ SearchHandler searchHandler =
(SearchHandler)engineMap.get(SEARCH_HANDLER);
+ if ( searchHandler == null ){
+ String searchHandlerName =
jParams.getRequest().getParameter(SEARCH_HANDLER);
+ try {
+ searchHandler = this.getSearchHandler(searchHandlerName);
+ if ( searchHandler != null ){
+ searchHandler.setName(searchHandlerName);
+ }
+ } catch ( Throwable t ){
+ logger.debug("Error determining search handler , name=" +
searchHandlerName,t);
+ }
+ }
+ if ( searchHandler != null ){
+ searchHandler.init(jParams, engineMap);
+ engineMap.put(SEARCH_HANDLER,searchHandler);
+ }
+
+ String theScreen = (String)engineMap.get("screen");
+ if ( searchHandler == null ){
+ JahiaSearchResult searchResults =
(JahiaSearchResult)engineMap.get("searchResults");
+ if ( theScreen.equals("execute") || searchResults == null ){
+ searchResults = ServicesRegistry
+ .getInstance ().getJahiaSearchService ()
+ .doSearch (searchString, jParams, languageCodes);
+ }
+ if (searchResults == null) {
+ searchResults = new JahiaSearchResult(new
+ JahiaSearchResultHandlerImpl());
+ }
+ engineMap.put ("searchResults", searchResults);
}
+ /* Old Search navigation compatibility */
if (jParams.getRequest ().getParameter ("from") != null) {
engineMap.put ("searchResultFrom",
Integer.valueOf (jParams.getRequest ().getParameter
("from")));
@@ -184,17 +264,6 @@
engineMap.put ("searchResultFrom", new Integer (1));
}
- String searchString = (String) engineMap.get ("searchString");
- if (searchString == null) {
- searchString = jParams.getRequest ().getParameter ("search");
- }
-
- if (searchString == null) {
- searchString = EMPTY_STRING;
- } else {
- searchString = searchString.trim ();
- }
-
Integer searchFrom = ((Integer) engineMap.get ("searchResultFrom"));
if (searchFrom == null) {
if (jParams.getRequest ().getParameter ("from") != null) {
@@ -245,42 +314,34 @@
showStr + "&screen=next&search=" + searchString +
"&from=" +
searchFrom.intValue ()));
- // execute the search (called the 1st time)
- engineMap.put (ENGINE_OUTPUT_FILE_PARAM, theTemplate);
+ engineMap.put ("searchShow", searchShow);
- engineMap.put (RENDER_TYPE_PARAM, new Integer
(JahiaEngine.RENDERTYPE_FORWARD));
- engineMap.put (ENGINE_NAME_PARAM, ENGINE_NAME);
- engineMap.put (ENGINE_URL_PARAM, jParams.composeEngineUrl
(ENGINE_NAME, EMPTY_STRING));
- engineMap.put ("jahiaBuild", new Integer (jParams.settings
().getBuildNumber ()));
- engineMap.put ("javascriptUrl", jParams.settings
().getJsHttpPath ());
-
- jParams.getRequest ().setAttribute ("engineMap", engineMap);
-
- ArrayList languageCodes = new ArrayList ();
- String[] languageCodesVal = jParams.getRequest
().getParameterValues ("searchlang");
- if (languageCodesVal != null) {
- if (!JahiaTools.inValues (Search_Engine.SEARCH_ALL_LANG,
languageCodesVal)) {
- for (int i = 0; i < languageCodesVal.length; i++) {
- languageCodes.add (languageCodesVal[i]);
- }
- }
- } else {
- languageCodes.add (jParams.getLocale ().toString ());
- }
+ /** End Old search navigation compatibility **/
+ }
- //logger.debug ("Searchstring: "+searchString);
- JahiaSearchResult searchResults = null;
- if ( theScreen.equals("execute") || engineMap.get("searchResults")
== null ){
- searchResults = ServicesRegistry
- .getInstance ().getJahiaSearchService ()
- .doSearch (searchString, jParams, languageCodes);
+ /**
+ * Returns a search hanlder , given the config name.
+ *
+ * @param name
+ * @return
+ */
+ public SearchHandler getSearchHandler(String name) throws Exception {
+
+ if ( name == null ){
+ return null;
}
- if (searchResults == null) {
- searchResults = new JahiaSearchResult(new
- JahiaSearchResultHandlerImpl());
- }
- engineMap.put ("searchShow", searchShow);
- engineMap.put ("searchResults", searchResults);
- engineMap.put ("searchString", searchString);
+ BeanFactory bf = org.jahia.bin.Jahia.getConfigBeanFactory();
+ Properties settings = (Properties)bf.getBean("searchConfig");
+ if ( settings == null ){
+ return null;
+ }
+ String className = settings.getProperty(name);
+ if ( className != null ){
+ Class c = Class.forName(className);
+ return (SearchHandler)c.newInstance();
}
+ return null;
}
+
+
+}