/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt * or http://forgerock.org/license/CDDLv1.0.html. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at legal-notices/CDDLv1_0.txt. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2008-2010 Sun Microsystems, Inc. * Portions copyright 2011-2015 ForgeRock AS */ package org.opends.server.replication.common; import java.util.*; /** * This class holds information about a DS connected to the topology. This * information is to be exchanged through the replication protocol in topology * messages, to keep every member (RS or DS) of the topology aware of the DS * topology. * <p> * @Immutable */ public final class DSInfo { /** DS server id. */ private final int dsId; /** DS server url. */ private final String dsUrl; /** Server id of the RS that the DS is connected to. */ private final int rsId; /** DS Generation Id. */ private final long generationId; /** DS Status. */ private final ServerStatus status; /** Assured replication enabled on DS or not. */ private final boolean assuredFlag; /** DS assured mode (relevant if assured replication enabled). */ private final AssuredMode assuredMode; /** DS safe data level (relevant if assured mode is safe data). */ private final byte safeDataLevel; /** List of referrals URLs exported by the DS. */ private final List<String> refUrls; /** Group id. */ private final byte groupId; /** Protocol version. */ private final short protocolVersion; private final Set<String> eclIncludes; private final Set<String> eclIncludesForDeletes; /** * Creates a new instance of DSInfo with every given info. * * @param dsId * The DS id * @param dsUrl Url of the DS * @param rsId * The RS id the DS is connected to * @param generationId * The generation id the DS is using * @param status * The DS status * @param assuredFlag * DS assured replication enabled or not * @param assuredMode * DS assured mode * @param safeDataLevel * DS safe data level * @param groupId * DS group id * @param refUrls * DS exported referrals URLs * @param eclIncludes * The list of entry attributes to include in the ECL. * @param eclIncludesForDeletes * The list of entry attributes to include in the ECL for deletes. * @param protocolVersion * Protocol version supported by this server. */ public DSInfo(int dsId, String dsUrl, int rsId, long generationId, ServerStatus status, boolean assuredFlag, AssuredMode assuredMode, byte safeDataLevel, byte groupId, Collection<String> refUrls, Collection<String> eclIncludes, Collection<String> eclIncludesForDeletes, short protocolVersion) { this.dsId = dsId; this.dsUrl = dsUrl; this.rsId = rsId; this.generationId = generationId; this.status = status; this.assuredFlag = assuredFlag; this.assuredMode = assuredMode; this.safeDataLevel = safeDataLevel; this.groupId = groupId; this.refUrls = Collections.unmodifiableList(new ArrayList<String>(refUrls)); this.eclIncludes = Collections.unmodifiableSet(new HashSet<String>(eclIncludes)); this.eclIncludesForDeletes = Collections.unmodifiableSet(new HashSet<String>(eclIncludesForDeletes)); this.protocolVersion = protocolVersion; } /** * Get the DS id. * @return the DS id */ public int getDsId() { return dsId; } /** * Get the DS URL. * @return the DS URL */ public String getDsUrl() { return dsUrl; } /** * Get the RS id the DS is connected to. * @return the RS id the DS is connected to */ public int getRsId() { return rsId; } /** * Get the generation id DS is using. * @return the generation id DS is using. */ public long getGenerationId() { return generationId; } /** * Get the DS status. * @return the DS status */ public ServerStatus getStatus() { return status; } /** * Tells if the DS has assured replication enabled. * @return True if the DS has assured replication enabled */ public boolean isAssured() { return assuredFlag; } /** * Get the DS assured mode (relevant if DS has assured replication enabled). * @return The DS assured mode */ public AssuredMode getAssuredMode() { return assuredMode; } /** * Get the DS safe data level (relevant if assured mode is safe data). * @return The DS safe data level */ public byte getSafeDataLevel() { return safeDataLevel; } /** * Get the DS group id. * @return The DS group id */ public byte getGroupId() { return groupId; } /** * Get the DS exported URLs for referrals. * @return The DS exported URLs for referrals */ public List<String> getRefUrls() { return refUrls; } /** * Get the entry attributes to be included in the ECL. * @return The entry attributes to be included in the ECL. */ public Set<String> getEclIncludes() { return eclIncludes; } /** * Get the entry attributes to be included in the ECL for delete operations. * @return The entry attributes to be included in the ECL. */ public Set<String> getEclIncludesForDeletes() { return eclIncludesForDeletes; } /** * Get the protocol version supported by this server. * Returns -1 when the protocol version is not known (too old version). * @return The protocol version. */ public short getProtocolVersion() { return protocolVersion; } /** * Returns a new instance of {@link DSInfo} with the specified replication * server Id. * * @param rsId * the replication server Id to set on the new DSInfo object. * @return a new instance of {@link DSInfo} with the specified replication * server Id. */ public DSInfo cloneWithReplicationServerId(int rsId) { return new DSInfo(dsId, dsUrl, rsId, generationId, status, assuredFlag, assuredMode, safeDataLevel, groupId, refUrls, eclIncludes, eclIncludesForDeletes, protocolVersion); } /** * Test if the passed object is equal to this one. * @param obj The object to test * @return True if both objects are equal */ @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (obj.getClass() != getClass()) { return false; } final DSInfo dsInfo = (DSInfo) obj; return dsId == dsInfo.getDsId() && rsId == dsInfo.getRsId() && generationId == dsInfo.getGenerationId() && status == dsInfo.getStatus() && assuredFlag == dsInfo.isAssured() && assuredMode == dsInfo.getAssuredMode() && safeDataLevel == dsInfo.getSafeDataLevel() && groupId == dsInfo.getGroupId() && protocolVersion == dsInfo.getProtocolVersion() && refUrls.equals(dsInfo.getRefUrls()) && Objects.equals(eclIncludes, dsInfo.getEclIncludes()) && Objects.equals(eclIncludesForDeletes, dsInfo.getEclIncludesForDeletes()); } /** * Computes hash code for this object instance. * @return Hash code for this object instance. */ @Override public int hashCode() { int hash = 7; hash = 73 * hash + this.dsId; hash = 73 * hash + this.rsId; hash = 73 * hash + (int) (this.generationId ^ (this.generationId >>> 32)); hash = 73 * hash + (this.status != null ? this.status.hashCode() : 0); hash = 73 * hash + (this.assuredFlag ? 1 : 0); hash = 73 * hash + (this.assuredMode != null ? this.assuredMode.hashCode() : 0); hash = 73 * hash + this.safeDataLevel; hash = 73 * hash + (this.refUrls != null ? this.refUrls.hashCode() : 0); hash = 73 * hash + (this.eclIncludes != null ? eclIncludes.hashCode() : 0); hash = 73 * hash + (this.eclIncludesForDeletes != null ? eclIncludesForDeletes.hashCode() : 0); hash = 73 * hash + this.groupId; hash = 73 * hash + this.protocolVersion; return hash; } /** * Returns a string representation of the DS info. * @return A string representation of the DS info */ @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("DS id: ").append(dsId); sb.append(" ; DS url: ").append(dsUrl); sb.append(" ; RS id: ").append(rsId); sb.append(" ; Generation id: ").append(generationId); sb.append(" ; Status: ").append(status); sb.append(" ; Assured replication: ").append(assuredFlag); if (assuredFlag) { sb.append(" ; Assured mode: ").append(assuredMode); sb.append(" ; Safe data level: ").append(safeDataLevel); } sb.append(" ; Group id: ").append(groupId); sb.append(" ; Protocol version: ").append(protocolVersion); sb.append(" ; Referral URLs: ").append(refUrls); sb.append(" ; ECL Include: ").append(eclIncludes); sb.append(" ; ECL Include for Deletes: ").append(eclIncludesForDeletes); return sb.toString(); } }