Merge branch 'stable-2.11'

* stable-2.11:
  Create local user if user does not exist anymore in LDAP
  Fix Eclise warnings

Change-Id: I41ef115d484b45f715fbcb737dfb713c3a5c79d4
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/AccountUtil.java b/src/main/java/com/googlesource/gerrit/plugins/importer/AccountUtil.java
index fe76caf..e87ec1d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/AccountUtil.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/AccountUtil.java
@@ -17,27 +17,40 @@
 import com.google.gerrit.common.errors.NoSuchAccountException;
 import com.google.gerrit.extensions.common.AccountInfo;
 import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
 import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.AccountGroupMember;
+import com.google.gerrit.reviewdb.client.AccountGroupName;
 import com.google.gerrit.reviewdb.client.AccountSshKey;
 import com.google.gerrit.reviewdb.client.AuthType;
 import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.account.AccountCache;
 import com.google.gerrit.server.account.AccountException;
 import com.google.gerrit.server.account.AccountManager;
 import com.google.gerrit.server.account.AccountState;
 import com.google.gerrit.server.account.AuthRequest;
+import com.google.gerrit.server.account.CreateAccount;
 import com.google.gerrit.server.account.GetSshKeys.SshKeyInfo;
+import com.google.gerrit.server.account.GroupCache;
+import com.google.gerrit.server.account.GroupUUID;
 import com.google.gerrit.server.config.AuthConfig;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
 
