/*******************************************************************************
 * Copyright (c) 2008 IGA Tosiki, NTT DATA BUSINESS BRAINS Corp.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    IGA Tosiki (NTT DATA BUSINESS BRAINS Corp.) - initial API and implementation
 *******************************************************************************/
/*
 * blanco Framework
 * Copyright (C) 2008 NTT DATA BUSINESS BRAINS CORPORATION
 * 
 * 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.xliff;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;

import blanco.commons.util.BlancoFileUtil;
import blanco.xliff.valueobject.BlancoXliff;
import blanco.xliff.valueobject.BlancoXliffTool;

public class BlancoXliffUtil {
    /**
     * XLIFF情報のインスタンスを取得します。
     * 
     * 指定されたディレクトリにXLIFFが既にあればそれを利用します。XLIFFがまだ無い場合にはインスタンスを新規に作成します。(ファイル作成は伴いません)
     * 
     * @param argXliffdir
     * @param argBundleSymbolicName
     * @return
     */
    public static BlancoXliff getXliffInstance(final File fileXliffdir,
            final String argBundleSymbolicName) {
        BlancoXliff xliff;
        final File fileXliff = new File(fileXliffdir.getAbsolutePath() + "/"
                + argBundleSymbolicName + ".xlf");
        if (fileXliff.exists()) {
            // 存在する場合には読み込みます。
            xliff = new BlancoXliffParser().parse(fileXliff);
        } else {
            // 存在しない場合には新規作成します。
            xliff = new BlancoXliff();
            xliff.setSourceLanguage("en-US");
            xliff.setTargetLanguage("ja-JP");
        }
        return xliff;
    }

    /**
     * XLIFF情報を保存します。
     * 
     * @param xliff
     * @param argXliffdir
     * @param argBundleSymbolicName
     * @return
     * @throws IOException
     */
    public static int saveXliffInstance(final BlancoXliff xliff,
            final File fileXliffdir, final String argBundleSymbolicName)
            throws IOException {
        final File fileXliff = new File(fileXliffdir.getAbsolutePath() + "/"
                + argBundleSymbolicName + ".xlf");
        final ByteArrayOutputStream outStream = new ByteArrayOutputStream();

        new BlancoXliffSerializer().serialize(xliff, outStream);

        return BlancoFileUtil.bytes2FileIfNecessary(outStream.toByteArray(),
                fileXliff);
    }

    /**
     * XLIFFに tool 登録をセットします。
     * 
     * 無ければ追加、既に存在していれば内容を更新します。
     * 
     * @param xliff
     * @param tool
     */
    public static void setTool(final BlancoXliff xliff,
            final BlancoXliffTool tool) {
        for (int index = 0; index < xliff.getToolList().size(); index++) {
            final BlancoXliffTool toolLook = (BlancoXliffTool) xliff
                    .getToolList().get(index);
            if (toolLook.getToolId().equals(tool.getToolId())) {
                // 既に存在する。情報を上書き。
                toolLook.setToolName(tool.getToolName());

                return;
            }
        }

        // そのツールは未登録。内容を追加します。
        xliff.getToolList().add(tool);
    }
}
