/*
|
* The contents of this file are subject to the terms of the Common Development and
|
* Distribution License (the License). You may not use this file except in compliance with the
|
* License.
|
*
|
* You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
|
* specific language governing permission and limitations under the License.
|
*
|
* When distributing Covered Software, include this CDDL Header Notice in each file and include
|
* the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
|
* Header, with the fields enclosed by brackets [] replaced by your own identifying
|
* information: "Portions Copyright [year] [name of copyright owner]".
|
*
|
* Copyright 2008-2010 Sun Microsystems, Inc.
|
* Portions Copyright 2015-2016 ForgeRock AS.
|
*/
|
package org.opends.guitools.controlpanel.datamodel;
|
|
import static org.opends.server.backends.pluggable.SuffixContainer.*;
|
|
import java.util.Collections;
|
import java.util.Set;
|
import java.util.SortedSet;
|
import java.util.TreeSet;
|
|
import org.forgerock.opendj.ldap.schema.AttributeType;
|
import org.forgerock.opendj.server.config.meta.BackendIndexCfgDefn.IndexType;
|
|
/**
|
* The class used to describe the index configuration (the normal index: the one
|
* used to improve search performance on a given attribute).
|
*/
|
public class IndexDescriptor extends AbstractIndexDescriptor
|
{
|
|
private static final String[] DATABASE_INDEXES = new String[] {
|
DN2ID_INDEX_NAME, ID2CHILDREN_COUNT_NAME, ID2CHILDREN_INDEX_NAME, ID2SUBTREE_INDEX_NAME };
|
|
private final SortedSet<IndexType> types = new TreeSet<>();
|
private final boolean isDatabaseIndex;
|
private final int entryLimit;
|
private final AttributeType attr;
|
private int hashCode;
|
|
/**
|
* Constructor of the index descriptor.
|
*
|
* @param indexName
|
* name of the index.
|
*/
|
public IndexDescriptor(String indexName)
|
{
|
this(indexName, null, null, Collections.EMPTY_SET, -1);
|
}
|
|
/**
|
* Constructor of the index descriptor.
|
*
|
* @param name
|
* name of the index.
|
* @param attr
|
* the attribute type associated with the index attribute.
|
* @param backend
|
* the backend where the index is defined.
|
* @param types
|
* the type of indexes (equality, substring, etc.).
|
* @param entryLimit
|
* the entry limit for the index.
|
*/
|
public IndexDescriptor(
|
String name, AttributeType attr, BackendDescriptor backend, Set<IndexType> types, int entryLimit)
|
{
|
super(name, backend);
|
this.attr = attr;
|
this.types.addAll(types);
|
isDatabaseIndex = isDatabaseIndex(name);
|
this.entryLimit = entryLimit;
|
recalculateHashCode();
|
}
|
|
/**
|
* Returns the attribute type associated with the index attribute.
|
*
|
* @return the attribute type associated with the index attribute.
|
*/
|
public AttributeType getAttributeType()
|
{
|
return attr;
|
}
|
|
@Override
|
public int compareTo(AbstractIndexDescriptor o)
|
{
|
return getName().toLowerCase().compareTo(o.getName().toLowerCase());
|
}
|
|
@Override
|
public int hashCode()
|
{
|
return hashCode;
|
}
|
|
/**
|
* Returns the type of indexes (equality, substring, etc.).
|
*
|
* @return the type of indexes (equality, substring, etc.).
|
*/
|
public SortedSet<IndexType> getTypes()
|
{
|
return new TreeSet<>(types);
|
}
|
|
/**
|
* Tells whether this is a database index or not. Database indexes are not
|
* modifiable and for internal use only.
|
*
|
* @return <CODE>true</CODE> if this is a database index and
|
* <CODE>false</CODE> otherwise.
|
*/
|
public boolean isDatabaseIndex()
|
{
|
return isDatabaseIndex;
|
}
|
|
/**
|
* Tells whether the provide index name corresponds to a database index or
|
* not. Database indexes are not modifiable and for internal use only.
|
*
|
* @return <CODE>true</CODE> if the provide index name corresponds to a
|
* database index and <CODE>false</CODE> otherwise.
|
*/
|
private boolean isDatabaseIndex(final String indexName)
|
{
|
for (final String dbIndex : DATABASE_INDEXES)
|
{
|
if (indexName.equalsIgnoreCase(dbIndex))
|
{
|
return true;
|
}
|
}
|
return false;
|
}
|
|
@Override
|
public boolean equals(Object o)
|
{
|
if (o == this)
|
{
|
return true;
|
}
|
if (!(o instanceof IndexDescriptor))
|
{
|
return false;
|
}
|
final IndexDescriptor index = (IndexDescriptor)o;
|
return index.getName().equalsIgnoreCase(getName())
|
&& index.isDatabaseIndex() == isDatabaseIndex()
|
&& index.getTypes().equals(getTypes())
|
&& index.getEntryLimit() == getEntryLimit()
|
&& backendIdEqual(index);
|
}
|
|
private boolean backendIdEqual(IndexDescriptor index)
|
{
|
BackendDescriptor backend1 = getBackend();
|
BackendDescriptor backend2 = index.getBackend();
|
return backend1 != null && backend2 != null && backend1.getBackendID().equals(backend2.getBackendID());
|
}
|
|
/**
|
* Returns the entry limit of the index.
|
*
|
* @return the entry limit of the index.
|
*/
|
public int getEntryLimit()
|
{
|
return entryLimit;
|
}
|
|
@Override
|
protected void recalculateHashCode()
|
{
|
final StringBuilder sb = new StringBuilder();
|
for (final IndexType t : types)
|
{
|
sb.append(t).append(",");
|
}
|
if (getBackend() != null)
|
{
|
sb.append(getBackend().getBackendID());
|
}
|
hashCode = (getName()+sb+entryLimit).hashCode();
|
}
|
}
|