/*
 * 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.
 */

package org.apache.nlpcraft.model;

/**
 * Lifecycle component.
 * <p>
 * This interface defines lifecycle hooks for user-defined components that are instantiated by NLPCraft like
 * probe components, custom NER parsers and value loaders. This hooks can be used to integrated with various IoC
 * frameworks, control lifecycle of external libraries and systems, perform initialization and cleanup
 * operations, etc.
 * <p>
 * Note that probe lifecycle components are configured via <code>nlpcraft.probe.lifecycle </code> probe
 * configuration property that accept list of fully qualified class names where each class should implement this
 * interface. See <a target=_ href="https://nlpcraft.apache.org/server-and-probe.html">documentation</a> on how to configure
 * a data probe.
 */
public interface NCLifecycle {
    /**
     * Called before lifecycle component is used and just after its creation. This method is guaranteed to be
     * called. Default implementation is no-op.
     */
    default void onInit() {}
    
    /**
     * Called after lifecycle components is no longer needed. Unlike {@link #onInit()} method this call is
     * optional and not guaranteed. Default implementation is a no-op.
     */
    default void onDiscard() {}
}
