Ecma6 Migration: logout login html/js migration
diff --git a/org.eclipse.scout.migration.ecma6/src/main/java/org/eclipse/scout/migration/ecma6/task/T200_IndexHtmlScriptTags.java b/org.eclipse.scout.migration.ecma6/src/main/java/org/eclipse/scout/migration/ecma6/task/T200_HtmlScriptTags.java
similarity index 80%
rename from org.eclipse.scout.migration.ecma6/src/main/java/org/eclipse/scout/migration/ecma6/task/T200_IndexHtmlScriptTags.java
rename to org.eclipse.scout.migration.ecma6/src/main/java/org/eclipse/scout/migration/ecma6/task/T200_HtmlScriptTags.java
index c01fc3e..267d2c1 100644
--- a/org.eclipse.scout.migration.ecma6/src/main/java/org/eclipse/scout/migration/ecma6/task/T200_IndexHtmlScriptTags.java
+++ b/org.eclipse.scout.migration.ecma6/src/main/java/org/eclipse/scout/migration/ecma6/task/T200_HtmlScriptTags.java
@@ -1,14 +1,13 @@
 package org.eclipse.scout.migration.ecma6.task;
 
-import java.nio.file.Paths;
+import java.nio.file.FileSystems;
+import java.nio.file.PathMatcher;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.function.Predicate;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import org.eclipse.scout.migration.ecma6.MigrationUtility;
-import org.eclipse.scout.migration.ecma6.PathFilters;
 import org.eclipse.scout.migration.ecma6.PathInfo;
 import org.eclipse.scout.migration.ecma6.WorkingCopy;
 import org.eclipse.scout.migration.ecma6.context.AppNameContextProperty;
@@ -22,27 +21,31 @@
 import org.slf4j.LoggerFactory;
 
 @Order(200)
