1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.linecorp.centraldogma.server.metadata;
18
19 import static com.google.common.collect.ImmutableMap.toImmutableMap;
20 import static java.util.Objects.requireNonNull;
21
22 import java.util.Map;
23 import java.util.Map.Entry;
24 import java.util.Objects;
25
26 import javax.annotation.Nullable;
27
28 import com.fasterxml.jackson.annotation.JsonCreator;
29 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
30 import com.fasterxml.jackson.annotation.JsonInclude;
31 import com.fasterxml.jackson.annotation.JsonInclude.Include;
32 import com.fasterxml.jackson.annotation.JsonProperty;
33 import com.google.common.base.MoreObjects;
34 import com.google.common.collect.ImmutableMap;
35
36 import com.linecorp.centraldogma.common.RepositoryNotFoundException;
37 import com.linecorp.centraldogma.server.storage.project.Project;
38 import com.linecorp.centraldogma.server.storage.repository.HasWeight;
39
40
41
42
43 @JsonIgnoreProperties(ignoreUnknown = true)
44 @JsonInclude(Include.NON_NULL)
45 public class ProjectMetadata implements Identifiable, HasWeight {
46
47
48
49
50 private final String name;
51
52
53
54
55 private final Map<String, RepositoryMetadata> repos;
56
57
58
59
60 private final Map<String, Member> members;
61
62
63
64
65 private final Map<String, TokenRegistration> tokens;
66
67
68
69
70 private final UserAndTimestamp creation;
71
72
73
74
75 @Nullable
76 private final UserAndTimestamp removal;
77
78
79
80
81 @JsonCreator
82 public ProjectMetadata(@JsonProperty("name") String name,
83 @JsonProperty("repos") Map<String, RepositoryMetadata> repos,
84 @JsonProperty("members") Map<String, Member> members,
85 @JsonProperty("tokens") Map<String, TokenRegistration> tokens,
86 @JsonProperty("creation") UserAndTimestamp creation,
87 @JsonProperty("removal") @Nullable UserAndTimestamp removal) {
88 this.name = requireNonNull(name, "name");
89 this.repos = ImmutableMap.copyOf(requireNonNull(repos, "repos"));
90 this.members = ImmutableMap.copyOf(requireNonNull(members, "members"));
91 this.tokens = ImmutableMap.copyOf(requireNonNull(tokens, "tokens"));
92 this.creation = requireNonNull(creation, "creation");
93 this.removal = removal;
94 }
95
96 @Override
97 public String id() {
98 return name;
99 }
100
101
102
103
104 @JsonProperty
105 public String name() {
106 return name;
107 }
108
109
110
111
112 @JsonProperty
113 public Map<String, RepositoryMetadata> repos() {
114 return repos;
115 }
116
117
118
119
120 @JsonProperty
121 public Map<String, Member> members() {
122 return members;
123 }
124
125
126
127
128 @JsonProperty
129 public Map<String, TokenRegistration> tokens() {
130 return tokens;
131 }
132
133
134
135
136 @JsonProperty
137 public UserAndTimestamp creation() {
138 return creation;
139 }
140
141
142
143
144 @Nullable
145 @JsonProperty
146 public UserAndTimestamp removal() {
147 return removal;
148 }
149
150
151
152
153 public RepositoryMetadata repo(String repoName) {
154 final RepositoryMetadata repositoryMetadata =
155 repos.get(requireNonNull(repoName, "repoName"));
156 if (repositoryMetadata != null) {
157 return repositoryMetadata;
158 }
159 throw new RepositoryNotFoundException(repoName);
160 }
161
162
163
164
165 public Member member(String memberId) {
166 final Member member = memberOrDefault(memberId, null);
167 if (member != null) {
168 return member;
169 }
170 throw new MemberNotFoundException(memberId, name());
171 }
172
173
174
175
176
177 @Nullable
178 public Member memberOrDefault(String memberId, @Nullable Member defaultMember) {
179 final Member member = members.get(requireNonNull(memberId, "memberId"));
180 if (member != null) {
181 return member;
182 }
183 return defaultMember;
184 }
185
186 @Override
187 public int weight() {
188 int weight = name().length();
189 for (RepositoryMetadata repo : repos.values()) {
190 weight += repo.weight();
191 }
192 for (Member member : members.values()) {
193 weight += member.weight();
194 }
195 for (TokenRegistration token : tokens.values()) {
196 weight += token.weight();
197 }
198
199 return weight;
200 }
201
202 @Override
203 public boolean equals(Object o) {
204 if (this == o) {
205 return true;
206 }
207 if (!(o instanceof ProjectMetadata)) {
208 return false;
209 }
210 final ProjectMetadata that = (ProjectMetadata) o;
211 return name.equals(that.name) &&
212 repos.equals(that.repos) &&
213 members.equals(that.members) &&
214 tokens.equals(that.tokens) &&
215 creation.equals(that.creation) &&
216 Objects.equals(removal, that.removal);
217 }
218
219 @Override
220 public int hashCode() {
221 return Objects.hash(name, repos, members, tokens, creation, removal);
222 }
223
224 @Override
225 public String toString() {
226 return MoreObjects.toStringHelper(this)
227 .add("name", name())
228 .add("repos", repos())
229 .add("members", members())
230 .add("tokens", tokens())
231 .add("creation", creation())
232 .add("removal", removal())
233 .toString();
234 }
235
236
237
238
239 public ProjectMetadata withoutDogmaRepo() {
240 if (!repos().containsKey(Project.REPO_DOGMA)) {
241 return this;
242 }
243 final Map<String, RepositoryMetadata> filtered =
244 repos().entrySet().stream().filter(entry -> !Project.REPO_DOGMA.equals(entry.getKey()))
245 .collect(toImmutableMap(Entry::getKey, Entry::getValue));
246 return new ProjectMetadata(name(),
247 filtered,
248 members(),
249 tokens(),
250 creation(),
251 removal());
252 }
253 }