What is Carbon? |   |  
 Author: Greg Hinkle (ghinkle at sapient.com) Version: $Revision: 1.8 $($Author: dvoet $ / $Date: 2003/05/02 17:28:49 $) Created: January 2002
   |  
  |   |  
             |  
                This document is designed to be an high level introduction to the Carbon
                    Component Model. It should be useful to all levels of developers and architects. 
              |   
             |  
                Welcome to Carbon. 
                
                    Carbon is a light-weight component model that serves
                    as the foundation for a services based architecture.
                    Carbon has the following objectives:
                 
                
                    - Create a more flexible architecture via a decoupled, metadata-centric system
 
                    - Reduce complexity by providing access to services as small replaceable components
 
                    - Encourage the separation of concerns, resulting in code assets that are easier to maintain, adapt and reuse in a complex and dynamic operating environment
 
                 
              |   
             |  
                
                    Carbon is a lightweight component model for the Java
                    programming language built to support enterprise
                    applications and compliment J2EE and other traditional
                    technologies. The technology provides a basic abstraction for
                    the development and deployment of modular services.
                    Included with the framework are caching,
                    a JDBC accelerator, metadata driven deployment and
                    management, XML and JNDI-based configuration, user and
                    group management supporting JAAS and other technical
                    utilities and services.
                 
                
                    Carbon provides improved flexibility by providing robust multi-
                    deployment, type-safe configuration support and remote
                    management capabilities through little to no additional code.
                    It also provides a simple name-based lookup mechanism to
                    deployed services. The component model employs basic
                    lifecycle support and the architecture can be configured with
                    additional interceptor plug-ins that add functionality across
                    the architecture.
                 
              |   
             |  
                A Carbon Component is built from three artifacts:
                    the implementation, its configuration and a set of decorators. These
                    three things are used by the Carbon Component Factory to construct a single
                    consistent view of them all through something called the Component Proxy. The
                    Component Proxy
                    (?) is simply the external view of a component. Through polymorphism
                    and DynamicProxies
                    (?),
                    it is able to look and act like both the component implementation
                    and all of the its decorators
                 
                The following information is provided by a Component's Configuration
                    in order to construct a Component. 
                  
                
                    - Functional Interface
 
                    - This interface defines what service the component provides. It is the normal,
                        external interface of the component is used by clients
                        of the component. This is analogous to the remote interface of EJBs.
 
                    - Functional Implementation
 
                    - This class implements the Functional Interface and is the delegatee of all
                        business calls to a component. This is analogous to the bean implementation
                        classes of EJBs.
 
                    - Configuration Interface
 
                    - All components have configuration that, at a minimum, describes how they are deployed.
                        In addition, the configuration can contain other information needed by the component.
                        This configuration is defined by the component's Configuration Interface (see
                        Configuration Service)
                        This is partly analogous to deployment descriptors of EJBs,
                        but also encompasses bean-specific properties files.
                    
 
                    - Component Template
 
                    - This template is a configuration document that describes a standard construction
                        for a component. It defines the interceptors that will provide additional functionality
                        to a component and how they work together.
 
                 
              |   
             |  
                The Carbon Configuration Service provides a way to retrieve
                    externalized values, but in a much more structured and type-safe way than previous
                    configuration service implementations. This new service groups configuration
                    information into documents that describe a particular subject and then places
                    these documents in a hierarchical folder structure for easy maintenance and
                    management. As a convenience, the system also provides a well defined interaction
                    between the Component Model and Configurations in such a way that each component
                    will have a document that describes it at the same location. 
                The documents themselves are accessed through a format and
                    location generic formatting system. This would allow for the future handling
                    of other persistence mechanisms such as databases. For now this means
                    that documents are XML files and folders are the directories in which they are
                    maintained. 
                The other main feature of the Configuration Service is its
                    type safety. Utilizing DynamicProxies the Configuration System is able to map
                    a set of data in a document to an interface for configuration. This provides
                    type-safe access to data in a document without the need to actually implement
                    the interface. All developers must do is define a Java interface and Carbon
                    will do the rest. 
              |   
             |  
                 Carbon Components are retrieved through the Lookup Service
                    using the simple
                    fetchComponent method shown below. The name
                    of the cache is based on a system-wide namespace.
                 
                Example service lookup