-public class T200_IndexHtmlScriptTags extends AbstractTask {
-  private static final Logger LOG = LoggerFactory.getLogger(T200_IndexHtmlScriptTags.class);
+public class T200_HtmlScriptTags extends AbstractTask {
+  private static final Logger LOG = LoggerFactory.getLogger(T200_HtmlScriptTags.class);
+
+  private static PathMatcher FILE_MATCHER = FileSystems.getDefault().getPathMatcher("glob:src/main/resources/WebContent/{index,login,logout}.html");
 
   private static Pattern END_BODY_REGEX = Pattern.compile("(\\s*)\\<\\/body\\>");
 
-  private Predicate<PathInfo> m_indexJsFilter = PathFilters.oneOf(Paths.get("src/main/resources/WebContent/index.html"));
-
   private String m_newLineAndIndet;
   private List<String> m_scriptsMoveToBody = new ArrayList<>();
 
   @Override
   public boolean accept(PathInfo pathInfo, Context context) {
-    return m_indexJsFilter.test(pathInfo);
+    return FILE_MATCHER.matches(pathInfo.getModuleRelativePath());
   }
 
   @Override
   public void process(PathInfo pathInfo, Context context) {
+    String appJsFileName = pathInfo.getPath().getFileName().toString().replaceAll("\\.html\\Z", "");
+    if ("index".equalsIgnoreCase(appJsFileName)) {
+      appJsFileName = context.getProperty(AppNameContextProperty.class);
+    }
     WorkingCopy workingCopy = context.ensureWorkingCopy(pathInfo.getPath());
     m_newLineAndIndet = workingCopy.getLineDelimiter() + "    ";
     removeScriptElements(workingCopy);
-    addScriptElements(workingCopy, context);
+    addScriptElements(workingCopy, appJsFileName, context);
   }
 
   private void removeScriptElements(WorkingCopy workingCopy) {
@@ -79,7 +82,7 @@
     return source;
   }
 
-  private void addScriptElements(WorkingCopy workingCopy, Context context) {
+  private void addScriptElements(WorkingCopy workingCopy, String appJsFileName, Context context) {
     String source = workingCopy.getSource();
     Matcher matcher = END_BODY_REGEX.matcher(source);
     if (matcher.find()) {
@@ -91,7 +94,7 @@
           .append(m_newLineAndIndet)
           .append("<scout:script src=\"eclipse-scout.js\" />")
           .append(m_newLineAndIndet)
-          .append("<scout:script src=\"").append(context.getProperty(AppNameContextProperty.class)).append(".js\" />");
+          .append("<scout:script src=\"").append(appJsFileName).append(".js\" />");
       for (String scriptElement : m_scriptsMoveToBody) {
         scriptBuilder.append(m_newLineAndIndet)
             .append(scriptElement);
@@ -105,7 +108,7 @@
     else {
       MigrationUtility.prependTodo(workingCopy, "add script imports: <scout:script src=\"jquery.js\" /> " +
           "<scout:script src=\"eclipse-scout.js\" /> " +
-          "<scout:script src=\"jswidgets.js\" />");
+          "<scout:script src=\"" + appJsFileName + ".js\" />");
     }
   }
 }
diff --git a/org.eclipse.scout.migration.ecma6/src/main/java/org/eclipse/scout/migration/ecma6/task/T300_IndexHtmlStylesheetTags.java b/org.eclipse.scout.migration.ecma6/src/main/java/org/eclipse/scout/migration/ecma6/task/T300_HtmlStylesheetTags.java
similarity index 90%
rename from org.eclipse.scout.migration.ecma6/src/main/java/org/eclipse/scout/migration/ecma6/task/T300_IndexHtmlStylesheetTags.java
rename to org.eclipse.scout.migration.ecma6/src/main/java/org/eclipse/scout/migration/ecma6/task/T300_HtmlStylesheetTags.java
index 117ec25..d123427 100644
--- a/org.eclipse.scout.migration.ecma6/src/main/java/org/eclipse/scout/migration/ecma6/task/T300_IndexHtmlStylesheetTags.java
+++ b/org.eclipse.scout.migration.ecma6/src/main/java/org/eclipse/scout/migration/ecma6/task/T300_HtmlStylesheetTags.java
@@ -1,5 +1,7 @@
 package org.eclipse.scout.migration.ecma6.task;
 
+import java.nio.file.FileSystems;
+import java.nio.file.PathMatcher;
 import java.nio.file.Paths;
 import java.util.Set;
 import java.util.function.Predicate;
@@ -22,15 +24,16 @@
 import org.slf4j.LoggerFactory;
 
 @Order(300)
-public class T300_IndexHtmlStylesheetTags extends AbstractTask {
-  private static final Logger LOG = LoggerFactory.getLogger(T300_IndexHtmlStylesheetTags.class);
+public class T300_HtmlStylesheetTags extends AbstractTask {
+  private static final Logger LOG = LoggerFactory.getLogger(T300_HtmlStylesheetTags.class);
 
+  private static PathMatcher FILE_MATCHER = FileSystems.getDefault().getPathMatcher("glob:src/main/resources/WebContent/{index,login,logout}.html");
   private Predicate<PathInfo> m_fileFilter = PathFilters.oneOf(Paths.get("src/main/resources/WebContent/index.html"));
-  private Set<String> m_stylesheetsToRemove = CollectionUtility.hashSet("res/libs-all-macro.less");
+  private Set<String> m_stylesheetsToRemove = CollectionUtility.hashSet("res/libs-all-macro.less", "res/scout-login-module.less", "res/scout-logout-module.less");
 
   @Override
   public boolean accept(PathInfo pathInfo, Context context) {
-    return m_fileFilter.test(pathInfo);
+    return FILE_MATCHER.matches(pathInfo.getModuleRelativePath());
   }
 
   @Override
diff --git a/org.eclipse.scout.migration.ecma6/src/main/java/org/eclipse/scout/migration/ecma6/task/T400_IndexHtmlIncludeHead.java b/org.eclipse.scout.migration.ecma6/src/main/java/org/eclipse/scout/migration/ecma6/task/T400_HtmlIncludeHead.java
similarity index 84%
rename from org.eclipse.scout.migration.ecma6/src/main/java/org/eclipse/scout/migration/ecma6/task/T400_IndexHtmlIncludeHead.java
rename to org.eclipse.scout.migration.ecma6/src/main/java/org/eclipse/scout/migration/ecma6/task/T400_HtmlIncludeHead.java
index 67a5415..62f1df0 100644
--- a/org.eclipse.scout.migration.ecma6/src/main/java/org/eclipse/scout/migration/ecma6/task/T400_IndexHtmlIncludeHead.java
+++ b/org.eclipse.scout.migration.ecma6/src/main/java/org/eclipse/scout/migration/ecma6/task/T400_HtmlIncludeHead.java
@@ -1,12 +1,11 @@
 package org.eclipse.scout.migration.ecma6.task;
 
-import java.nio.file.Paths;
+import java.nio.file.FileSystems;
+import java.nio.file.PathMatcher;
 import java.util.List;
-import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
 import org.eclipse.scout.migration.ecma6.MigrationUtility;
-import org.eclipse.scout.migration.ecma6.PathFilters;
 import org.eclipse.scout.migration.ecma6.PathInfo;
 import org.eclipse.scout.migration.ecma6.WorkingCopy;
 import org.eclipse.scout.migration.ecma6.context.Context;
@@ -19,14 +18,14 @@
 import org.slf4j.LoggerFactory;
 
 @Order(400)
-public class T400_IndexHtmlIncludeHead extends AbstractTask {
-  private static final Logger LOG = LoggerFactory.getLogger(T400_IndexHtmlIncludeHead.class);
+public class T400_HtmlIncludeHead extends AbstractTask {
+  private static final Logger LOG = LoggerFactory.getLogger(T400_HtmlIncludeHead.class);
 
-  private Predicate<PathInfo> m_pathFilter = PathFilters.oneOf(Paths.get("src/main/resources/WebContent/index.html"));
+  private static PathMatcher FILE_MATCHER = FileSystems.getDefault().getPathMatcher("glob:src/main/resources/WebContent/{index,login,logout}.html");
 
   @Override
   public boolean accept(PathInfo pathInfo, Context context) {
-    return m_pathFilter.test(pathInfo);
+    return FILE_MATCHER.matches(pathInfo.getModuleRelativePath());
   }
 
   @Override
diff --git a/org.eclipse.scout.migration.ecma6/src/main/java/org/eclipse/scout/migration/ecma6/task/T40100_JsApp.java b/org.eclipse.scout.migration.ecma6/src/main/java/org/eclipse/scout/migration/ecma6/task/T40100_JsApps.java
similarity index 72%
rename from org.eclipse.scout.migration.ecma6/src/main/java/org/eclipse/scout/migration/ecma6/task/T40100_JsApp.java
rename to org.eclipse.scout.migration.ecma6/src/main/java/org/eclipse/scout/migration/ecma6/task/T40100_JsApps.java
index 9d72c07..52fc2b7 100644
--- a/org.eclipse.scout.migration.ecma6/src/main/java/org/eclipse/scout/migration/ecma6/task/T40100_JsApp.java
+++ b/org.eclipse.scout.migration.ecma6/src/main/java/org/eclipse/scout/migration/ecma6/task/T40100_JsApps.java
@@ -15,6 +15,9 @@
 import java.nio.file.Files;
 import java.nio.file.PathMatcher;
 import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
 
 import org.eclipse.scout.migration.ecma6.MigrationUtility;
 import org.eclipse.scout.migration.ecma6.PathInfo;
@@ -29,10 +32,17 @@
 import org.slf4j.LoggerFactory;
 
 @Order(40100)
-public class T40100_JsApp extends AbstractTask {
-  private static final Logger LOG = LoggerFactory.getLogger(T40100_JsApp.class);
+public class T40100_JsApps extends AbstractTask {
+  private static final Logger LOG = LoggerFactory.getLogger(T40100_JsApps.class);
 
-  private static PathMatcher MACRO_MATCHER = FileSystems.getDefault().getPathMatcher("glob:src/main/resources/WebContent/res/index.js");
+  private static PathMatcher MACRO_MATCHER = FileSystems.getDefault().getPathMatcher("glob:src/main/resources/WebContent/res/{index,login,logout}.js");
+  private static final Map<String /*fqn*/, String /*simpleName*/> APP_NAMES = new HashMap<>();
+  static {
+    APP_NAMES.put("scout.App", "App");
+    APP_NAMES.put("scout.RemoteApp", "RemoteApp");
+    APP_NAMES.put("scout.LoginApp", "LoginApp");
+    APP_NAMES.put("scout.LogoutApp", "LogoutApp");
+  }
 
   @Override
   public boolean accept(PathInfo pathInfo, Context context) {
@@ -41,7 +51,11 @@
 
   @Override
   public void process(PathInfo pathInfo, Context context) {
-    final WorkingCopy appJsWc = context.ensureWorkingCopy(Configuration.get().getTargetModuleDirectory().resolve(Paths.get("src/main/js", Configuration.get().getNamespace() + ".js")), true);
+    String targetFileName = pathInfo.getPath().getFileName().toString().replaceAll("\\.js\\Z", "");
+    if ("index".equalsIgnoreCase(targetFileName)) {
+      targetFileName = Configuration.get().getNamespace();
+    }
+    final WorkingCopy appJsWc = context.ensureWorkingCopy(Configuration.get().getTargetModuleDirectory().resolve(Paths.get("src/main/js", targetFileName + ".js")), true);
     final JsFile appJsFile = context.ensureJsFile(appJsWc, false);
 
     final WorkingCopy indexWc = context.ensureWorkingCopy(pathInfo.getPath());
@@ -52,18 +66,27 @@
     // create import for app
     StringBuilder appSourceBuilder = new StringBuilder(appJsWc.getSource());
     appSourceBuilder.append(appJsWc.getLineDelimiter()).append(appJsWc.getLineDelimiter());
-    if (indexSource.contains("scout.RemoteApp")) {
-      indexSource = indexSource.replace("scout.RemoteApp", "RemoteApp");
+
+    Entry<String, String> appMapping = null;
+    for (Entry<String, String> e : APP_NAMES.entrySet()) {
+      if (indexSource.contains(e.getKey())) {
+        appMapping = e;
+        break;
+      }
+    }
+
+    if (appMapping != null) {
+      indexSource = indexSource.replace(appMapping.getKey(), appMapping.getValue());
       JsImport imp = appJsFile.getImport("@eclipse-scout/core");
       if (imp == null) {
         imp = new JsImport("@eclipse-scout/core");
-        imp.addMember(new AliasedMember("RemoteApp"));
+        imp.addMember(new AliasedMember(appMapping.getValue()));
         appJsFile.addImport(imp);
       }
       else {
         appSourceBuilder = new StringBuilder(appSourceBuilder.toString().replace("ref1, ", ""));
         imp.setDefaultMember(null);
-        imp.addMember(new AliasedMember("RemoteApp"));
+        imp.addMember(new AliasedMember(appMapping.getValue()));
       }
     }
     else {
diff --git a/org.eclipse.scout.migration.ecma6/src/main/java/org/eclipse/scout/migration/ecma6/task/pre/T100_CopySourceTargetTask.java b/org.eclipse.scout.migration.ecma6/src/main/java/org/eclipse/scout/migration/ecma6/task/pre/T100_CopySourceTargetTask.java
index 5e0ecc5..4ad04f0 100644
--- a/org.eclipse.scout.migration.ecma6/src/main/java/org/eclipse/scout/migration/ecma6/task/pre/T100_CopySourceTargetTask.java
+++ b/org.eclipse.scout.migration.ecma6/src/main/java/org/eclipse/scout/migration/ecma6/task/pre/T100_CopySourceTargetTask.java
@@ -19,7 +19,7 @@
 
 import org.eclipse.scout.migration.ecma6.configuration.Configuration;
 import org.eclipse.scout.migration.ecma6.context.Context;
-import org.eclipse.scout.migration.ecma6.task.T200_IndexHtmlScriptTags;
+import org.eclipse.scout.migration.ecma6.task.T200_HtmlScriptTags;
 import org.eclipse.scout.rt.platform.Order;
 import org.eclipse.scout.rt.platform.exception.ProcessingException;
 import org.eclipse.scout.rt.platform.util.ObjectUtility;
@@ -28,7 +28,7 @@
 
 @Order(100)
 public class T100_CopySourceTargetTask implements IPreMigrationTask {
-  private static final Logger LOG = LoggerFactory.getLogger(T200_IndexHtmlScriptTags.class);
+  private static final Logger LOG = LoggerFactory.getLogger(T200_HtmlScriptTags.class);
 
   @Override
   public void execute(Context context) {