blob: e35b69ba469875bd00ed3efc79e81c494ae028f1 [file] [log] [blame]
package com.atlassian.uwc.converters.moinmoin;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.log4j.Logger;
import com.atlassian.uwc.converters.BaseConverter;
import com.atlassian.uwc.ui.Page;
public class MoinInfoConverter extends BaseConverter {
final Logger log = Logger.getLogger(this.getClass());
final Pattern date = Pattern.compile("\\{timestamp:([^}]*)\\}", Pattern.MULTILINE);
final Pattern username = Pattern.compile("\\{userid:([^}]*)\\}", Pattern.MULTILINE);
// Use reluctant quantifier for '.' in the revcomment, to be able to handle revcomments with curly braces inside
final Pattern revInfoPattern = Pattern.compile("\\{revcomment:(.*?)\\}\\n", Pattern.MULTILINE);
final Pattern catPattern = Pattern.compile("\\[{2}CategoryRoot\\/([^\\]]*)\\]{2}", Pattern.MULTILINE);
public MoinInfoConverter() {
log.debug("Loaded MoinInfoConverter" + this.toString());
}
public void convert(Page page) {
log.debug("Adding User and Date metadata - Starting");
String input = page.getOriginalText();
String username = getUser(input);
Date timestamp = getDate(input);
String revInfo = getRevinfo(input);
String converted = cleanUserDate(input);
addKeywords(input, page);
log.debug(String.format("Page: %s Author: %s timestamp: %s revinfo: %s ", page.getName(), username, timestamp, revInfo));
if (username != null) page.setAuthor(username);
if (timestamp != null) page.setTimestamp(timestamp);
// if (revInfo != null) page.set..... //XXX not possible to set the log here
page.setConvertedText(converted);
log.debug("Adding User and Date metadata - Complete");
}
private void addKeywords(String input, Page page) {
Matcher m = catPattern.matcher(input);
if(m.find()){
String x = m.group(1);
log.debug(String.format("Adding to Page %s labels: %s ", page.getName(), x));
for(String s : x.split("\\/")){
page.addLabel(s);
}
}
}
private String getRevinfo(String input) {
Matcher revFinder = revInfoPattern.matcher(input);
if (revFinder.find()){
return revFinder.group(1);
}
return null;
}
protected String getUser(String input) {
Matcher userFinder = username.matcher(input);
if (userFinder.find()) {
return userFinder.group(1);
}
return null;
}
protected Date getDate(String input) {
Matcher dateFinder = date.matcher(input);
if (dateFinder.find()) {
String timestamp = dateFinder.group(1);
DateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
try {
return dateFormat.parse(timestamp);
} catch (ParseException e) {
log.error("Couldn't format date: " + timestamp);
e.printStackTrace();
return null;
}
}
return null;
}
protected String cleanUserDate(String input) {
Matcher userFinder = username.matcher(input);
if (userFinder.find()) {
input = userFinder.replaceFirst("");
}
Matcher dateFinder = date.matcher(input);
if (dateFinder.find()) {
input = dateFinder.replaceFirst("");
}
Matcher x = revInfoPattern.matcher(input);
if(x.find()){
input = x.replaceFirst("");
}
return input;
}
}