/*
* 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 2006-2008 Sun Microsystems, Inc.
* Portions Copyright 2013-2015 ForgeRock AS.
*/
package org.opends.server.types;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import static org.forgerock.util.Reject.*;
import static org.opends.server.util.ServerConstants.*;
/**
* This class defines a DIT structure rule, which is used to indicate
* the types of children that entries may have.
*/
@org.opends.server.types.PublicAPI(
stability=org.opends.server.types.StabilityLevel.UNCOMMITTED,
mayInstantiate=false,
mayExtend=false,
mayInvoke=true)
public final class DITStructureRule
implements SchemaFileElement
{
private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
/** Indicates whether this DIT structure rule is declared "obsolete". */
private final boolean isObsolete;
/** The rule ID for this DIT structure rule. */
private final int ruleID;
/** The name form for this DIT structure rule. */
private final NameForm nameForm;
/**
* The set of additional name-value pairs associated with this DIT
* structure rule.
*/
private final Map<String,List<String>> extraProperties;
/**
* The set of names for this DIT structure rule, in a mapping
* between the all-lowercase form and the user-defined form.
*/
private final Map<String,String> names;
/** The set of superior DIT structure rules. */
private final Set<DITStructureRule> superiorRules;
/** The definition string for this DIT structure rule. */
private final String definition;
/** The description for this DIT structure rule. */
private final String description;
/**
* Creates a new DIT structure rule with the provided information.
*
* @param definition The definition string used to create
* this DIT structure rule. It must not be
* {@code null}.
* @param names The set of names for this DIT structure
* rule, mapping the lowercase names to the
* user-defined values.
* @param ruleID The rule ID for this DIT structure rule.
* @param description The description for this DIT structure
* rule.
* @param isObsolete Indicates whether this DIT structure
* rule is declared "obsolete".
* @param nameForm The name form for this DIT structure
* rule.
* @param superiorRules References to the superior rules for
* this DIT structure rule.
* @param extraProperties The set of "extra" properties associated
* with this DIT structure rules.
*/
public DITStructureRule(String definition, Map<String,String> names,
int ruleID, String description,
boolean isObsolete, NameForm nameForm,
Set<DITStructureRule> superiorRules,
Map<String,List<String>> extraProperties)
{
ifNull(definition);
this.ruleID = ruleID;
this.description = description;
this.isObsolete = isObsolete;
this.nameForm = nameForm;
int schemaFilePos = definition.indexOf(SCHEMA_PROPERTY_FILENAME);
if (schemaFilePos > 0)
{
String defStr;
try
{
int firstQuotePos = definition.indexOf('\'', schemaFilePos);
int secondQuotePos = definition.indexOf('\'',
firstQuotePos+1);
defStr = definition.substring(0, schemaFilePos).trim() + " " +
definition.substring(secondQuotePos+1).trim();
}
catch (Exception e)
{
logger.traceException(e);
defStr = definition;
}
this.definition = defStr;
}
else
{
this.definition = definition;
}
if (names == null || names.isEmpty())
{
this.names = new LinkedHashMap<>(0);
}
else
{
this.names = new LinkedHashMap<>(names);
}
if (superiorRules == null || superiorRules.isEmpty())
{
this.superiorRules = new LinkedHashSet<>(0);
}
else
{
this.superiorRules = new LinkedHashSet<>(superiorRules);
}
if (extraProperties == null || extraProperties.isEmpty())
{
this.extraProperties = new LinkedHashMap<>(0);
}
else
{
this.extraProperties = new LinkedHashMap<>(extraProperties);
}
}
/**
* Retrieves the set of names that may be used to reference this DIT
* structure rule. The returned mapping will be between an all
* lower-case form of the name and a name in the user-defined form
* (which may include mixed capitalization).
*
* @return The set of names that may be used to reference this DIT
* structure rule.
*/
public Map<String,String> getNames()
{
return names;
}
/**
* Indicates whether this DIT structure rule has the specified name.
*
* @param lowerName The lowercase name for which to make the
* determination.
*
* @return {@code true} if the specified name is assigned to this
* DIT structure rule, or {@code false} if not.
*/
public boolean hasName(String lowerName)
{
return names.containsKey(lowerName);
}
/**
* Retrieves the rule ID for this DIT structure rule.
*
* @return The rule ID for this DIT structure rule.
*/
public int getRuleID()
{
return ruleID;
}
/**
* Retrieves the name or rule ID for this DIT structure rule. If it
* has one or more names, then the primary name will be returned.
* If it does not have any names, then the rule ID will be returned.
*
* @return The name or rule ID for this DIT structure rule.
*/
public String getNameOrRuleID()
{
if (names.isEmpty())
{
return String.valueOf(ruleID);
}
else
{
return names.values().iterator().next();
}
}
/**
* Retrieves the description for this DIT structure rule.
*
* @return The description for this DIT structure rule.
*/
public String getDescription()
{
return description;
}
/**
* Retrieves the name form for this DIT structure rule.
*
* @return The name form for this DIT structure rule.
*/
public NameForm getNameForm()
{
return nameForm;
}
/**
* Retrieves the structural objectclass for the name form with which
* this DIT structure rule is associated.
*
* @return The structural objectclass for the name form with which
* this DIT structure rule is associated.
*/
public ObjectClass getStructuralClass()
{
return nameForm.getStructuralClass();
}
/**
* Retrieves the set of superior rules for this DIT structure rule.
*
* @return The set of superior rules for this DIT structure rule.
*/
public Set<DITStructureRule> getSuperiorRules()
{
return superiorRules;
}
/**
* Indicates whether this DIT structure rule has one or more
* superior rules.
*
* @return {@code true} if this DIT structure rule has one or more
* superior rules, or {@code false} if not.
*/
boolean hasSuperiorRules()
{
return superiorRules != null && !superiorRules.isEmpty();
}
/**
* Indicates whether this DIT structure rule is declared "obsolete".
*
* @return {@code true} if this DIT structure rule is declared
* "obsolete", or {@code false} if not.
*/
public boolean isObsolete()
{
return isObsolete;
}
/**
* Retrieves a mapping between the names of any extra non-standard
* properties that may be associated with this DIT structure rule
* and the value for that property.
*
* @return A mapping between the names of any extra non-standard
* properties that may be associated with this DIT
* structure rule and the value for that property.
*/
@Override
public Map<String,List<String>> getExtraProperties()
{
return extraProperties;
}
/**
* Indicates whether the provided object is equal to this DIT
* structure rule. The object will be considered equal if it is a
* DIT structure rule with the same OID as the current type.
*
* @param o The object for which to make the determination.
*
* @return {@code true} if the provided object is equal to this
* attribute, or {@code false} if not.
*/
@Override
public boolean equals(Object o)
{
if (this == o)
{
return true;
}
if (!(o instanceof DITStructureRule))
{
return false;
}
return ruleID == ((DITStructureRule) o).ruleID;
}
/**
* Retrieves the hash code for this DIT structure rule. It will be
* equal to the rule ID.
*
* @return The hash code for this DIT structure rule.
*/
@Override
public int hashCode()
{
return ruleID;
}
/**
* Retrieves the string representation of this attribute type in the
* form specified in RFC 2252.
*
* @return The string representation of this attribute type in the
* form specified in RFC 2252.
*/
@Override
public String toString()
{
return definition;
}
}