/*
 * Copyright (C) 2009 The Android Open Source Project
 *
 * Licensed 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 signature.io.html;

import java.io.InputStream;
import java.io.InputStreamReader;

import org.antlr.stringtemplate.StringTemplate;
import org.antlr.stringtemplate.StringTemplateGroup;
import org.antlr.stringtemplate.language.DefaultTemplateLexer;

public class TemplateStore {

    private static StringTemplateGroup group = initialize();


    private static StringTemplateGroup initialize() {
        InputStream modelStream = TemplateStore.class.getClassLoader()
                .getResourceAsStream("model/model.stg");
        InputStreamReader modelReader = new InputStreamReader(modelStream);
        StringTemplateGroup modelGroup = new StringTemplateGroup(modelReader,
                DefaultTemplateLexer.class);

        InputStream stream = TemplateStore.class.getClassLoader()
                .getResourceAsStream("delta/deltas.stg");
        InputStreamReader reader = new InputStreamReader(stream);
        StringTemplateGroup deltaGroup = new StringTemplateGroup(reader,
                DefaultTemplateLexer.class);

        StringTemplateGroup group = new StringTemplateGroup("signature", null,
                DefaultTemplateLexer.class);
        group.setSuperGroup(deltaGroup);

        deltaGroup.setSuperGroup(modelGroup);
        return group;
    }

    private TemplateStore() {/* no instances allowed */
    }

    public static StringTemplate getStringTemplate(String name) {
        return group.getInstanceOf(name);
    }
}
