diff options
Diffstat (limited to 'java/com/google/gerrit/reviewdb/client/AccountGroup.java')
-rw-r--r-- | java/com/google/gerrit/reviewdb/client/AccountGroup.java | 310 |
1 files changed, 310 insertions, 0 deletions
diff --git a/java/com/google/gerrit/reviewdb/client/AccountGroup.java b/java/com/google/gerrit/reviewdb/client/AccountGroup.java new file mode 100644 index 0000000000..c7dc420fe8 --- /dev/null +++ b/java/com/google/gerrit/reviewdb/client/AccountGroup.java @@ -0,0 +1,310 @@ +// Copyright (C) 2008 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.reviewdb.client; + +import com.google.gwtorm.client.Column; +import com.google.gwtorm.client.IntKey; +import com.google.gwtorm.client.StringKey; +import java.sql.Timestamp; +import java.util.Objects; + +/** Named group of one or more accounts, typically used for access controls. */ +public final class AccountGroup { + /** + * Time when the audit subsystem was implemented, used as the default value for {@link #createdOn} + * when one couldn't be determined from the audit log. + */ + // Can't use Instant here because GWT. This is verified against a readable time in the tests, + // which don't need to compile under GWT. + private static final long AUDIT_CREATION_INSTANT_MS = 1244489460000L; + + public static Timestamp auditCreationInstantTs() { + return new Timestamp(AUDIT_CREATION_INSTANT_MS); + } + + /** Group name key */ + public static class NameKey extends StringKey<com.google.gwtorm.client.Key<?>> { + private static final long serialVersionUID = 1L; + + @Column(id = 1) + protected String name; + + protected NameKey() {} + + public NameKey(String n) { + name = n; + } + + @Override + public String get() { + return name; + } + + @Override + protected void set(String newValue) { + name = newValue; + } + } + + /** Globally unique identifier. */ + public static class UUID extends StringKey<com.google.gwtorm.client.Key<?>> { + private static final long serialVersionUID = 1L; + + @Column(id = 1) + protected String uuid; + + protected UUID() {} + + public UUID(String n) { + uuid = n; + } + + @Override + public String get() { + return uuid; + } + + @Override + protected void set(String newValue) { + uuid = newValue; + } + + /** Parse an {@link AccountGroup.UUID} out of a string representation. */ + public static UUID parse(String str) { + final UUID r = new UUID(); + r.fromString(str); + return r; + } + + /** Parse an {@link AccountGroup.UUID} out of a ref-name. */ + public static UUID fromRef(String ref) { + if (ref == null) { + return null; + } + if (ref.startsWith(RefNames.REFS_GROUPS)) { + return fromRefPart(ref.substring(RefNames.REFS_GROUPS.length())); + } + return null; + } + + /** + * Parse an {@link AccountGroup.UUID} out of a part of a ref-name. + * + * @param refPart a ref name with the following syntax: {@code "12/1234..."}. We assume that the + * caller has trimmed any prefix. + */ + public static UUID fromRefPart(String refPart) { + String uuid = RefNames.parseShardedUuidFromRefPart(refPart); + return uuid != null ? new AccountGroup.UUID(uuid) : null; + } + } + + /** @return true if the UUID is for a group managed within Gerrit. */ + public static boolean isInternalGroup(AccountGroup.UUID uuid) { + return uuid.get().matches("^[0-9a-f]{40}$"); + } + + /** Synthetic key to link to within the database */ + public static class Id extends IntKey<com.google.gwtorm.client.Key<?>> { + private static final long serialVersionUID = 1L; + + @Column(id = 1) + protected int id; + + protected Id() {} + + public Id(int id) { + this.id = id; + } + + @Override + public int get() { + return id; + } + + @Override + protected void set(int newValue) { + id = newValue; + } + + /** Parse an AccountGroup.Id out of a string representation. */ + public static Id parse(String str) { + final Id r = new Id(); + r.fromString(str); + return r; + } + } + + /** Unique name of this group within the system. */ + @Column(id = 1) + protected NameKey name; + + /** Unique identity, to link entities as {@link #name} can change. */ + @Column(id = 2) + protected Id groupId; + + // DELETED: id = 3 (ownerGroupId) + + /** A textual description of the group's purpose. */ + @Column(id = 4, length = Integer.MAX_VALUE, notNull = false) + protected String description; + + // DELETED: id = 5 (groupType) + // DELETED: id = 6 (externalName) + + @Column(id = 7) + protected boolean visibleToAll; + + // DELETED: id = 8 (emailOnlyAuthors) + + /** Globally unique identifier name for this group. */ + @Column(id = 9) + protected UUID groupUUID; + + /** + * Identity of the group whose members can manage this group. + * + * <p>This can be a self-reference to indicate the group's members manage itself. + */ + @Column(id = 10) + protected UUID ownerGroupUUID; + + @Column(id = 11, notNull = false) + protected Timestamp createdOn; + + protected AccountGroup() {} + + public AccountGroup( + AccountGroup.NameKey newName, + AccountGroup.Id newId, + AccountGroup.UUID uuid, + Timestamp createdOn) { + name = newName; + groupId = newId; + visibleToAll = false; + groupUUID = uuid; + ownerGroupUUID = groupUUID; + this.createdOn = createdOn; + } + + public AccountGroup(AccountGroup other) { + name = other.name; + groupId = other.groupId; + description = other.description; + visibleToAll = other.visibleToAll; + groupUUID = other.groupUUID; + ownerGroupUUID = other.ownerGroupUUID; + createdOn = other.createdOn; + } + + public AccountGroup.Id getId() { + return groupId; + } + + public String getName() { + return name.get(); + } + + public AccountGroup.NameKey getNameKey() { + return name; + } + + public void setNameKey(AccountGroup.NameKey nameKey) { + name = nameKey; + } + + public String getDescription() { + return description; + } + + public void setDescription(String d) { + description = d; + } + + public AccountGroup.UUID getOwnerGroupUUID() { + return ownerGroupUUID; + } + + public void setOwnerGroupUUID(AccountGroup.UUID uuid) { + ownerGroupUUID = uuid; + } + + public void setVisibleToAll(boolean visibleToAll) { + this.visibleToAll = visibleToAll; + } + + public boolean isVisibleToAll() { + return visibleToAll; + } + + public AccountGroup.UUID getGroupUUID() { + return groupUUID; + } + + public void setGroupUUID(AccountGroup.UUID uuid) { + groupUUID = uuid; + } + + public Timestamp getCreatedOn() { + return createdOn != null ? createdOn : auditCreationInstantTs(); + } + + public void setCreatedOn(Timestamp createdOn) { + this.createdOn = createdOn; + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof AccountGroup)) { + return false; + } + AccountGroup g = (AccountGroup) o; + return Objects.equals(name, g.name) + && Objects.equals(groupId, g.groupId) + && Objects.equals(description, g.description) + && visibleToAll == g.visibleToAll + && Objects.equals(groupUUID, g.groupUUID) + && Objects.equals(ownerGroupUUID, g.ownerGroupUUID) + // Treat created on epoch identical regardless if underlying value is null. + && getCreatedOn().equals(g.getCreatedOn()); + } + + @Override + public int hashCode() { + return Objects.hash( + name, groupId, description, visibleToAll, groupUUID, ownerGroupUUID, createdOn); + } + + @Override + public String toString() { + return getClass().getSimpleName() + + "{" + + "name=" + + name + + ", groupId=" + + groupId + + ", description=" + + description + + ", visibleToAll=" + + visibleToAll + + ", groupUUID=" + + groupUUID + + ", ownerGroupUUID=" + + ownerGroupUUID + + ", createdOn=" + + createdOn + + "}"; + } +} |