/*
 * blanco Framework
 * Copyright (C) 2004-2006 IGA Tosiki
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 */
package blanco.cg.util;

import blanco.cg.BlancoCgSupportedLang;
import blanco.commons.util.BlancoJavaSourceUtil;
import blanco.commons.util.BlancoPhpSourceUtil;
import blanco.commons.util.BlancoVbSourceUtil;

/**
 * blancoCgのソースコード関連ユーティリティです。
 * 
 * このクラスはプログラミング言語を超えて利用されます。
 * 
 * @author IGA Tosiki
 */
public class BlancoCgSourceUtil {
    /**
     * 与えられた文字列をソースコード文字列として出力するものとしてエスケープ処理します。
     * 
     * ￥/バックスラッシュのエスケープおよび改行コードのエスケープを行います。<br>
     * それ以外の処理は行いません。たとえばインジェクション攻撃などへの耐性は、このメソッドは扱いません。
     * 
     * @param targetLang
     *            出力対象のプログラミング言語。
     * @param originalString
     *            入力文字列。
     * @return エスケープ処理が行われた後の文字列。
     */
    public static String escapeStringAsSource(final int targetLang,
            final String originalString) {
        switch (targetLang) {
        case BlancoCgSupportedLang.JAVA:
        case BlancoCgSupportedLang.CS:
        case BlancoCgSupportedLang.JS:
            return BlancoJavaSourceUtil
                    .escapeStringAsJavaSource(originalString);
        case BlancoCgSupportedLang.VB:
            return BlancoVbSourceUtil.escapeStringAsVbSource(originalString);
        case BlancoCgSupportedLang.PHP:
        case BlancoCgSupportedLang.RUBY: // TODO 妥当性の確認
        case BlancoCgSupportedLang.PYTHON: // TODO 妥当性の確認
            return BlancoPhpSourceUtil.escapeStringAsPhpSource(originalString);
        default:
            throw new IllegalArgumentException(
                    "BlancoCgSourceUtil.escapeAsSourceString にサポートされない言語("
                            + targetLang + ")が引数として与えられました。");
        }
    }

    /**
     * 与えられた文字列を言語ドキュメント文字列として扱うことができるように エスケープ処理します。
     * 
     * JavaDoc文字列としてエスケープを行います。 HTMLとしてのエスケープと同等の処理が行われます。＜＞＆”がエスケープされます。
     * 
     * @param targetLang
     *            出力対象のプログラミング言語。
     * @param originalString
     *            入力文字列
     * @return エスケープ処理が行われた後の文字列。
     */
    public static final String escapeStringAsLangDoc(final int targetLang,
            final String originalString) {
        switch (targetLang) {
        case BlancoCgSupportedLang.JAVA:
        case BlancoCgSupportedLang.CS:
        case BlancoCgSupportedLang.JS:
        case BlancoCgSupportedLang.VB:
        case BlancoCgSupportedLang.PHP:
        case BlancoCgSupportedLang.RUBY:
        case BlancoCgSupportedLang.PYTHON:
            return BlancoJavaSourceUtil.escapeStringAsJavaDoc(originalString);
        default:
            throw new IllegalArgumentException(
                    "BlancoCgSourceUtil.escapeStringAsLangDoc にサポートされない言語("
                            + targetLang + ")が引数として与えられました。");
        }
    }
}