cleanup (inspection "Java | Class structure | Utility class is not 'final'")
[idea/community.git] / platform / vcs-impl / src / com / intellij / vcs / log / util / VcsUserUtil.java
1 // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.vcs.log.util;
3
4 import com.intellij.openapi.util.Couple;
5 import com.intellij.openapi.util.text.StringUtil;
6 import com.intellij.vcs.log.VcsUser;
7 import gnu.trove.TObjectHashingStrategy;
8 import org.jetbrains.annotations.NotNull;
9 import org.jetbrains.annotations.Nullable;
10
11 import java.util.regex.Matcher;
12 import java.util.regex.Pattern;
13
14 public final class VcsUserUtil {
15   @NotNull private static final Pattern NAME_PATTERN = Pattern.compile("(\\w+)[\\W_](\\w+)");
16   @NotNull private static final Pattern PRINTABLE_ASCII_PATTERN = Pattern.compile("[ -~]*");
17
18   @NotNull
19   public static String toExactString(@NotNull VcsUser user) {
20     return getString(user.getName(), user.getEmail());
21   }
22
23   @NotNull
24   private static String getString(@NotNull String name, @NotNull String email) {
25     if (name.isEmpty()) return email;
26     if (email.isEmpty()) return name;
27     return name + " <" + email + ">";
28   }
29
30   public static boolean isSamePerson(@NotNull VcsUser user1, @NotNull VcsUser user2) {
31     return getNameInStandardForm(getName(user1)).equals(getNameInStandardForm(getName(user2)));
32   }
33
34   @NotNull
35   public static String getShortPresentation(@NotNull VcsUser user) {
36     return getName(user);
37   }
38
39   @NotNull
40   private static String getName(@NotNull VcsUser user) {
41     return getUserName(user.getName(), user.getEmail());
42   }
43
44   @NotNull
45   public static String getUserName(@NotNull String name, @NotNull String email) {
46     if (!name.isEmpty()) return name;
47     String emailNamePart = getNameFromEmail(email);
48     if (emailNamePart != null) return emailNamePart;
49     return email;
50   }
51
52   @Nullable
53   public static String getNameFromEmail(@NotNull String email) {
54     int at = email.indexOf('@');
55     String emailNamePart = null;
56     if (at > 0) {
57       emailNamePart = email.substring(0, at);
58     }
59     return emailNamePart;
60   }
61
62   @NotNull
63   public static String getNameInStandardForm(@NotNull String name) {
64     Couple<String> firstAndLastName = getFirstAndLastName(name);
65     if (firstAndLastName != null) {
66       return StringUtil.toLowerCase(firstAndLastName.first) + " " + StringUtil.toLowerCase(firstAndLastName.second); // synonyms detection is currently english-only
67     }
68     return nameToLowerCase(name);
69   }
70
71   @Nullable
72   public static Couple<String> getFirstAndLastName(@NotNull String name) {
73     Matcher matcher = NAME_PATTERN.matcher(name);
74     if (matcher.matches()) {
75       return Couple.of(matcher.group(1), matcher.group(2));
76     }
77     return null;
78   }
79
80   @NotNull
81   public static String nameToLowerCase(@NotNull String name) {
82     if (!PRINTABLE_ASCII_PATTERN.matcher(name).matches()) return name;
83     return StringUtil.toLowerCase(name);
84   }
85
86   @NotNull
87   public static String capitalizeName(@NotNull String name) {
88     if (name.isEmpty()) return name;
89     if (!PRINTABLE_ASCII_PATTERN.matcher(name).matches()) return name;
90     return StringUtil.toUpperCase(name.substring(0, 1)) + name.substring(1);
91   }
92
93   @NotNull
94   public static String emailToLowerCase(@NotNull String email) {
95     return StringUtil.toLowerCase(email);
96   }
97
98   public static class VcsUserHashingStrategy implements TObjectHashingStrategy<VcsUser> {
99     @Override
100     public int computeHashCode(VcsUser user) {
101       return getNameInStandardForm(getName(user)).hashCode();
102     }
103
104     @Override
105     public boolean equals(VcsUser user1, VcsUser user2) {
106       return isSamePerson(user1, user2);
107     }
108   }
109 }