Cache myCache =
    (Cache) Lookup.getInstance().fetchComponent("/cache/MyCache");
    Object value = my.get(key);
                The component accessed is built through the use of a matching
                    configuration document that describes it. In this case, the configuration document
                    is an XML file located at
                    d:\carbon\config\cache\MyCache.xml. The
                    system is able to find the file because the
                    d:\carbon\config directory
                    is mounted as the root of the Carbon Configuration Service.
                 
                Example configuration
<Configuration
    ConfigurationInterface="org.sape.carbon.services.cache.total.TotalCacheConfiguration">
    <FunctionalImplementationClass>
    org.sape.carbon.services.cache.total.ReadOnlyCache
    </FunctionalImplementationClass>
    <FunctionalInterface>
    org.sape.carbon.services.cache.Cache
    </FunctionalInterface>
    <DataLoader>ref:///cache/test/TotalCacheDataLoader</DataLoader>
    </Configuration>
                As you'll notice in the above example, the special Uniform
                    Resource Indicator (URI) of
                    ref:// is used to denote
                    a reference to another component in the Carbon System.
                 
              |   
         |  
  |   |  
             |  
                | Term | Definition | 
|---|
 | Component Factory | 
                        This service builds new Carbon Components from their configuration
                        and starts their lifecycle management.
                     |  | Component Proxy | 
                        The Component Proxy is a generic delegate capable of implementing
                        any set of interfaces and passing through calls to a specific implementor.
                     |  | Component Interceptor | 
                        A class that adds functionality to a component through the
                        Component Proxy. The only mandatory interceptors are the Lifecycle and
                        Configuration Interceptors.
                     |  | Configuration Document | 
                        A configuration document is a document of data representing
                        configuration information for a specific subject. In the case of components,
                        this document describes all the information about a component. It includes
                        how to build it, what its behavior will be and how it can be used. A configuration
                        document is normally represented by a single XML file on disk.
                     |  | Dynamic Proxy | 
                        This new functionality implemented in SDK1.3 and above supports
                        the dynamic creation of classes implementing any set of interfaces. This
                        powerful functionality is what provides the capability for generic delegation.
                     |  | Generic Delegator | 
                        Utilizing dynamic
                        proxies, this object can implement a list of interfaces and delegate their
                        calls to their respectively configured implementations at runtime. This allows
                        us to construct objects of arbitrary complexity by adding multiple objects
                        together into a single object called the proxy. This is the primary mechanism
                        for adding features to Carbon and is done by creating classes that implement
                        the
                        ComponentAssistant interface.
                     |  | Management Interceptor | 
                        This delegate will
                        implement the functionality required to make a component available for
                        managing and monitoring through a JMX based console.
                     |  | Configuration Interceptor | 
                        This delegate will
                        provide functionality to integrate a component's configuration object with
                        the Configuration Service. This may include executing the persistence of
                        altered configurations at runtime.
                     |  | Functional Interface and Functional Implementation | 
                        Together, these 2 classes define the Component's specific service functionality.
                     |  | Lookup Service | 
                        This service will
                        provide access to the retrieval of new and existing components in the system.
                        This functionality is provided through an implementation of
                        ComponentKeeper.
                     |  | Lifecycle Interceptor | 
                        This type of
                        delegate would be enabled to manage a component's lifecycle state and execute
                        special operations in the event of state changes.
                     |  | Configuration Service | 
                        The configuration
                        service will be able to provide a persistence store and retrieval for
                        specific configuration objects.
                     |   
              |   
         |  
  |