# Customization/extension within the toolkit's schema

Most configuration tasks are performed by simply altering an element in the configuration document, by adding elements to the document, or by removing elements from the configuration.

These three actions enable users to alter the behavior of objects in their application, change which objects make up their application and change the way scripts acts on the objects in their application.

In addition to these simple actions, users can customize the behavior of objects in their application or create new objects while continuing to use the EAC development toolkit's XML configuration document format. The following are examples of customization that are possible within the constructs of the XML schema defined in the eacToolkit.xsd schema file.

## Implement a custom component

Users can develop new custom components by extending the class com.Endeca.soleng.eac.toolkit.component.CustomComponent. This class and its associated XML element allow any number of properties and directories to be specified and accessed by methods in the object. This customization method may be appropriate for cases where functionality needs to be developed that is not directly associated with an Oracle Endeca process.

## Extend an existing object

Users can implement customizations on top of existing objects by creating a new class that extends an object in the toolkit. Most elements in the configuration document (with the notable exception of the "`app`" element, which specifies global configuration, but does not directly correspond to an object instance) can specify a class attribute to override the default class associated with each element. For example, a user could implement a `MyForgeComponent` class by extending the toolkit's `ForgeComponent` class.

    package com.Endeca.soleng.eac.toolkit.component;

    import java.util.logging.Logger;

    import com.Endeca.soleng.eac.toolkit.exception.AppConfigurationException;
    import com.Endeca.soleng.eac.toolkit.exception.EacCommunicationException;
    import com.Endeca.soleng.eac.toolkit.exception.EacComponentControlException;

    public class MyForgeComponent extends ForgeComponent
    {
      private static Logger log =
        Logger.getLogger(MyForgeComponent.class.getName());

      protected void getIncomingData() throws AppConfigurationException,
          EacCommunicationException, EacComponentControlException,
          InterruptedException
      {

      // custom data retrieval implementation

      }
    }

The new class can override method functionality to customize the behavior of the object. As long as the new object does not require configuration elements unknown to the `ForgeComponent` from which it inherits, it can continue to use the forge element in the XML document to specify object configuration.

    <forge class="com.Endeca.soleng.eac.toolkit.component.MyForgeComponent"
      id="CustomForge" host-id="ITLHost">
    ...
    </forge>

## Implement custom functionality in BeanShell scripts

Users can implement custom functionality by writing new code in the XML document in new or existing BeanShell scripts. This form of customization can be used to add new functionality or to override functionality that is built in to toolkit objects. While this customization approach is very flexible, it can become unwieldy and hard to maintain and debug if a large amount of custom code needs to be written.