/*
 * 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 freemarker.test;

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

import org.apache.commons.io.IOUtils;

import freemarker.cache.TemplateLoader;
import freemarker.test.utility.TestUtil;

/**
 * Removes the Apache copyright boiler plate from the beginning of the template, so that they don't mess up the expected
 * template output. This can interfere with tests that try to test I/O errors and such low level things, so use with
 * care. 
 */
public class CopyrightCommentRemoverTemplateLoader implements TemplateLoader {

    private final TemplateLoader innerTemplateLoader;

    public CopyrightCommentRemoverTemplateLoader(TemplateLoader innerTemplateLoader) {
        this.innerTemplateLoader = innerTemplateLoader;
    }

    public Object findTemplateSource(String name) throws IOException {
        return innerTemplateLoader.findTemplateSource(name);
    }

    public long getLastModified(Object templateSource) {
        return innerTemplateLoader.getLastModified(templateSource);
    }

    public Reader getReader(Object templateSource, String encoding) throws IOException {
        try (Reader reader = innerTemplateLoader.getReader(templateSource, encoding)) {
            String content = IOUtils.toString(reader);
            return new StringReader(TestUtil.removeFTLCopyrightComment(content));
        }
    }

    public void closeTemplateSource(Object templateSource) throws IOException {
        innerTemplateLoader.closeTemplateSource(templateSource);
    }

}
