package wicket.contrib.woogle;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import wicket.IRequestTarget;
import wicket.PageParameters;
import wicket.contrib.woogle.pages.SearchPage;
import wicket.request.RequestParameters;
import wicket.request.target.coding.IRequestTargetUrlCodingStrategy;
import wicket.request.target.component.BookmarkablePageRequestTarget;
import wicket.request.target.component.PageRequestTarget;
import wicket.util.string.Strings;
public class SearchUrlCodingStrategy implements IRequestTargetUrlCodingStrategy {
private static final Log log = LogFactory
.getLog(SearchUrlCodingStrategy.class);
public IRequestTarget decode(RequestParameters requestParameters) {
IRequestTarget target = null;
String path = requestParameters.getPath();
Pattern pat = Pattern.compile("^\\/q\\/([^\\/]+)(\\/([0-9]+)|)$");
Matcher mat = pat.matcher(path);
if (mat.matches()) {
String search = mat.group(1);
String page = mat.group(3);
PageParameters parameters = new PageParameters();
parameters.add("search", search);
parameters.add("page", page);
SearchPage searchPage = new SearchPage(parameters);
target = new PageRequestTarget(searchPage);
}
return target;
}
public CharSequence encode(IRequestTarget requestTarget) {
StringBuffer buffer = new StringBuffer();
if (requestTarget instanceof BookmarkablePageRequestTarget) {
BookmarkablePageRequestTarget target = (BookmarkablePageRequestTarget) requestTarget;
PageParameters pageParameters = target.getPageParameters();
String search = pageParameters.getString("search");
String page = pageParameters.getString("page");
buffer.append("/q/");
try {
String[] pierces = search.split(" ");
for (String pierce : pierces) {
if (buffer.length() > 3) {
buffer.append("%20");
}
buffer.append(URLEncoder.encode(pierce, "UTF-8"));
}
} catch (UnsupportedEncodingException e) {
log.fatal("Choose a different encoding", e);
}
if (Strings.isEmpty(page) == false) {
if (page.equals("0") == false && page.equals("1") == false) {
buffer.append("/");
buffer.append(page);
}
}
}
return buffer.toString();
}
public boolean matches(IRequestTarget requestTarget) {
boolean matches = false;
if (requestTarget instanceof BookmarkablePageRequestTarget) {
BookmarkablePageRequestTarget target = (BookmarkablePageRequestTarget) requestTarget;
PageParameters pp = target.getPageParameters();
if (SearchPage.class.equals(target.getPageClass())) {
if (pp.getString("search") != null) {
matches = true;
}
}
}
return matches;
}
}