/*
 * 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.kafka.streams.processor;

import org.apache.kafka.streams.errors.StreamsException;

/**
 * A storage engine for managing state maintained by a stream processor.
 *
 * <p>
 * This interface does not specify any query capabilities, which, of course,
 * would be query engine specific. Instead it just specifies the minimum
 * functionality required to reload a storage engine from its changelog as well
 * as basic lifecycle management.
 * </p>
 */
public interface StateStore {

    /**
     * The name of this store.
     * @return the storage name
     */
    String name();

    /**
     * Initializes this state store
     * @throws IllegalStateException If store gets registered after initialized is already finished
     * @throws StreamsException if the store's change log does not contain the partition
     */
    void init(ProcessorContext context, StateStore root);

    /**
     * Flush any cached data
     */
    void flush();

    /**
     * Close the storage engine.
     * Note that this function needs to be idempotent since it may be called
     * several times on the same state store.
     * <p>
     * Users only need to implement this function but should NEVER need to call this api explicitly
     * as it will be called by the library automatically when necessary
     */
    void close();

    /**
     * Return if the storage is persistent or not.
     *
     * @return  {@code true} if the storage is persistent&mdash;{@code false} otherwise
     */
    boolean persistent();

    /**
     * Is this store open for reading and writing
     * @return {@code true} if the store is open
     */
    boolean isOpen();
}

@@ -974,17 +974,850 @@
 ssor.%0A *
+ %3Cp%3E%0A * If the store is implemented as a persistent store, it %3Cem%3Emust%3C/em%3E use the store name as directory name and write%0A * all data into this store directory.%0A * The store directory must be created with the state directory.%0A * The state directory can be obtained via %7B@link ProcessorContext#stateDir() #stateDir()%7D using the%0A * %7B@link ProcessorContext%7D provided via %7B@link #init(ProcessorContext, StateStore) init(...)%7D.%0A * %3Cp%3E%0A * Using nested store directories within the state directory isolates different state stores.%0A * If a state store would write into the state directory directly, it might conflict with others state stores and thus,%0A * data might get corrupted and/or Streams might fail with an error.%0A * Furthermore, Kafka Streams relies on using the store name as store directory name to perform internal cleanup tasks.
 %0A
-
  * %3Cp%3E%0A 
@@ -2045,16 +2045,16 @@
 as well%0A
+
  * as ba
@@ -2083,16 +2083,8 @@
 nt.%0A
- * %3C/p%3E%0A
  */%0A

improve StateStore JavaDocs