> ## Documentation Index
> Fetch the complete documentation index at: https://docs.activeviam.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Add custom data loading

> How to customize the initial data load in Atoti Limits, covering data location and file pattern configuration via limits.initial-load properties, and how to implement a custom ILimitsFileLoadingService

The initial load of Atoti Limits data allows you to bulk load limits and incidents when the application first
starts and connects to your Atoti Server instance. The loading process can be customized to fit your needs
through configuration properties or by implementing your own custom service.

## Initial load configuration properties

### How to customize the initial load data location

By default, Atoti Limits will attempt to load the data from CSV files located in the directory specified by the
`limits.initial-load.root-dir` property. When Atoti Limits starts and connects to your Atoti Server
instance, it will look in the location specified by this property for a subdirectory with the name of your
Atoti Server instance which is specified by the `limits.autoconfiguration.server-name` property.

<Info>
  The `limits.autoconfiguration.server-name` property is autoconfigured by default, but you can set it explicitly in the
  configuration for your Atoti Server if needed.
</Info>

The default directory for Atoti Limits data is `./src/main/resources/data`. If you need to change this location,
set the `limits.initial-load.root-dir` property to the desired path in your `application.yml` file.

### How to customize the initial load data file patterns

Within the directory specified by the `limits.initial-load.root-dir` property, Atoti Limits will look for files
that match the patterns specified by the `limits.initial-load.file-path-matchers.*` properties. The default patterns are:

<table><thead><tr><th>Property Name</th><th>Default Value</th><th>Description</th></tr></thead><tbody><tr><td><code>limits.initial-load.file-path-matchers.limits</code></td><td><code>glob:\*\*/\*limits\_approve\*.csv</code></td><td>Pattern to match <a href="../../user-ref/input-files/limits_approve">limit files</a></td></tr><tr><td><code>limits.initial-load.file-path-matchers.limit-structures</code></td><td><code>glob:\*\*/\*limit\_structures\*.csv</code></td><td>Pattern to match <a href="../../user-ref/input-files/limit_structures">limit structure files</a></td></tr><tr><td><code>limits.initial-load.file-path-matchers.incidents</code></td><td><code>glob:\*\*/incident/\*\*/\*incident\*.csv</code></td><td>Pattern to match <a href="../evaluation-tasks/incidents">incident files</a></td></tr><tr><td><code>limits.initial-load.file-path-matchers.as-of-date</code></td><td><code>glob:\*\*/\*as\_of\_date\*.csv</code></td><td>Pattern to match <a href="../../user-ref/input-files/as_of_date">AsOfDate files</a></td></tr></tbody></table>

To customize these patterns, set these properties accordingly in your `application.yml` file. If you only wish to
customize the pattern for some of the file types, you can set only those specific properties, and the others will use the
default values.

## How to customize the file loading service

If you need to customize the initial load process beyond what is possible with the configuration properties, you can
implement your own file loading service by creating a custom `ILimitsFileLoadingService` implementation to replace the
default `DefaultLimitsFileLoadingService`.

<Accordion title="ILimitsFileLoadingService">
  ```java theme={"languages":{"custom":["/engine/python-sdk/0.9/languages/pycon.tmLanguage.json"]}}
  /**
   * <b>ILimitsFileLoadingService</b>
   *
   * <p>This interface defines the methods for loading limits data from CSV files.
   *
   * <p>Implementations of this interface should ensure that the data is loaded in the correct order
   * as described in the {@link #loadLimitsData(String)} method.
   *
   * @author ActiveViam
   */
  @FunctionalInterface
  public interface ILimitsFileLoadingService {

    /**
     * Loads all limits data, including asOfDate, limit structures, limits, and incidents. This method
     * is intended to be called when Limits first connects to a server. Besides the AsOfDate, the
     * ordering of the calls is important to ensure that the data is loaded correctly:
     *
     * <ol>
     *   <li>1. Load the AsOfDate (this could be done at any point in this sequence)
     *   <li>2. Load the limit structures before the limits because creating limits requires
     *       information from the structures.
     *   <li>3. Load the limits before the incidents because creating incidents requires information
     *       from the limits
     *   <li>4. Load the incidents last because they are dependent on the limits.
     * </ol>
     *
     * @param serverName the name of the server for which to load the limits data
     */
    void loadLimitsData(String serverName);
  }
  ```
</Accordion>

Once you have created your custom implementation, [expose it as a Spring bean](.#importing-spring-beans-into-the-project) in your project and Spring will
use it instead of the default implementation.
