blob: 472cc744ad8642c6e81950d3e90413d241418246 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
/**
* <pre>
* <p>
* Contains interfaces and classes used for bootstrap schema object loading and
* configuration.
* </p>
* <p>
* Briefly, before delving into the reasons behind our choices, we would like to
* summarize what is here. First off each schema entity of significance whether
* defined by the protocol or not is introduced into the system using a bootstrap
* configuration set class. This is a class that implements a specific interface
* for creating all the needed schema objects to establish a baseline within the
* system. All such schema objects generated will be owned by the directory
* administrator. Furthermore these objects are temporary and can be overridden
* in the solid state using altered versions that are authoritative definitions
* within the system backend.
* </p>
* <p>
* Just what does all this mean? Hard coded schema objects in Java classes
* which implement a configuration set interface can be loaded into the system
* and used while bootstrapping it. If this is the first time bootstrapping,
* meaning these objects are NOT found within the system backend, they will
* be persisted into the system backend at the very end of the bootstrap stage so
* they can be resolved in the solid state. Changes to these objects via LDAP
* within the system backend by the admin persist across bootstrap sessions. They
* persist because the bootstrap object is never stored in the system backend
* if a record for that object already exists.
* </p>
* <p>
* Why are we storing a configuration directly in Java code? First off the
* likelihood of altering schema object fields to bootstrap the system is highly
* unlikely. Secondly most of these objects are published static entities and
* changing them would have serious repercussions. Hence its highly unlikely
* that these objects will change and there is no need to get complex to try
* to have an external representation for these schema objects. The
* representation of these objects as entries and attributes within the directory
* is enough of an external representation. Schema manipulation tools already
* exist for making changes so why have another additional
* mechanism/representation as well.
* </p>
* <hr>
* <h3>Notes:</h3>
* <ul>
* <li>
* Baseline schema configuration sets are loaded first.
* </li>
* <li>
* Within a logical schema (e.g. krb5-kdc) the ConfigurationSets of that
* schema will be loaded in an order consistent with datatype dependencies.
* For example a ConfigurationSet (CS) for SyntaxCheckers will be loaded
* before the one for Syntaxes within the same schema. This is because
* Syntaxes depend upon SyntaxCheckers and the proper SyntaxChecker must be
* resolvable via the SyntaxChecker registry.
* </li>
* <li>
* A CS shall contain schema objects associated with a specific owner, and a
* specific logical schema. The set of CS schema objects may depend on
* Schema objects within other logic schemas, hence other CS objects. These
* dependencies on other logical schemas are exposed by the CS interface.
* </li>
* <li>
* Other user defined CS classes can be loaded by the system as well. The
* system can search on the classpath for classes implementing the CS
* interface. It would then need to analyze dependencies to determine which
* schema object sets to process/load first. This is the most rudimentary
* of mechanisms for users to introduce new schema objects into the system.
* The other means is during the solid state through LDAP itself. Changes
* can be made along with new schema object introductions via schemaSubentry
* changes in the usual LDAP manager where schema objects are attributes in
* a massive entry. Another means is through the alteration of easier to
* manage entries for schema objects through the system namespace. Changes
* to either schemaSubEntry attributes or system namespace schema entries both
* mirror one another. A change to one propagates to the other: the same
* entity is being manipulated through two different views. One is a heck of
* a lot more manageable.
* </li>
* <li>
* We can add a resolver interface so a resolver can be registered after
* bootstrapping with a registry. In the case of a registry miss we ask the
* resolver for the object. If it cannot find it then well we're out of luck.
* Once the resolver is set for solid state operation, registry misses make
* the resolver go to disk on the system backend for authoritative copies.
* </li>
* <li>
* The resolver concept mentioned above can itself be another registry. It's
* just a secondary disk registry used when the first misses disk. So hence
* other registries should be able to be registerable with others to allow for
* registry delegation like the way classloaders delegate. This way there is
* no need to replace bootstrap registries. Once they have enough info to
* enable disk access, they can tap secondary schema information on disk to
* override the bootstrap objects first of all. Secondly in the solid state
* schema objects can be brought into memory from disk.
* </li>
* </ul>
* </hr>
* </pre>
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
* @version $Rev$, $Date$
*/
package org.apache.directory.server.schema.bootstrap;