Umlaute in der Suche werden jetzt beim Seitewechsel übergeben (Ticket #1069)

git-svn-id: https://svn.libreccm.org/ccm/trunk@1604 8810af33-2d31-482b-a856-94f89814c4df
master
jensp 2012-04-18 11:05:07 +00:00
parent b5fcd9efe8
commit 1430a1b1bb
3 changed files with 87 additions and 35 deletions

View File

@ -18,13 +18,13 @@
*/ */
package com.arsdigita.globalization; package com.arsdigita.globalization;
import com.arsdigita.dispatcher.DispatcherHelper;
import com.arsdigita.dispatcher.RequestContext;
import com.arsdigita.kernel.Kernel;
import com.arsdigita.persistence.DataCollection; import com.arsdigita.persistence.DataCollection;
import com.arsdigita.persistence.Session; import com.arsdigita.persistence.Session;
import com.arsdigita.persistence.SessionManager; import com.arsdigita.persistence.SessionManager;
import com.arsdigita.persistence.TransactionContext; import com.arsdigita.persistence.TransactionContext;
import com.arsdigita.dispatcher.DispatcherHelper;
import com.arsdigita.dispatcher.RequestContext;
import com.arsdigita.kernel.Kernel;
import com.arsdigita.util.Assert; import com.arsdigita.util.Assert;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.text.MessageFormat; import java.text.MessageFormat;

View File

@ -27,6 +27,7 @@ import com.arsdigita.bebop.Form;
import com.arsdigita.bebop.FormModel; import com.arsdigita.bebop.FormModel;
import com.arsdigita.bebop.FormData; import com.arsdigita.bebop.FormData;
import com.arsdigita.bebop.parameters.ParameterData; import com.arsdigita.bebop.parameters.ParameterData;
import com.arsdigita.globalization.Globalization;
import com.arsdigita.xml.Element; import com.arsdigita.xml.Element;
import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.globalization.GlobalizedMessage;
@ -126,7 +127,9 @@ public class BaseQueryComponent extends QueryComponent {
Element terms = Search.newElement("terms"); Element terms = Search.newElement("terms");
terms.addAttribute("param", m_terms.getName()); terms.addAttribute("param", m_terms.getName());
terms.addAttribute("value", getTerms(state)); terms.addAttribute("value",
Globalization.decodeParameter(state.getRequest(),
m_terms.getName()));
generateErrorXML(state, terms); generateErrorXML(state, terms);
content.addContent(terms); content.addContent(terms);

View File

@ -21,6 +21,7 @@ package com.arsdigita.search.ui;
import com.arsdigita.bebop.SimpleComponent; import com.arsdigita.bebop.SimpleComponent;
import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.parameters.IntegerParameter; import com.arsdigita.bebop.parameters.IntegerParameter;
import com.arsdigita.globalization.Globalization;
import com.arsdigita.kernel.Party; import com.arsdigita.kernel.Party;
import com.arsdigita.xml.Element; import com.arsdigita.xml.Element;
@ -34,6 +35,7 @@ import com.arsdigita.search.ResultSet;
import com.arsdigita.web.URL; import com.arsdigita.web.URL;
import com.arsdigita.web.ParameterMap; import com.arsdigita.web.ParameterMap;
import com.arsdigita.web.Web; import com.arsdigita.web.Web;
import java.io.UnsupportedEncodingException;
import java.util.Date; import java.util.Date;
import java.util.Iterator; import java.util.Iterator;
@ -63,7 +65,7 @@ public class ResultsPane extends SimpleComponent {
} }
public ResultsPane(QueryGenerator query, public ResultsPane(QueryGenerator query,
String engine) { String engine) {
m_query = query; m_query = query;
m_engine = engine; m_engine = engine;
m_pageNumber = new IntegerParameter("page"); m_pageNumber = new IntegerParameter("page");
@ -83,20 +85,23 @@ public class ResultsPane extends SimpleComponent {
ResultSet resultSet = null; ResultSet resultSet = null;
try { try {
resultSet = m_engine == null resultSet = m_engine == null
? Search.process(spec) ? Search.process(spec)
: Search.process(spec, Search.DEFAULT_RESULT_CACHE, m_engine); : Search.process(spec, Search.DEFAULT_RESULT_CACHE,
m_engine);
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {
s_log.debug("Got result set " + resultSet.getClass() s_log.debug("Got result set " + resultSet.getClass()
+ " count: " + resultSet.getCount()); + " count: " + resultSet.getCount());
} }
if (resultSet.getCount() > 0) { if (resultSet.getCount() > 0) {
Integer page = (Integer) m_pageNumber.transformValue(state.getRequest()); Integer page = (Integer) m_pageNumber.transformValue(state.
getRequest());
int pageNumber = (page == null ? 1 : page.intValue()); int pageNumber = (page == null ? 1 : page.intValue());
long objectCount = resultSet.getCount(); long objectCount = resultSet.getCount();
int pageCount = (int) Math.ceil((double) objectCount / (double) m_pageSize); int pageCount = (int) Math.ceil((double) objectCount
/ (double) m_pageSize);
if (pageNumber < 1) { if (pageNumber < 1) {
pageNumber = 1; pageNumber = 1;
@ -117,16 +122,17 @@ public class ResultsPane extends SimpleComponent {
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {
s_log.debug("Paginator stats\n page number:" + pageNumber s_log.debug("Paginator stats\n page number:" + pageNumber
+ "\n page count: " + pageCount + "\n page size: " + "\n page count: " + pageCount
+ m_pageSize + "\n start " + begin + "\n end: " + "\n page size: "
+ end + "\n count: " + objectCount); + m_pageSize + "\n start " + begin + "\n end: "
+ end + "\n count: " + objectCount);
} }
content.addContent(generatePaginatorXML(state, content.addContent(generatePaginatorXML(state,
m_pageNumber.getName(), m_pageNumber.getName(),
pageNumber, pageCount, pageNumber, pageCount,
m_pageSize, begin, end, m_pageSize, begin, end,
objectCount)); objectCount));
content.addContent(generateDocumentsXML(state, results)); content.addContent(generateDocumentsXML(state, results));
parent.addContent(content); parent.addContent(content);
@ -158,13 +164,13 @@ public class ResultsPane extends SimpleComponent {
} }
protected Element generatePaginatorXML(PageState state, protected Element generatePaginatorXML(PageState state,
String pageParam, String pageParam,
int pageNumber, int pageNumber,
int pageCount, int pageCount,
int pageSize, int pageSize,
long begin, long begin,
long end, long end,
long objectCount) { long objectCount) {
Element paginator = Search.newElement("paginator"); Element paginator = Search.newElement("paginator");
URL url = Web.getContext().getRequestURL(); URL url = Web.getContext().getRequestURL();
@ -175,11 +181,15 @@ public class ResultsPane extends SimpleComponent {
if (key.equals(pageParam)) { if (key.equals(pageParam)) {
continue; continue;
} }
map.setParameterValues(key, url.getParameterValues(key)); //map.setParameterValues(key, url.getParameterValues(key));
map.setParameterValues(key,
decodeParameters(url.getParameterValues(key),
state));
} }
paginator.addAttribute("pageParam", m_pageNumber.getName()); paginator.addAttribute("pageParam", m_pageNumber.getName());
paginator.addAttribute("baseURL", URL.there(url.getPathInfo(), map).toString()); paginator.addAttribute("baseURL", URL.there(url.getPathInfo(), map).
toString());
paginator.addAttribute("pageNumber", XML.format(new Integer(pageNumber))); paginator.addAttribute("pageNumber", XML.format(new Integer(pageNumber)));
paginator.addAttribute("pageCount", XML.format(new Integer(pageCount))); paginator.addAttribute("pageCount", XML.format(new Integer(pageCount)));
paginator.addAttribute("pageSize", XML.format(new Integer(pageSize))); paginator.addAttribute("pageSize", XML.format(new Integer(pageSize)));
@ -189,8 +199,42 @@ public class ResultsPane extends SimpleComponent {
return paginator; return paginator;
} }
private String[] decodeParameters(final String[] parameters,
final PageState state) {
final String[] decoded = new String[parameters.length];
for (int i = 0; i < parameters.length; i++) {
decoded[i] = decodeParameter(parameters[i], state);
}
return decoded;
}
private String decodeParameter(final String parameter,
final PageState state) {
String re = state.getRequest().getParameter(Globalization.ENCODING_PARAM_NAME);
if ((re == null) || (re.isEmpty())) {
re = Globalization.getDefaultCharset();
}
if ((parameter == null) || (parameter.isEmpty())) {
return parameter;
} else if(Globalization.getDefaultCharset(state.getRequest()).equals(re)) {
return parameter;
} else {
try {
return new String(parameter.getBytes(Globalization.getDefaultCharset(
state.getRequest())), re);
} catch(UnsupportedEncodingException ex) {
s_log.warn("Unsupported encoding.", ex);
return parameter;
}
}
}
protected Element generateDocumentsXML(PageState state, protected Element generateDocumentsXML(PageState state,
Iterator results) { Iterator results) {
Element documents = Search.newElement("documents"); Element documents = Search.newElement("documents");
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {
@ -208,7 +252,7 @@ public class ResultsPane extends SimpleComponent {
} }
protected Element generateDocumentXML(PageState state, protected Element generateDocumentXML(PageState state,
Document doc) { Document doc) {
Element entry = Search.newElement("object"); Element entry = Search.newElement("object");
String summary = doc.getSummary(); String summary = doc.getSummary();
@ -216,7 +260,9 @@ public class ResultsPane extends SimpleComponent {
java.net.URL url = doc.getURL(); java.net.URL url = doc.getURL();
entry.addAttribute("oid", XML.format(doc.getOID())); entry.addAttribute("oid", XML.format(doc.getOID()));
entry.addAttribute("url", XML.format(m_relative ? url.getPath() + "?" + url.getQuery() : url.toString())); entry.addAttribute("url", XML.format(m_relative ? url.getPath() + "?"
+ url.getQuery()
: url.toString()));
entry.addAttribute("score", XML.format(doc.getScore())); entry.addAttribute("score", XML.format(doc.getScore()));
entry.addAttribute("title", XML.format(doc.getTitle())); entry.addAttribute("title", XML.format(doc.getTitle()));
if (summary != null) { if (summary != null) {
@ -227,27 +273,30 @@ public class ResultsPane extends SimpleComponent {
Date creationDate = doc.getCreationDate(); Date creationDate = doc.getCreationDate();
if (creationDate != null) { if (creationDate != null) {
entry.addAttribute("creationDate", XML.format(creationDate.toString())); entry.addAttribute("creationDate", XML.format(
creationDate.toString()));
} }
Party creationParty = doc.getCreationParty(); Party creationParty = doc.getCreationParty();
if (creationParty != null) { if (creationParty != null) {
entry.addAttribute("creationParty", entry.addAttribute("creationParty",
XML.format(creationParty.getDisplayName())); XML.format(creationParty.getDisplayName()));
} }
Date lastModifiedDate = doc.getLastModifiedDate(); Date lastModifiedDate = doc.getLastModifiedDate();
if (lastModifiedDate != null) { if (lastModifiedDate != null) {
entry.addAttribute("lastModifiedDate", entry.addAttribute("lastModifiedDate",
XML.format(lastModifiedDate)); XML.format(lastModifiedDate));
} }
Party lastModifiedParty = doc.getLastModifiedParty(); Party lastModifiedParty = doc.getLastModifiedParty();
if (lastModifiedParty != null) { if (lastModifiedParty != null) {
entry.addAttribute("lastModifiedParty", entry.addAttribute("lastModifiedParty",
XML.format(lastModifiedParty.getDisplayName())); XML.format(lastModifiedParty.getDisplayName()));
} }
s_log.debug("about to add the contentSectionName from search index Doc to search result xml"); s_log.debug(
entry.addAttribute("contentSectionName", XML.format(doc.getContentSection())); "about to add the contentSectionName from search index Doc to search result xml");
entry.addAttribute("contentSectionName", XML.format(doc.
getContentSection()));
return entry; return entry;
} }