/* * 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 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 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 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 true if this is a database index and * false 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 true if the provide index name corresponds to a * database index and false 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(); } }