/*
* 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
* trunk/opends/resource/legal-notices/OpenDS.LICENSE
* or https://OpenDS.dev.java.net/OpenDS.LICENSE.
* 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
* trunk/opends/resource/legal-notices/OpenDS.LICENSE. 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-2011 Sun Microsystems, Inc.
*/
package org.opends.guitools.controlpanel.datamodel;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import org.opends.admin.ads.ADSContext;
/**
* The class that describes the backend configuration.
*
*/
public class BackendDescriptor
{
private final String backendID;
private SortedSet<BaseDNDescriptor> baseDns;
private SortedSet<IndexDescriptor> indexes;
private SortedSet<VLVIndexDescriptor> vlvIndexes;
private int entries;
private final boolean isConfigBackend;
private final boolean isEnabled;
private CustomSearchResult monitoringEntry;
private final Type type;
private int hashCode;
/**
* An enumeration describing the type of backend.
*/
public enum Type
{
/**
* The backend is a local backend.
*/
LOCAL_DB,
/**
* The backend is a LDIF backend.
*/
LDIF,
/**
* The backend is a memory backend.
*/
MEMORY,
/**
* The backend is a backup backend.
*/
BACKUP,
/**
* The backend is a monitor backend.
*/
MONITOR,
/**
* The backend is a task backend.
*/
TASK,
/**
* The backend is another type of backend (for instance user defined).
*/
OTHER
};
/**
* Constructor for this class.
* @param backendID the backend ID of the Backend.
* @param baseDns the base DNs associated with the Backend.
* @param indexes the indexes defined in the backend.
* @param vlvIndexes the VLV indexes defined in the backend.
* @param entries the number of entries in the Backend.
* @param isEnabled whether the backend is enabled or not.
* @param type the type of the backend.
*/
public BackendDescriptor(String backendID,
Set<BaseDNDescriptor> baseDns,
Set<IndexDescriptor> indexes,
Set<VLVIndexDescriptor> vlvIndexes,
int entries, boolean isEnabled, Type type)
{
this.backendID = backendID;
this.entries = entries;
isConfigBackend = isConfigBackend(backendID);
this.type = type;
this.isEnabled = isEnabled;
updateBaseDnsAndIndexes(baseDns, indexes, vlvIndexes);
recalculateHashCode();
}
/**
* Returns the ID of the Backend.
* @return the ID of the Backend.
*/
public String getBackendID()
{
return backendID;
}
/**
* Returns the Base DN objects associated with the backend.
* @return the Base DN objects associated with the backend.
*/
public SortedSet<BaseDNDescriptor> getBaseDns()
{
return baseDns;
}
/**
* Returns the vlv index objects associated with the backend.
* @return the vlv index objects associated with the backend.
*/
public SortedSet<VLVIndexDescriptor> getVLVIndexes()
{
return vlvIndexes;
}
/**
* Returns the index objects associated with the backend.
* @return the index objects associated with the backend.
*/
public SortedSet<IndexDescriptor> getIndexes()
{
return indexes;
}
/**
* Return the number of entries in the backend.
* -1 indicates that the number of entries could not be found.
* @return the number of entries in the backend.
*/
public int getEntries()
{
return entries;
}
/**
* {@inheritDoc}
*/
@Override
public boolean equals(Object v)
{
boolean equals = false;
if (this != v)
{
if (v instanceof BackendDescriptor)
{
BackendDescriptor desc = (BackendDescriptor)v;
equals = getBackendID().equals(desc.getBackendID()) &&
(getEntries() == desc.getEntries());
if (equals)
{
equals = desc.getBaseDns().equals(getBaseDns());
}
if (equals)
{
equals = desc.getIndexes().equals(getIndexes());
}
if (equals)
{
equals = desc.getVLVIndexes().equals(getVLVIndexes());
}
if (equals)
{
// Compare monitoring entries
if (getMonitoringEntry() == null)
{
equals = desc.getMonitoringEntry() == null;
}
else
{
equals = getMonitoringEntry().equals(desc.getMonitoringEntry());
}
}
}
}
else
{
equals = true;
}
return equals;
}
/**
* Returns the monitoring entry information.
* @return the monitoring entry information.
*/
public CustomSearchResult getMonitoringEntry()
{
return monitoringEntry;
}
/**
* {@inheritDoc}
*/
@Override
public int hashCode()
{
return hashCode;
}
/**
* Method called when one of the elements that affect the value of the
* hashcode is modified. It is used to minimize the time spent calculating
* hashCode.
*
*/
private void recalculateHashCode()
{
hashCode = 0;
for (BaseDNDescriptor rep: getBaseDns())
{
hashCode += rep.hashCode();
}
hashCode += entries;
for (IndexDescriptor index : indexes)
{
hashCode += index.hashCode();
}
for (VLVIndexDescriptor index : vlvIndexes)
{
hashCode += index.hashCode();
}
}
/**
* Updates the base DNs and indexes contained in this backend so that they
* have a reference to this backend. It also initialize the members of this
* class with the base DNs and indexes.
* @param baseDns the base DNs associated with the Backend.
* @param indexes the indexes defined in the backend.
* @param vlvIndexes the VLV indexes defined in the backend.
*
*/
private void updateBaseDnsAndIndexes(Set<BaseDNDescriptor> baseDns,
Set<IndexDescriptor> indexes,
Set<VLVIndexDescriptor> vlvIndexes)
{
for (BaseDNDescriptor baseDN : baseDns)
{
baseDN.setBackend(this);
}
this.baseDns = new TreeSet<BaseDNDescriptor>(baseDns);
for (IndexDescriptor index : indexes)
{
index.setBackend(this);
}
this.indexes = new TreeSet<IndexDescriptor>(indexes);
for (VLVIndexDescriptor index : vlvIndexes)
{
index.setBackend(this);
}
this.vlvIndexes = new TreeSet<VLVIndexDescriptor>(vlvIndexes);
}
/**
* An convenience method to know if the provided ID corresponds to a
* configuration backend or not.
* @param id the backend ID to analyze
* @return <CODE>true</CODE> if the the id corresponds to a configuration
* backend and <CODE>false</CODE> otherwise.
*/
private boolean isConfigBackend(String id)
{
return "tasks".equalsIgnoreCase(id) ||
"schema".equalsIgnoreCase(id) ||
"config".equalsIgnoreCase(id) ||
"monitor".equalsIgnoreCase(id) ||
"backup".equalsIgnoreCase(id) ||
ADSContext.getDefaultBackendName().equalsIgnoreCase(id) ||
"ads-truststore".equalsIgnoreCase(id) ||
"replicationchanges".equalsIgnoreCase(id);
}
/**
* Tells whether this is a configuration backend or not.
* @return <CODE>true</CODE> if this is a configuration backend and
* <CODE>false</CODE> otherwise.
*/
public boolean isConfigBackend()
{
return isConfigBackend;
}
/**
* Sets the number of entries contained in this backend.
* @param entries the number of entries contained in this backend.
*/
public void setEntries(int entries)
{
this.entries = entries;
// Recalculate hashCode
recalculateHashCode();
}
/**
* Sets the monitoring entry corresponding to this backend.
* @param monitoringEntry the monitoring entry corresponding to this backend.
*/
public void setMonitoringEntry(CustomSearchResult monitoringEntry)
{
this.monitoringEntry = monitoringEntry;
}
/**
* Returns the type of the backend.
* @return the type of the backend.
*/
public Type getType()
{
return type;
}
/**
* Tells whether this backend is enabled or not.
* @return <CODE>true</CODE> if this is backend is enabled
* <CODE>false</CODE> otherwise.
*/
public boolean isEnabled()
{
return isEnabled;
}
}