1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.infra.metadata.user;
19
20 import com.google.common.base.Objects;
21 import com.google.common.base.Strings;
22 import lombok.Getter;
23 import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
24
25
26
27
28 public final class Grantee {
29
30 private static final String DELIMITER = "@";
31
32 private static final String HOST_WILDCARD = "%";
33
34 @Getter
35 private final String username;
36
37 @Getter
38 private final String hostname;
39
40 private final boolean isUnlimitedHost;
41
42 private final int hashCode;
43
44 private final String toString;
45
46 public Grantee(final String value) {
47 this(value.contains("@") ? value.substring(0, value.indexOf('@')) : value, value.contains("@") ? value.substring(value.indexOf('@') + 1) : "");
48 }
49
50 public Grantee(final String username, final String hostname) {
51 this.username = username;
52 this.hostname = Strings.isNullOrEmpty(hostname) ? HOST_WILDCARD : hostname;
53 isUnlimitedHost = HOST_WILDCARD.equals(this.hostname);
54 hashCode = Objects.hashCode(username.toUpperCase(), this.hostname.toUpperCase());
55 toString = username + DELIMITER + this.hostname;
56 }
57
58
59
60
61
62
63
64 @HighFrequencyInvocation
65 public boolean accept(final Grantee grantee) {
66 return grantee.username.equalsIgnoreCase(username) && isPermittedHost(grantee);
67 }
68
69 private boolean isPermittedHost(final Grantee grantee) {
70 return isUnlimitedHost || grantee.hostname.equalsIgnoreCase(hostname);
71 }
72
73 @Override
74 public boolean equals(final Object obj) {
75 if (obj instanceof Grantee) {
76 Grantee grantee = (Grantee) obj;
77 return grantee.username.equalsIgnoreCase(username) && grantee.hostname.equalsIgnoreCase(hostname);
78 }
79 return false;
80 }
81
82 @Override
83 public int hashCode() {
84 return hashCode;
85 }
86
87 @Override
88 public String toString() {
89 return toString;
90 }
91 }