/*
 * 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.sling.testing.clients.util.config;

/**
 * Allows saving and restoring an instance configuration.
 * Implementations define the behaviour of save() and restore()
 */
public interface InstanceConfig {

    /**
     * Saves the current status of the configuration
     *
     * @return this
     * @throws InstanceConfigException if saving the configuration fails
     */
    public InstanceConfig save() throws InstanceConfigException;

    /**
     * Restores the saved status of the configuration
     *
     * @return this
     * @throws InstanceConfigException if restoring the configuration fails
     */
    public InstanceConfig restore() throws InstanceConfigException;
}
