/*
|
* 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-2013 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())
|
&& equals(eclIncludes, dsInfo.getEclIncludes())
|
&& equals(eclIncludesForDeletes, dsInfo.getEclIncludesForDeletes());
|
}
|
|
private boolean equals(Set<String> o1, Set<String> o2)
|
{
|
return (o1 == null && o2 == null) || (o1 != null && o1.equals(o2));
|
}
|
|
/**
|
* 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()
|
{
|
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);
|
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();
|
}
|
|
}
|