+import org.eclipse.jgit.lib.PersonIdent;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Objects;
@@ -46,26 +59,42 @@
 class AccountUtil {
   private static Logger log = LoggerFactory.getLogger(AccountUtil.class);
 
+  private static final String IMPORTED_USERS = "Imported Users";
+  private static final AccountGroup.NameKey IMPORTED_USERS_NAME =
+      new AccountGroup.NameKey(IMPORTED_USERS);
+
   private final AccountCache accountCache;
   private final AccountManager accountManager;
   private final AuthType authType;
+  private final IdentifiedUser currentUser;
+  private final GroupCache groupCache;
+  private final PersonIdent serverIdent;
   private final Provider<ReviewDb> db;
 
   @Inject
+  private CreateAccount.Factory createAccountFactory;
+
+  @Inject
   public AccountUtil(
       AccountCache accountCache,
       AccountManager accountManager,
       AuthConfig authConfig,
+      GroupCache groupCache,
+      IdentifiedUser currentUser,
+      @GerritPersonIdent PersonIdent serverIdent,
       Provider<ReviewDb> db) {
     this.accountCache = accountCache;
     this.accountManager = accountManager;
     this.authType = authConfig.getAuthType();
+    this.currentUser = currentUser;
     this.db = db;
+    this.groupCache = groupCache;
+    this.serverIdent = serverIdent;
   }
 
   Account.Id resolveUser(GerritApi api, AccountInfo acc)
       throws NoSuchAccountException, BadRequestException, IOException,
-      OrmException {
+      OrmException, ResourceConflictException, UnprocessableEntityException {
     if (acc.username == null) {
       throw new NoSuchAccountException(String.format(
           "User %s <%s> (%s) doesn't have a username and cannot be looked up.",
@@ -80,8 +109,7 @@
         case LDAP:
           return createAccountByLdapAndAddSshKeys(api, acc);
         default:
-          throw new NoSuchAccountException(String.format("User %s not found",
-              acc.username));
+          return createLocalUser(acc);
       }
     }
     if (!Objects.equals(a.getAccount().getPreferredEmail(), acc.email)) {
@@ -89,14 +117,13 @@
           "Email mismatch for user %s: expected %s but found %s",
           acc.username, acc.email, a.getAccount().getPreferredEmail()));
     }
-
     return a.getAccount().getId();
   }
 
   private Account.Id createAccountByLdapAndAddSshKeys(GerritApi api,
-      AccountInfo acc)
-      throws NoSuchAccountException, BadRequestException, IOException,
-      OrmException {
+      AccountInfo acc) throws NoSuchAccountException, BadRequestException,
+      IOException, OrmException, ResourceConflictException,
+      UnprocessableEntityException {
     if (!acc.username.matches(Account.USER_NAME_PATTERN)) {
       throw new NoSuchAccountException(String.format("User %s not found",
           acc.username));
@@ -109,13 +136,12 @@
       addSshKeys(api, acc);
       return id;
     } catch (AccountException e) {
-      throw new NoSuchAccountException(
-          String.format("User %s not found", acc.username));
+      return createLocalUser(acc);
     }
   }
 
-  private void addSshKeys(GerritApi api, AccountInfo acc) throws
-  BadRequestException, IOException, OrmException {
+  private void addSshKeys(GerritApi api, AccountInfo acc)
+      throws BadRequestException, IOException, OrmException {
     List<SshKeyInfo> sshKeys = api.getSshKeys(acc.username);
     AccountState a = accountCache.getByUsername(acc.username);
     db.get().accountSshKeys().upsert(toAccountSshKey(a, sshKeys));
@@ -132,4 +158,60 @@
     }
     return result;
   }
+
+  private Account.Id createLocalUser(AccountInfo acc)
+      throws BadRequestException, ResourceConflictException,
+      UnprocessableEntityException, OrmException {
+    CreateAccount.Input input = new CreateAccount.Input();
+    log.info(String.format("User '%s' not found", acc.username));
+    String username = acc.username;
+    input.username = username;
+    input.email = acc.email;
+    input.name = acc.name;
+
+    AccountInfo accInfo =
+        createAccountFactory.create(username)
+            .apply(TopLevelResource.INSTANCE, input).value();
+    log.info(String.format("Local user '%s' created", username));
+
+    Account.Id userId = new Account.Id(accInfo._accountId);
+    Account account = accountCache.get(userId).getAccount();
+    account.setActive(false);
+    addToImportedUsersGroup(userId);
+    accountCache.evict(userId);
+    return userId;
+  }
+
+  private void addToImportedUsersGroup(Account.Id id) throws OrmException {
+    AccountGroup group = getImportedUsersGroup();
+    AccountGroupMember member =
+        new AccountGroupMember(new AccountGroupMember.Key(id, group.getId()));
+    db.get().accountGroupMembers().insert(Collections.singleton(member));
+  }
+
+  private AccountGroup getImportedUsersGroup() throws OrmException {
+    AccountGroup accGroup = groupCache.get(IMPORTED_USERS_NAME);
+    if (accGroup == null) {
+      accGroup = createImportedUsersGroup();
+    }
+    return accGroup;
+  }
+
+  private AccountGroup createImportedUsersGroup() throws OrmException {
+    AccountGroup.Id groupId = new AccountGroup.Id(db.get().nextAccountGroupId());
+    AccountGroup.UUID uuid =
+        GroupUUID.make(
+            IMPORTED_USERS,
+            currentUser.newCommitterIdent(
+                serverIdent.getWhen(),
+                serverIdent.getTimeZone()));
+    AccountGroup group = new AccountGroup(IMPORTED_USERS_NAME, groupId, uuid);
+    group.setDescription(IMPORTED_USERS);
+
+    db.get().accountGroupNames()
+        .insert(Collections.singleton(new AccountGroupName(group)));
+    db.get().accountGroups().insert(Collections.singleton(group));
+    groupCache.onCreateGroup(IMPORTED_USERS_NAME);
+    return group;
+  }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/AddApprovalsStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/AddApprovalsStep.java
index b5deef0..a9eb69b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/AddApprovalsStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/AddApprovalsStep.java
@@ -23,6 +23,8 @@
 import com.google.gerrit.extensions.common.ChangeInfo;
 import com.google.gerrit.extensions.common.LabelInfo;
 import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
 import com.google.gerrit.reviewdb.client.Account;
 import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.reviewdb.client.PatchSetApproval;
@@ -81,7 +83,8 @@
   }
 
   void add(GerritApi api) throws OrmException, NoSuchChangeException, IOException,
