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;

+    }

+}