/*
 * 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.catalina.storeconfig;

import java.io.PrintWriter;

import org.apache.tomcat.JarScanFilter;
import org.apache.tomcat.JarScanner;

/**
 * Store server.xml Element JarScanner
 */
public class JarScannerSF extends StoreFactoryBase {

    /**
     * Store the specified JarScanner properties and children
     * (JarScannerFilter)
     *
     * @param aWriter
     *            PrintWriter to which we are storing
     * @param indent
     *            Number of spaces to indent this element
     * @param aJarScanner
     *            JarScanner whose properties are being stored
     *
     * @exception Exception
     *                if an exception occurs while storing
     */
    @Override
    public void storeChildren(PrintWriter aWriter, int indent, Object aJarScanner,
            StoreDescription parentDesc) throws Exception {
        if (aJarScanner instanceof JarScanner) {
            JarScanner jarScanner = (JarScanner) aJarScanner;
            // Store nested <JarScanFilter> element
            JarScanFilter jarScanFilter = jarScanner.getJarScanFilter();
            if (jarScanFilter != null) {
                storeElement(aWriter, indent, jarScanFilter);
            }
        }
    }

}