package br.com.caelum.guj.uri;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import br.com.caelum.guj.view.Slugger;
import br.com.caelum.vraptor.ioc.Component;
@Component
public class DefaultBookmarkableURIBuilder implements BookmarkableURIBuilder {
private final Slugger slugger;
public DefaultBookmarkableURIBuilder(Slugger slugger) {
this.slugger = slugger;
}
private StringBuilder concatPageToURL(StringBuilder sb, int pageNumber) {
if (pageNumber > 1) {
sb.append("/").append(pageNumber);
}
return sb;
}
@Override
public String bookmarkableURL(int topicId, String title, int pageNumber) {
StringBuilder url = new StringBuilder("/java/").append(topicId).append("-")
.append(this.slugger.sluggerize(title));
return concatPageToURL(url, pageNumber).toString();
}
@Override
public String bookmarkableURL(int topicId, String title, int pageNumber, String anchor) {
StringBuilder url = new StringBuilder("/java/").append(topicId).append("-")
.append(this.slugger.sluggerize(title));
this.concatPageToURL(url, pageNumber);
url.append("#").append(anchor);
return url.toString();
}
@Override
public String bookmarkablePrePostURL(int topicId, int postId, String topicTitle) {
StringBuilder url = new StringBuilder("/prepost/").append(topicId).append("/")
.append(postId).append("/").append(this.slugger.sluggerize(topicTitle));
return url.toString();
}
@Override
public String bookmarkableURL(int topicId, String title) {
StringBuilder url = new StringBuilder("/java/").append(topicId).append("-")
.append(this.slugger.sluggerize(title));
return url.toString();
}
@Override
public String bookmarkableCompletePrePostURL(String originalURI, String topicTitle) {
Map<String, String> infos = this.extractURIInformation(originalURI);
if (!infos.isEmpty()) {
return this.mountCompleteURI(topicTitle, infos);
}
return originalURI;
}
private String mountCompleteURI(String topicTitle, Map<String, String> infos) {
int topicId = Integer.parseInt(infos.get("topicId"));
int postId = Integer.parseInt(infos.get("postId"));
return infos.get("baseURL") + this.bookmarkablePrePostURL(topicId, postId, topicTitle);
}
private Map<String, String> extractURIInformation(String completeURI) {
Map<String, String> infos = new HashMap<String, String>();
Pattern pattern = Pattern.compile("([\\S]+)/posts/preList/([0-9]+)/([0-9]+).java");
Matcher matcher = pattern.matcher(completeURI);
if (matcher.find()) {
infos.put("topicId", matcher.group(2));
infos.put("postId", matcher.group(3));
infos.put("baseURL", matcher.group(1));
}
return infos;
}
}