Add MoinUserLinkConverter. Converts links to MoinMoin users (WikiNames to user
names in page content) into links / mentions in Confluence (i.e. [~username])
diff --git a/src/main/java/com/atlassian/uwc/converters/moinmoin/MoinUserLinkConverter.java b/src/main/java/com/atlassian/uwc/converters/moinmoin/MoinUserLinkConverter.java
new file mode 100644
index 0000000..392416a
--- /dev/null
+++ b/src/main/java/com/atlassian/uwc/converters/moinmoin/MoinUserLinkConverter.java
@@ -0,0 +1,102 @@
+package com.atlassian.uwc.converters.moinmoin;
+
+import com.atlassian.uwc.converters.BaseConverter;
+import com.atlassian.uwc.ui.FileUtils;
+import com.atlassian.uwc.ui.Page;
+
+import java.io.File;
+import java.nio.charset.Charset;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Converts links to MoinMoin users (i.e. WikiNames to user names in page content)
+ * into links / mentions in Confluence (i.e. [~username])
+ */
+public class MoinUserLinkConverter extends BaseConverter {
+ private static final Charset charset = Charset.defaultCharset();
+ private static final String USERS_PATH_PROPERTY = "userlink-converter-users-path";
+ private static final Pattern WIKI_NAME_PATTERN = Pattern.compile("(^|\\s|/)([A-Z][a-z]+[A-Z][\\w]+)");
+
+ private Map<String, String> origNameToUserId;
+
+ @Override
+ public void setProperties(Properties properties) {
+ super.setProperties(properties);
+ // After receiving the properties, we can build the origNameToUserId mapping, if the users-path is set.
+ String userFileDir = (String) properties.get(USERS_PATH_PROPERTY);
+ if (userFileDir != null) {
+ origNameToUserId = getOrigNameToUserIdMapping(userFileDir);
+ }
+ }
+
+ @Override
+ public void convert(Page page) {
+ String input = page.getOriginalText();
+
+ Matcher wikiNameFinder = WIKI_NAME_PATTERN.matcher(input);
+ StringBuffer sb = new StringBuffer();
+ boolean found = false;
+ while (wikiNameFinder.find()) {
+ String wikiName = wikiNameFinder.group(2);
+ if (origNameToUserId.containsKey(wikiName)) {
+ found = true;
+ String prefix = wikiNameFinder.group(1);
+ String userId = origNameToUserId.get(wikiName);
+ if (userId != null) {
+ wikiNameFinder.appendReplacement(sb, prefix + "[~" + userId + "]");
+ } else {
+ // escape WikiName, so it doesn't become a link
+ wikiNameFinder.appendReplacement(sb, prefix + "!" + wikiName);
+ }
+ }
+ }
+
+ if (found) {
+ wikiNameFinder.appendTail(sb);
+ page.setConvertedText(sb.toString());
+ } else {
+ page.setConvertedText(input);
+ }
+
+ }
+
+ private Map<String, String> getOrigNameToUserIdMapping(String userFileDir) {
+ Map<String, String> res = new HashMap<String, String>();
+
+ Pattern origNameFinder = Pattern.compile("^origname=(\\S+)", Pattern.MULTILINE);
+ Pattern userIdFinder = Pattern.compile("^name=(\\S+)", Pattern.MULTILINE);
+
+ try{
+ File userdir = new File(userFileDir);
+ File[] userFiles = userdir.listFiles();
+ if (userFiles != null) {
+ for( File f : userFiles){
+
+ // leave directories out
+ if( f.isDirectory() ) continue;
+
+ String cont = FileUtils.readTextFile(f, charset);
+ Matcher origNameMatcher = origNameFinder.matcher(cont);
+ if (origNameMatcher.find()){
+ String origName = origNameMatcher.group(1);
+ Matcher userIdMatcher = userIdFinder.matcher(cont);
+ if (userIdMatcher.find()) {
+ res.put(origName, userIdMatcher.group(1));
+ } else {
+ res.put(origName, null);
+ }
+ }
+
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ return res;
+ }
+}