-      NoSuchAccountException, BadRequestException {
+      NoSuchAccountException, BadRequestException, ResourceConflictException,
+      UnprocessableEntityException{
     if (resume) {
       db.patchSetApprovals().delete(
           db.patchSetApprovals().byChange(change.getId()));
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/AddHashtagsStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/AddHashtagsStep.java
index f04c435..cf91b66 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/AddHashtagsStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/AddHashtagsStep.java
@@ -65,7 +65,7 @@
     this.resume = resume;
   }
 
-  void add() throws IllegalArgumentException, AuthException, IOException,
+  void add() throws IllegalArgumentException, IOException,
       ValidationException, OrmException, NoSuchChangeException {
     ChangeControl ctrl = changeControlFactory.controlFor(change, currentUser);
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/HttpSession.java b/src/main/java/com/googlesource/gerrit/plugins/importer/HttpSession.java
index cf49557..9fb8e27 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/HttpSession.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/HttpSession.java
@@ -90,14 +90,17 @@
   }
 
   private static class DummyX509TrustManager implements X509TrustManager {
+    @Override
     public X509Certificate[] getAcceptedIssuers() {
       return null;
     }
 
+    @Override
     public void checkClientTrusted(X509Certificate[] certs, String authType) {
       // no check
     }
 
+    @Override
     public void checkServerTrusted(X509Certificate[] certs, String authType) {
       // no check
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroup.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroup.java
index 7675235..c4c5f16 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroup.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroup.java
@@ -27,6 +27,7 @@
 import com.google.gerrit.extensions.restapi.ResourceConflictException;
 import com.google.gerrit.extensions.restapi.Response;
 import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
 import com.google.gerrit.reviewdb.client.Account;
 import com.google.gerrit.reviewdb.client.AccountGroup;
 import com.google.gerrit.reviewdb.client.AccountGroupById;
@@ -115,7 +116,7 @@
   public Response<String> apply(ConfigResource rsrc, Input input)
       throws ResourceConflictException, PreconditionFailedException,
       BadRequestException, NoSuchAccountException, OrmException, IOException,
-      MethodNotAllowedException {
+      MethodNotAllowedException, UnprocessableEntityException {
     GroupInfo groupInfo;
     this.api = apiFactory.create(input.from, input.user, input.pass);
     groupInfo = api.getGroup(group.get());
@@ -125,9 +126,10 @@
     return Response.<String> ok("OK");
   }
 
-  private void validate(Input input, GroupInfo groupInfo) throws ResourceConflictException,
-      PreconditionFailedException, BadRequestException, IOException,
-      OrmException, NoSuchAccountException, MethodNotAllowedException {
+  private void validate(Input input, GroupInfo groupInfo)
+      throws ResourceConflictException, PreconditionFailedException,
+      BadRequestException, IOException, OrmException, NoSuchAccountException,
+      MethodNotAllowedException, UnprocessableEntityException {
     if (!isInternalGroup(new AccountGroup.UUID(groupInfo.id))) {
       throw new MethodNotAllowedException(String.format(
           "Group with name %s is not an internal group and cannot be imported",
@@ -183,7 +185,8 @@
 
   private CreateGroupArgs toCreateGroupArgs(GroupInfo groupInfo)
       throws IOException, OrmException, BadRequestException,
-      NoSuchAccountException {
+      NoSuchAccountException, ResourceConflictException,
+      UnprocessableEntityException {
     CreateGroupArgs args = new CreateGroupArgs();
     args.setGroupName(groupInfo.name);
     args.groupDescription = groupInfo.description;
@@ -201,7 +204,8 @@
 
   private AccountGroup createGroup(Input input, GroupInfo info) throws OrmException,
       ResourceConflictException, NoSuchAccountException, BadRequestException,
-      IOException, PreconditionFailedException, MethodNotAllowedException {
+      IOException, PreconditionFailedException, MethodNotAllowedException,
+      UnprocessableEntityException {
     String uniqueName = getUniqueGroupName(info.name);
     if (!info.name.equals(uniqueName)) {
       log.warn(String.format("Group %s with UUID %s is imported with name %s",
@@ -280,7 +284,7 @@
 
   private void addMembers(AccountGroup.Id groupId, List<AccountInfo> members)
       throws OrmException, NoSuchAccountException, BadRequestException,
-      IOException {
+      IOException, ResourceConflictException, UnprocessableEntityException {
     List<AccountGroupMember> memberships = new ArrayList<>();
     for (AccountInfo member : members) {
       Account.Id userId = accountUtil.resolveUser(api, member);
@@ -299,7 +303,7 @@
       String groupName, List<GroupInfo> includedGroups)
       throws BadRequestException, ResourceConflictException,
       PreconditionFailedException, NoSuchAccountException, OrmException,
-      IOException, MethodNotAllowedException {
+      IOException, MethodNotAllowedException, UnprocessableEntityException {
     List<AccountGroupById> includeList = new ArrayList<>();
     for (GroupInfo includedGroup : includedGroups) {
       if (isInternalGroup(new AccountGroup.UUID(includedGroup.id))) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroupsStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroupsStep.java
index bcccf39..c55971c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroupsStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroupsStep.java
@@ -21,6 +21,7 @@
 import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
 import com.google.gerrit.extensions.restapi.PreconditionFailedException;
 import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
 import com.google.gerrit.reviewdb.client.AccountGroup;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.account.GroupCache;
@@ -77,7 +78,8 @@
   }
 
   void importGroups() throws PreconditionFailedException, BadRequestException,
-      NoSuchAccountException, OrmException, IOException {
+      NoSuchAccountException, OrmException, IOException,
+      UnprocessableEntityException {
     ProjectConfig projectConfig = projectCache.get(project).getConfig();
     Set<AccountGroup.UUID> groupUUIDs = projectConfig.getAllGroupUUIDs();
     pm.beginTask("Import Groups", groupUUIDs.size());
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProject.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProject.java
index e2c63d1..4e90374 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProject.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProject.java
@@ -227,7 +227,7 @@
     try {
       srcProject = !Strings.isNullOrEmpty(input.name)
           ? new Project.NameKey(input.name) : targetProject;
-      checkProjectInSource(input, pm);
+      checkProjectInSource(pm);
       setParentProjectName(input, pm);
       checkPreconditions(pm);
       try (Repository repo = openRepoStep.open(targetProject, resume, pm)) {
@@ -262,7 +262,7 @@
     return statistic;
   }
 
-  private void checkProjectInSource(Input input, ProgressMonitor pm)
+  private void checkProjectInSource(ProgressMonitor pm)
       throws IOException, BadRequestException {
     pm.beginTask("Check source project", 1);
     api.getProject(srcProject.get());
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayChangesStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayChangesStep.java
index 5cc44f3..2630429 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayChangesStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayChangesStep.java
@@ -21,7 +21,9 @@
 import com.google.gerrit.extensions.client.ChangeStatus;
 import com.google.gerrit.extensions.common.ChangeInfo;
 import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
 import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
 import com.google.gerrit.extensions.restapi.Url;
 import com.google.gerrit.reviewdb.client.Branch;
 import com.google.gerrit.reviewdb.client.Change;
@@ -220,7 +222,8 @@
   }
 
   private Change createChange(ChangeInfo c) throws OrmException,
-      NoSuchAccountException, BadRequestException, IOException {
+      NoSuchAccountException, BadRequestException, IOException,
+      ResourceConflictException, UnprocessableEntityException {
     Change.Id changeId = new Change.Id(db.nextChangeId());
 
     Change change =
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayMessagesStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayMessagesStep.java
index 306d819..ad29c03 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayMessagesStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayMessagesStep.java
@@ -18,6 +18,8 @@
 import com.google.gerrit.extensions.common.ChangeInfo;
 import com.google.gerrit.extensions.common.ChangeMessageInfo;
 import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
 import com.google.gerrit.reviewdb.client.Account;
 import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.reviewdb.client.ChangeMessage;
@@ -75,7 +77,8 @@
   }
 
   void replay(GerritApi api) throws NoSuchAccountException, NoSuchChangeException,
-      OrmException, IOException, BadRequestException {
+      OrmException, IOException, BadRequestException, ResourceConflictException,
+      UnprocessableEntityException {
     for (ChangeMessageInfo msg : changeInfo.messages) {
       ChangeMessage.Key msgKey = new ChangeMessage.Key(change.getId(), msg.id);
       if (resume && db.changeMessages().get(msgKey) != null) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayRevisionsStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayRevisionsStep.java
index a4b4601..9bce9e1 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayRevisionsStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayRevisionsStep.java
@@ -18,6 +18,8 @@
 import com.google.gerrit.extensions.common.ChangeInfo;
 import com.google.gerrit.extensions.common.RevisionInfo;
 import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
 import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.reviewdb.client.PatchSet;
 import com.google.gerrit.reviewdb.client.PatchSetInfo;
@@ -80,7 +82,7 @@
   }
 
   void replay(GerritApi api) throws IOException, OrmException, NoSuchAccountException,
-      BadRequestException {
+      BadRequestException, ResourceConflictException, UnprocessableEntityException {
     List<RevisionInfo> revisions = new ArrayList<>(changeInfo.revisions.values());
     sortRevisionInfoByNumber(revisions);
     List<PatchSet> patchSets = new ArrayList<>();
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/client/CompleteImportDialog.java b/src/main/java/com/googlesource/gerrit/plugins/importer/client/CompleteImportDialog.java
index cf3e578..df68a6e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/client/CompleteImportDialog.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/client/CompleteImportDialog.java
@@ -66,6 +66,7 @@
                   + (copy ? "copy" : "import") + " was completed."));
                 Button okButton = new Button("OK");
                 okButton.addClickHandler(new ClickHandler() {
+                  @Override
                   public void onClick(ClickEvent event) {
                     successDialog.hide();
                   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportGroupScreen.java b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportGroupScreen.java
index d1e4df1..6bafec2 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportGroupScreen.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportGroupScreen.java
@@ -106,6 +106,7 @@
         p.add(new Label("The group was imported."));
         Button okButton = new Button("OK");
         okButton.addClickHandler(new ClickHandler() {
+          @Override
           public void onClick(ClickEvent event) {
             successDialog.hide();
           }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportProjectScreen.java b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportProjectScreen.java
index 23dd4f7..7601de4 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportProjectScreen.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/client/ImportProjectScreen.java
@@ -108,6 +108,7 @@
         p.add(new Label("Created Changes: " + result.numChangesCreated()));
         Button okButton = new Button("OK");
         okButton.addClickHandler(new ClickHandler() {
+          @Override
           public void onClick(ClickEvent event) {
             successDialog.hide();
           }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/client/OnEditEnabler.java b/src/main/java/com/googlesource/gerrit/plugins/importer/client/OnEditEnabler.java
index e2fc1ea..81e9fbb 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/client/OnEditEnabler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/client/OnEditEnabler.java
@@ -46,7 +46,7 @@
    MouseUpHandler, ChangeHandler, ValueChangeHandler<Object> {
 
   private final FocusWidget widget;
-  private Map<TextBoxBase, String> strings = new HashMap<TextBoxBase, String>();
+  private Map<TextBoxBase, String> strings = new HashMap<>();
   private String originalValue;
 
 
diff --git a/src/main/resources/Documentation/about.md b/src/main/resources/Documentation/about.md
index 64069c1..7a7526b 100644
--- a/src/main/resources/Documentation/about.md
+++ b/src/main/resources/Documentation/about.md
@@ -95,9 +95,16 @@
 Account] or the link:access-control.html#capability_administrateServer[
 Administrate Server] capability assigned on the source system.
 
-Gerrit internal users (e.g. service users) are never automatically
-created but must be created in the target Gerrit server before the
-import.
+If for any reason an user is no longer existent in the LDAP instance but it
+is listed as a change owner, reviewer or as part of a group, a local user
+account is created with the same username. Giving that such user is not longer
+active in the system, their account status is set to inactive.
+
+Gerrit internal users (e.g. service users) should be created in the target
+Gerrit server before the import. Otherwise, an inactive local user is created
+with the same username.
+
+All locally created users are added to an internal group called "Imported Users".
 
 <a id="project-import-commands">
 #### Commands
@@ -277,9 +284,16 @@
 member are automatically retrieved from the source Gerrit server and
 added to the new account in the target Gerrit server.
 
-Gerrit internal users (e.g. service users) are never automatically
-created but must be created in the target Gerrit server before the
-import.
+If for any reason an user is no longer existent in the LDAP instance but it
+is listed as a group member, a local user account is created with the same
+username. Giving that such user is not longer active in the system, their account
+status is set to inactive.
+
+Gerrit internal users (e.g. service users) should be created in the target
+Gerrit server before the import. Otherwise, an inactive local user is created
+with the same username.
+
+All locally created users are added to an internal group called "Imported Users".
 
 If the group name is occupied in the target system (a group with the
 same name, but a different UUID exists already), the group is