| <?xml version="1.0" encoding="UTF-8"?> | |
| <document> | |
| <properties> | |
| <author email="akarasulu@apache.org">Alex Karasulu</author> | |
| <title>Backend Subsystem</title> | |
| </properties> | |
| <body> | |
| <section name="Backend Subsystem"> | |
| <p> | |
| The backend subsystem is everything minus the networking layer and the | |
| protocol handling layer. It is composed of several parts in itself: the | |
| JNDI provider, interceptor framework, schema subsystem, and database | |
| subsystem. Each sub-subsystem of the backend is described in the | |
| sections to follow. | |
| </p> | |
| <subsection name="Database Subsystem"> | |
| <p> | |
| The overall design to the database subsystem is described to some | |
| degree within the partition documentation which can be found | |
| <a href="../users/partition.html">here</a>. In summary this subsystem | |
| is responsible for storing and accessing entries addressed by DN. | |
| </p> | |
| <p> | |
| Eventually we intend to delve into the design of the database | |
| subsystem by breaking down the search engine, optimizer and default | |
| backing store design which uses JDBM BTrees. | |
| </p> | |
| <p> | |
| For future reference below the RootNexus is the top level object or | |
| facade of the database subsystem. It contains all context partitions | |
| and routes calls to them based on the location of the context within | |
| the namespace. | |
| </p> | |
| </subsection> | |
| <subsection name="JNDI Provider"> | |
| <p> | |
| The JNDI Provider is just an implementation of the | |
| InitialContextFactory, Context, and other derived interfaces. The | |
| factory is used to fire up the entire server if it has not been | |
| started already to service the JNDI request. The contexts are simple | |
| wrappers around the database subsystem which point to a specific entry | |
| withing the namespace. More will be put here as time progresses ... | |
| </p> | |
| </subsection> | |
| <subsection name="Interceptor Framework"> | |
| <p> | |
| Calls to the RootNexus are made from within Context implementations | |
| of the JNDI provider. Relative Context positions or names are | |
| translated into (absolute) distinguished names and the appropriate | |
| call is made on the RootNexus. The calls are intercepted using a | |
| proxy and additional functionality is injected before, after and on | |
| exception to calls made on the RootNexus. | |
| </p> | |
| <p> | |
| A framework is built around this. The Context, parameters, return | |
| values and any exceptions that may be thrown by the call are | |
| encapsulated within an Invocation object. This object is passed to | |
| a chain of interceptors that operate on the values it holds to | |
| implement a service. | |
| </p> | |
| <p> | |
| There are three separate types or stages of interceptors. | |
| Interceptors can operate before a method invocation, after an | |
| invocation and when an error results during any point in this process. | |
| Separate chains of interceptors have been created for each stage. The | |
| Invocation object is passed through this chain and each interceptor | |
| operates upon it. | |
| </p> | |
| <p> | |
| Not all interceptor chains are created equally! The before and after | |
| chains are fail fast. Meaning the processing of an Invocation object | |
| shorts the rest of the chain if one interceptor fails while processing | |
| the invocation. This is not the case when processing exceptions in | |
| the on error interceptor chain. Regardless of an interceptor's | |
| success downstream, all interceptors are guaranteed a chance to | |
| operate on the Invocation object. This makes the on-error chain an | |
| excellent place to put cleanup code or code to handle failures. | |
| </p> | |
| <p> | |
| When implementing a cross cutting service with the interceptor | |
| framework one or more interceptors may be added to one or more | |
| chains. Keep in mind this framework helps inject new functionality | |
| but it can get conjested very quickly. | |
| </p> | |
| </subsection> | |
| <subsection name="Schema Subsystem"> | |
| <p> | |
| The schema subsystem manages LDAP schema objects. These objects | |
| have a direct effect on how lookups and search operations are | |
| conducted on the directory. The subsystem contains a set of | |
| registries for each type of LDAP schema object based on OID. | |
| </p> | |
| <p> | |
| Schema objects may reference one another by OID and so the system | |
| is designed to dynamically resolve dependent objects by lookups on | |
| these registries. | |
| </p> | |
| </subsection> | |
| </section> | |
| </body> | |
| </document> |