/*
 * blancoDb Enterprise Edition
 * Copyright (C) 2004-2005 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.plugin.dbdotnet.editors;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import javax.xml.transform.dom.DOMResult;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.PlatformUI;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import blanco.commons.util.BlancoStringUtil;
import blanco.commons.util.BlancoXmlUtil;
import blanco.db.BlancoDbConstantsDotNet;
import blanco.db.common.valueobject.BlancoDbSetting;
import blanco.db.resourcebundle.BlancoDbDotNetResourceBundle;
import blanco.plugin.dbdotnet.BlancoDbDotNetPlugin;
import blanco.plugin.dbdotnet.BlancoDbDotNetPluginConstants;
import blanco.plugin.dbdotnet.actions.BlancoDbDotNetGenerateAction;

/**
 * blancoDbエディタ <br>
 * 
 * @author iga
 */
public class BlancoDbDotNetEditor extends AbstractBlancoDbDotNetEditor {
    /**
     * プラグインのリソースバンドル。
     */
    private static final BlancoDbDotNetResourceBundle fBundle = new BlancoDbDotNetResourceBundle();

    private Composite top = null;

    // ビジュアル領域
    private Text textBlancoDbSettingId = null;

    private Combo comboJdbcdriver = null;

    private Combo comboJdbcurl = null;

    private Combo comboJdbcuser = null;

    private Text textJdbcpassword = null;

    private Combo comboBasepackage = null;

    private Combo comboRuntimepackage = null;

    private Combo comboMetadir = null;

    private Combo comboSchema = null;

    private Combo comboSqlForm = null;

    private Button checkBoxTable = null;

    private Button checkBoxSql = null;

    private Button checkBoxLogging = null;

    private Text textStatementtimeout = null;

    public void createPartControl(Composite parent) {
        top = parent;
        top.setSize(new org.eclipse.swt.graphics.Point(1000, 400));

        GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        top.setLayout(layout);

        // スペーサー
        new Label(top, SWT.NONE).setText("");

        Label labelBlancoDbTitle = new Label(top, SWT.NONE);
        labelBlancoDbTitle.setText(BlancoDbConstantsDotNet.PRODUCT_NAME
                + " 設定ファイル エディタ (" + BlancoDbConstantsDotNet.VERSION + ")");

        // スペーサー
        new Label(top, SWT.NONE).setText("");

        // スペーサー
        new Label(top, SWT.NONE).setText("");

        Label labelBlancoDbSettingId = new Label(top, SWT.NONE);
        labelBlancoDbSettingId.setText(BlancoDbConstantsDotNet.PRODUCT_NAME
                + "設定ID");
        textBlancoDbSettingId = new Text(top, SWT.BORDER);
        textBlancoDbSettingId.setText(BlancoDbConstantsDotNet.PRODUCT_NAME
                + "設定");
        textBlancoDbSettingId.setEditable(false);
        Label labelJdbcdriver = new Label(top, SWT.NONE);
        labelJdbcdriver.setText("JDBCドライバ");
        createComboJdbcdriver();
        Label labelJdbcurl = new Label(top, SWT.NONE);
        labelJdbcurl.setText("URL");
        createComboJdbcurl();
        Label labelJdbcuser = new Label(top, SWT.NONE);
        labelJdbcuser.setText("ユーザ");
        createComboJdbcuser();
        Label labelJdbcpassword = new Label(top, SWT.NONE);
        labelJdbcpassword.setText("パスワード");
        textJdbcpassword = new Text(top, SWT.BORDER | SWT.PASSWORD);
        Label labelBasepackage = new Label(top, SWT.NONE);
        labelBasepackage.setText("基準パッケージ");
        createComboBasepackage();
        Label labelRuntimepackage = new Label(top, SWT.NONE);
        labelRuntimepackage.setText("ランタイムパッケージ");
        createComboRuntimepackage();

        // スペーサー
        new Label(top, SWT.NONE).setText("");

        Label labelPackageComment = new Label(top, SWT.NONE);
        labelPackageComment.setText("※パッケージを指定してください。");

        Label labelMetadir = new Label(top, SWT.NONE);
        labelMetadir.setText("メタディレクトリ");
        createComboMetadir();

        // スペーサー
        new Label(top, SWT.NONE).setText("");

        Label labelMetadirComment = new Label(top, SWT.NONE);
        labelMetadirComment.setText("※メタディレクトリは通常変更せずに利用します。");

        Label labelSchema = new Label(top, SWT.NONE);
        labelSchema.setText("スキーマ");
        createComboSchema();

        // スペーサー
        new Label(top, SWT.NONE).setText("");

        Button buttonConnectionCheck = new Button(top, SWT.NONE);
        buttonConnectionCheck.setText("接続チェック");
        buttonConnectionCheck
                .addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
                    public void widgetSelected(
                            org.eclipse.swt.events.SelectionEvent e) {
                        if (checkInputField() == false) {
                            return;
                        }
                        try {
                            checkConnectionSetting(comboJdbcdriver.getText(),
                                    comboJdbcurl.getText(), comboJdbcuser
                                            .getText(), textJdbcpassword
                                            .getText(), true);
                        } catch (IOException e1) {
                            e1.printStackTrace();
                        }
                    }
                });

        // スペーサー
        new Label(top, SWT.NONE).setText("");

        Button buttonCreateMetafile = new Button(top, SWT.NONE);
        buttonCreateMetafile
                .setText(fBundle.getMetafileDisplayname() + " 新規作成");
        buttonCreateMetafile
                .addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
                    public void widgetSelected(
                            org.eclipse.swt.events.SelectionEvent e) {
                        // メタファイル作成の際には、他の項目のチェックは行いません。
                        saveToTextEditor();

                        if (comboMetadir.getText().length() == 0) {
                            MessageDialog.openWarning(top.getShell(), fBundle
                                    .getMetafileDisplayname()
                                    + " 新規作成", "メタディレクトリ名を指定してください。\n"
                                    + "※メタディレクトリ名の一般的な設定値は 'meta/sql' です。");
                            return;
                        }

                        final IFileEditorInput input = (IFileEditorInput) getEditorInput();

                        try {
                            if (BlancoDbDotNetPluginUtil.findFolder(
                                    input.getFile(), getProgressMonitor(),
                                    comboMetadir.getText()).exists() == false) {
                                BlancoDbDotNetPluginUtil.createFolder(input
                                        .getFile(), getProgressMonitor(),
                                        comboMetadir.getText());

                                MessageDialog.openInformation(top.getShell(),
                                        "メタディレクトリの作成", "メタディレクトリ ["
                                                + comboMetadir.getText()
                                                + "] を新規に作成しました。\n"
                                                + "※初回にのみ必要な動作です。");
                            }
                        } catch (CoreException e3) {
                            MessageDialog.openWarning(top.getShell(), fBundle
                                    .getMetafileDisplayname()
                                    + " 新規作成", "メタディレクトリ作成に失敗しました。処理中断します。:"
                                    + e3.toString());
                            e3.printStackTrace();
                            return;
                        }

                        try {
                            URL localURL = BlancoDbDotNetPlugin.getPluginRoot();

                            InputDialog inputDialog = new InputDialog(top
                                    .getShell(), fBundle
                                    .getMetafileDisplayname()
                                    + " 新規作成", fBundle.getMetafileDisplayname()
                                    + "(メタファイル)をメタディレクトリ["
                                    + comboMetadir.getText() + "]に作成します。"
                                    + fBundle.getMetafileDisplayname()
                                    + "の新規ファイル名を入力してください。",
                                    "blancoDbDotNetMeta.xls",
                                    new IInputValidator() {
                                        public String isValid(String newText) {
                                            if (newText.endsWith(".xls") == false) {
                                                return "ファイル名は .xlsで終了するように指定してください。";
                                            }
                                            // 既にそのファイルが存在しないかどうかをチェック
                                            IFile newFileMeta = input.getFile()
                                                    .getProject().getFolder(
                                                            comboMetadir
                                                                    .getText())
                                                    .getFile(newText);
                                            if (newFileMeta.exists()) {
                                                return "指定のファイルは既に存在しています。"
                                                        + "別のファイル名を指定してください。";
                                            }
                                            return null;
                                        }
                                    });
                            if (inputDialog.open() == InputDialog.CANCEL) {
                                inputDialog.close();
                                return;
                            }
                            final String newMetaFilename = inputDialog
                                    .getValue();
                            inputDialog.close();

                            String fileName = "blancoDbDotNetTemplate.xls";
                            if (comboSqlForm.getText().equals("Japanese")) {
                                fileName = "blancoDbDotNetTemplate_ja.xls";
                            }

                            // プラグインのローカルからテンプレートを読み込みます。
                            InputStream inStream = new FileInputStream(localURL
                                    .getPath()
                                    + "/meta/sql/template/" + fileName);
                            IFile newFileMeta = input.getFile().getProject()
                                    .getFolder(comboMetadir.getText()).getFile(
                                            newMetaFilename);
                            newFileMeta.create(inStream, true,
                                    getProgressMonitor());
                            inStream.close();
                            MessageDialog
                                    .openInformation(
                                            top.getShell(),
                                            fBundle.getMetafileDisplayname()
                                                    + " 新規作成",
                                            fBundle.getMetafileDisplayname()
                                                    + "["
                                                    + newMetaFilename
                                                    + "] をメタディレクトリ["
                                                    + comboMetadir.getText()
                                                    + "]に新規作成しました。\n"
                                                    + "このファイルを編集して、SQLおよび関連情報を設定してください。");
                        } catch (CoreException e1) {
                            e1.printStackTrace();
                            return;
                        } catch (IOException e2) {
                            MessageDialog.openWarning(top.getShell(), "メタファイル",
                                    "メタファイルのコピーに失敗しました。:" + e2.toString());
                            e2.printStackTrace();
                        }

                    }
                });

        // スペーサー
        new Label(top, SWT.NONE).setText("");

        Group groupSqlDef = new Group(top, SWT.NONE);
        groupSqlDef.setLayout(new FillLayout());
        groupSqlDef.setText("SQL定義書新規作成オプション");
        comboSqlForm = new Combo(groupSqlDef, SWT.READ_ONLY);
        comboSqlForm.add("English");
        comboSqlForm.add("Japanese");
        comboSqlForm.select(1);

        // スペーサー
        new Label(top, SWT.NONE).setText("");

        Button buttonExecute = new Button(top, SWT.NONE);
        buttonExecute.setText("ソースコード生成");
        buttonExecute
                .addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
                    public void widgetSelected(
                            org.eclipse.swt.events.SelectionEvent e) {

                        if (textStatementtimeout.getText().length() > 0) {
                            try {
                                Integer
                                        .parseInt(textStatementtimeout
                                                .getText());
                            } catch (NumberFormatException ex) {
                                MessageDialog.openWarning(top.getShell(),
                                        "項目に入力された値が不正です",
                                        "ステートメントタイムアウト項目への入力値が不正です。\n数値を入力してください\n"
                                                + ex.toString());
                                return;
                            }
                        }

                        if (checkInputField() == false) {
                            return;
                        }

                        try {
                            if (checkInputField() == false) {
                                return;
                            }
                            if (checkConnectionSetting(comboJdbcdriver
                                    .getText(), comboJdbcurl.getText(),
                                    comboJdbcuser.getText(), textJdbcpassword
                                            .getText(), false) == false) {
                                return;
                            }

                            final BlancoDbSetting dbSetting = new BlancoDbSetting();
                            dbSetting
                                    .setBasePackage(comboBasepackage.getText());
                            dbSetting.setRuntimePackage(comboRuntimepackage
                                    .getText());
                            dbSetting.setJdbcdriver(comboJdbcdriver.getText());
                            dbSetting.setJdbcurl(comboJdbcurl.getText());
                            dbSetting.setJdbcuser(comboJdbcuser.getText());
                            dbSetting.setJdbcpassword(textJdbcpassword
                                    .getText());
                            final String jdbcSchema = comboSchema.getText();
                            if (jdbcSchema != null && jdbcSchema.length() > 0) {
                                // スキーマ名を指定。
                                // 指定がある場合にのみセットするのが作法です。
                                dbSetting.setSchema(jdbcSchema);
                            }

                            dbSetting
                                    .setLogging(checkBoxLogging.getSelection());
                            if (BlancoStringUtil.null2Blank(
                                    textStatementtimeout.getText()).length() > 0) {
                                try {
                                    dbSetting.setStatementTimeout(Integer
                                            .parseInt(textStatementtimeout
                                                    .getText()));
                                } catch (NumberFormatException ex) {
                                    throw new IllegalArgumentException(
                                            "ステートメントタイムアウト値として指定された値["
                                                    + textStatementtimeout
                                                            .getText()
                                                    + "]は数値として解析できませんでした。処理中断します。:"
                                                    + ex.toString());
                                }
                            }

                            BlancoDbDotNetGenerateAction.processBlancoDb(
                                    ((IFileEditorInput) getEditorInput())
                                            .getFile(), top.getShell(),
                                    getProgressMonitor(), comboMetadir
                                            .getText(), dbSetting,
                                    checkBoxTable.getSelection(), checkBoxSql
                                            .getSelection());
                        } catch (Exception ex) {
                            ex.printStackTrace();
                            StringWriter writer = new StringWriter();
                            ex.printStackTrace(new PrintWriter(writer));
                            writer.flush();
                            MessageDialog.openError(top.getShell(), "ソースコード生成",
                                    "回復不能なエラーが発生.:" + ex.toString() + ": "
                                            + writer.toString());
                        }
                    }
                });

        // スペーサー
        new Label(top, SWT.NONE).setText("");

        Group group = new Group(top, SWT.NONE);
        group.setLayout(new FillLayout());
        group.setText("ソースコード生成オプション");
        checkBoxTable = new Button(group, SWT.CHECK);
        checkBoxTable.setText("単一表");
        checkBoxTable.setSelection(true);
        checkBoxSql = new Button(group, SWT.CHECK);
        checkBoxSql.setText("SQL定義");
        checkBoxSql.setSelection(true);
        checkBoxLogging = new Button(group, SWT.CHECK);
        checkBoxLogging.setText("ロギング");
        checkBoxLogging.setSelection(false);
        // ロギングは現時点では対応していません。
        checkBoxLogging.setEnabled(false);

        // スペーサー
        new Label(top, SWT.NONE).setText("");

        Label labelPasswordComment = new Label(top, SWT.NONE);
        labelPasswordComment.setText("※注意: 各々の設定値は "
                + BlancoDbDotNetPluginConstants.TARGET_FILENAME
                + "ファイルに平文で格納されます。");

        // スペーサー
        new Label(top, SWT.NONE).setText("");

        Label labelPasswordComment2 = new Label(top, SWT.NONE);
        labelPasswordComment2.setText("※セキュリティ要件を確認して適切な対処をおこなってください。");

        {
            final Label labelStatementtimeout = new Label(top, SWT.NONE);
            labelStatementtimeout.setText("ステートメントタイムアウト");
            textStatementtimeout = new Text(top, SWT.BORDER);
        }

        // スペーサー
        new Label(top, SWT.NONE).setText("");
        {
            final Label labelPasswordComment3 = new Label(top, SWT.NONE);
            labelPasswordComment3.setText("※ステートメントタイムアウト値には秒数を指定します。");
        }

        // スペーサー
        new Label(top, SWT.NONE).setText("");
        {
            final Label labelPasswordComment3 = new Label(top, SWT.NONE);
            labelPasswordComment3.setText("※全てのステートメントのデフォルトタイムアウト値として利用されます。");
        }

        loadFromTextEditor();

        // フォーカスを失った際の処理を実装。
        setFocusLostHandler(comboJdbcdriver);
        setFocusLostHandler(comboJdbcurl);
        setFocusLostHandler(comboJdbcuser);
        setFocusLostHandler(textJdbcpassword);
        setFocusLostHandler(comboBasepackage);
        setFocusLostHandler(comboRuntimepackage);
        setFocusLostHandler(comboMetadir);
        setFocusLostHandler(comboSchema);
        setFocusLostHandler(comboSqlForm);
        setFocusLostHandler(checkBoxTable);
        setFocusLostHandler(checkBoxSql);
        setFocusLostHandler(checkBoxLogging);
        setFocusLostHandler(textStatementtimeout);
    }

    /**
     * 接続設定通りに接続可能かどうかを調べます。
     * 
     * @throws IOException
     * 
     */
    private boolean checkConnectionSetting(final String jdbcdriver,
            final String jdbcurl, final String jdbcuser,
            final String jdbcpassword, final boolean isReportSuccess)
            throws IOException {
        try {
            PlatformUI.getWorkbench().getProgressService().busyCursorWhile(
                    new IRunnableWithProgress() {
                        public void run(IProgressMonitor monitor)
                                throws InvocationTargetException,
                                InterruptedException {
                            monitor.beginTask("接続チェックをおこないます。", 5);
                            monitor.worked(1);
                            try {
                                Class.forName(jdbcdriver);
                                monitor.worked(1);
                                Connection conn = DriverManager.getConnection(
                                        jdbcurl, jdbcuser, jdbcpassword);
                                monitor.worked(1);
                                conn.close();
                                monitor.worked(1);
                            } catch (Exception e) {
                                throw new InvocationTargetException(e, e
                                        .toString());
                            } catch (Error e) {
                                throw new InvocationTargetException(e, e
                                        .toString());
                            }
                        }
                    });
            if (isReportSuccess) {
                MessageDialog
                        .openInformation(top.getShell(), "接続チェック成功",
                                "データベースへの接続試験に成功しました.\n現在の設定でデータベースに接続可能であることが確認できました。");
            }
            return true;
        } catch (InvocationTargetException e) {
            Throwable cause = e.getCause();
            if (cause instanceof SQLException) {
                MessageDialog.openWarning(top.getShell(), "接続チェック失敗",
                        "接続に失敗しました。\n"
                                + "環境にまつわる設定値や、ユーザ名・パスワードなどを確認してください。\n\n"
                                + cause.toString());
            } else if (cause instanceof ClassNotFoundException) {
                MessageDialog
                        .openWarning(
                                top.getShell(),
                                "接続チェック失敗",
                                "指定のJDBCドライバ("
                                        + comboJdbcdriver.getText()
                                        + ")の読み込みに失敗しました。\n\n"
                                        + "JDBCドライバが読み込めるように調整を行う必要がある可能性があります。\n"
                                        + "BlancoDbEEPluginプラグインのフォルダ内の下記の箇所を調査してください。\n"
                                        + "  ※フォルダ ["
                                        + BlancoDbDotNetPlugin.getPluginRoot()
                                                .getPath()
                                        + "] がプラグインのフォルダです\n"
                                        + "1.プラグインのライブラリ設定\n"
                                        + "  META-INF/MANIFEST.MFファイルの Bundle-ClassPathエントリに \n"
                                        + "      lib/JDBCドライバ.jar"
                                        + "    の記載があることを確認します。\n"
                                        + "    無い場合には追加してください。\n"
                                        + "  ※「JDBCドライバ.jar」は実際のjarファイル名へと適宜読替を行ってください。\n"
                                        + "2.指定したプラグインフォルダ内の lib/JDBCドライバ.jar が\n"
                                        + "  実際に存在することを確認します。\n"
                                        + "  ※現在利用しているJavaプロジェクトのlibフォルダではない点に\n"
                                        + "    注意してください。\n"
                                        + "3.確認が終わり、もし変更点があった場合には 変更後にEclipseの再起動\n"
                                        + "  を行ってください。\n"
                                        + "  なお、META-INF/MANIFEST.MFファイルを変更した場合には\n"
                                        + "  eclipse -cleanのようにオプション付きで起動してください。\n\n"
                                        + cause.toString());
            } else {
                MessageDialog.openWarning(top.getShell(), "接続チェック失敗",
                        "接続に失敗しました。\n" + "想定しないエラーが発生しました。\n\n"
                                + cause.toString());
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return false;
    }

    protected void loadFromTextEditorInternal(final DOMResult argResult) {
        final Node nodeRoot = argResult.getNode();
        if (nodeRoot == null) {
            return;
        }
        final Element elementBlancoDb = BlancoXmlUtil.getElement(nodeRoot,
                "blanco/target/blancodbdotnet");
        if (elementBlancoDb == null) {
            return;
        }

        final String jdbcdriver = elementBlancoDb.getAttribute("jdbcdriver");
        if (jdbcdriver != null) {
            comboJdbcdriver.setText(jdbcdriver);
        }
        final String jdbcurl = elementBlancoDb.getAttribute("jdbcurl");
        if (jdbcurl != null) {
            comboJdbcurl.setText(jdbcurl);
        }
        final String jdbcuser = elementBlancoDb.getAttribute("jdbcuser");
        if (jdbcuser != null) {
            comboJdbcuser.setText(jdbcuser);
        }
        final String jdbcpassword = elementBlancoDb
                .getAttribute("jdbcpassword");
        if (jdbcpassword != null) {
            textJdbcpassword.setText(jdbcpassword);
        }
        final String basepackage = elementBlancoDb.getAttribute("basepackage");
        if (basepackage != null) {
            comboBasepackage.setText(basepackage);
        }
        final String runtimepackage = elementBlancoDb
                .getAttribute("runtimepackage");
        if (runtimepackage != null) {
            comboRuntimepackage.setText(runtimepackage);
        }
        final String metadir = elementBlancoDb.getAttribute("metadir");
        if (metadir != null) {
            comboMetadir.setText(metadir);
        }
        final String schema = elementBlancoDb.getAttribute("schema");
        if (schema != null) {
            comboSchema.setText(schema);
        }
        final String table = elementBlancoDb.getAttribute("table");
        if (table != null) {
            checkBoxTable.setSelection(table.equals("true"));
        }
        final String sql = elementBlancoDb.getAttribute("sql");
        if (sql != null) {
            checkBoxSql.setSelection(sql.equals("true"));
        }
        final String logging = elementBlancoDb.getAttribute("log");
        if (logging != null) {
            checkBoxLogging.setSelection(logging.equals("true"));
        }
        final String statementtimeout = elementBlancoDb
                .getAttribute("statementtimeout");
        if (statementtimeout != null) {
            textStatementtimeout.setText(statementtimeout);
        }
    }

    protected Document saveToTextEditorInternal() {
        String schema = null;
        if (comboSchema.getText().trim().length() > 0) {
            schema = comboSchema.getText();
        }

        String runtimepackage = null;
        if (comboRuntimepackage.getText().trim().length() > 0) {
            runtimepackage = comboRuntimepackage.getText();
        }

        final Document document = BlancoXmlUtil.newDocument();
        final Element eleBlanco = document.createElement("blanco");
        document.appendChild(eleBlanco);

        final Element eleTarget = document.createElement("target");
        eleTarget.setAttribute("name", textBlancoDbSettingId.getText());
        eleBlanco.appendChild(eleTarget);

        final Element eleBlancoDb = document.createElement("blancodbdotnet");
        eleTarget.appendChild(eleBlancoDb);

        eleBlancoDb.setAttribute("jdbcdriver", comboJdbcdriver.getText());
        eleBlancoDb.setAttribute("jdbcurl", comboJdbcurl.getText());
        eleBlancoDb.setAttribute("jdbcuser", comboJdbcuser.getText());
        eleBlancoDb.setAttribute("jdbcpassword", textJdbcpassword.getText());
        eleBlancoDb.setAttribute("basepackage", comboBasepackage.getText());
        if (runtimepackage != null) {
            eleBlancoDb.setAttribute("runtimepackage", runtimepackage);
        }
        eleBlancoDb.setAttribute("metadir", comboMetadir.getText());
        eleBlancoDb.setAttribute("table", checkBoxTable.getSelection() ? "true"
                : "false");
        eleBlancoDb.setAttribute("sql", checkBoxSql.getSelection() ? "true"
                : "false");
        eleBlancoDb.setAttribute("log", checkBoxLogging.getSelection() ? "true"
                : "false");
        if (schema != null) {
            eleBlancoDb.setAttribute("schema", schema);
        }
        eleBlancoDb.setAttribute("statementtimeout", textStatementtimeout
                .getText());

        return document;
    }

    /**
     * 入力項目のチェックを実施します。 <br>
     * エラーダイアログはこのメソッドで表示します。
     * 
     * @return
     */
    private final boolean checkInputField() {
        boolean isError = false;
        if (comboJdbcdriver.getText().length() == 0) {
            comboJdbcdriver.setBackground(top.getDisplay().getSystemColor(
                    SWT.COLOR_YELLOW));
            isError = true;
        } else {
            comboJdbcdriver.setBackground(top.getDisplay().getSystemColor(
                    SWT.COLOR_INFO_BACKGROUND));
        }

        if (comboJdbcurl.getText().length() == 0) {
            comboJdbcurl.setBackground(top.getDisplay().getSystemColor(
                    SWT.COLOR_YELLOW));
            isError = true;
        } else {
            comboJdbcurl.setBackground(top.getDisplay().getSystemColor(
                    SWT.COLOR_INFO_BACKGROUND));
        }

        if (comboJdbcuser.getText().length() == 0) {
            comboJdbcuser.setBackground(top.getDisplay().getSystemColor(
                    SWT.COLOR_YELLOW));
            isError = true;
        } else {
            comboJdbcuser.setBackground(top.getDisplay().getSystemColor(
                    SWT.COLOR_INFO_BACKGROUND));
        }

        if (comboBasepackage.getText().length() == 0) {
            comboBasepackage.setBackground(top.getDisplay().getSystemColor(
                    SWT.COLOR_YELLOW));
            isError = true;
        } else {
            comboBasepackage.setBackground(top.getDisplay().getSystemColor(
                    SWT.COLOR_INFO_BACKGROUND));
        }

        if (comboMetadir.getText().length() == 0) {
            comboMetadir.setBackground(top.getDisplay().getSystemColor(
                    SWT.COLOR_YELLOW));
            isError = true;
        } else {
            comboMetadir.setBackground(top.getDisplay().getSystemColor(
                    SWT.COLOR_INFO_BACKGROUND));
        }

        if (isError) {
            MessageDialog.openWarning(top.getShell(), "必須項目への入力が足りません",
                    "必須項目への入力が足りません。\nハイライト表示されている必須項目に値を入力してください");
        }

        return !isError;
    }

    /**
     * This method initializes comboJdbcdriver
     * 
     */
    private void createComboJdbcdriver() {
        comboJdbcdriver = new Combo(top, SWT.NONE);
        comboJdbcdriver
                .addSelectionListener(new org.eclipse.swt.events.SelectionListener() {
                    public void widgetSelected(
                            org.eclipse.swt.events.SelectionEvent e) {

                        Object source = e.getSource();
                        if (source instanceof Combo) {
                            Combo combo = (Combo) source;
                            if (combo.getText().equals(
                                    "oracle.jdbc.driver.OracleDriver")) {
                                comboJdbcurl
                                        .setText("jdbc:oracle:thin:@localhost:1521:orcl");
                                comboJdbcuser.removeAll();
                                comboJdbcuser.add("SCOTT");
                                comboSchema.removeAll();
                                comboSchema.add("SCOTT");
                                comboSchema.setText("SCOTT");
                            } else if (combo
                                    .getText()
                                    .equals(
                                            "com.microsoft.sqlserver.jdbc.SQLServerDriver")) {
                                // Microsoft SQL Server 2005
                                comboJdbcurl
                                        .setText("jdbc:sqlserver://localhost");
                                comboJdbcuser.removeAll();
                                comboJdbcuser.add("sa");
                                comboSchema.removeAll();
                            } else if (combo
                                    .getText()
                                    .equals(
                                            "com.microsoft.jdbc.sqlserver.SQLServerDriver")) {
                                // Microsoft SQL Server 2000
                                comboJdbcurl
                                        .setText("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=Northwind;SelectMethod=cursor");
                                comboJdbcuser.removeAll();
                                comboJdbcuser.add("sa");
                                comboSchema.removeAll();
                            } else if (combo.getText().equals(
                                    "org.postgresql.Driver")) {
                                comboJdbcurl
                                        .setText("jdbc:postgresql://localhost:5432/template1");
                                comboJdbcuser.removeAll();
                                comboJdbcuser.add("postgres");
                                comboSchema.removeAll();
                            } else if (combo.getText().equals(
                                    "com.mysql.jdbc.Driver")) {
                                comboJdbcurl
                                        .setText("jdbc:mysql://localhost:3306/test?useUnicode=true");
                                comboJdbcuser.removeAll();
                                comboJdbcuser.add("root");
                                comboSchema.removeAll();
                            }
                        }
                    }

                    public void widgetDefaultSelected(
                            org.eclipse.swt.events.SelectionEvent e) {
                    }
                });
        // comboJdbcdriver.add("oracle.jdbc.driver.OracleDriver");
        // Microsoft SQL Server 2005
        comboJdbcdriver.add("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        // Microsoft SQL Server 2000
        comboJdbcdriver.add("com.microsoft.jdbc.sqlserver.SQLServerDriver");
        // comboJdbcdriver.add("org.postgresql.Driver");
        // comboJdbcdriver.add("com.mysql.jdbc.Driver");
    }

    /**
     * This method initializes comboJdbcurl
     * 
     */
    private void createComboJdbcurl() {
        comboJdbcurl = new Combo(top, SWT.NONE);
    }

    /**
     * This method initializes comboJdbcuser
     * 
     */
    private void createComboJdbcuser() {
        comboJdbcuser = new Combo(top, SWT.NONE);
    }

    /**
     * This method initializes comboBasepackage
     * 
     */
    private void createComboBasepackage() {
        comboBasepackage = new Combo(top, SWT.NONE);
        comboBasepackage.add("myapp.db");
        comboBasepackage.add("mycompany.myapp.db");
        comboBasepackage.select(0);
    }

    /**
     * This method initializes comboRuntimepackage
     * 
     */
    private void createComboRuntimepackage() {
        comboRuntimepackage = new Combo(top, SWT.NONE);
        comboRuntimepackage.add("myapp.db");
        comboRuntimepackage.add("mycompany.myapp.db");
    }

    /**
     * This method initializes comboMetadir
     * 
     */
    private void createComboMetadir() {
        comboMetadir = new Combo(top, SWT.NONE);
        comboMetadir.add("meta/sql");
        comboMetadir.select(0);
    }

    /**
     * This method initializes comboSchema
     * 
     */
    private void createComboSchema() {
        comboSchema = new Combo(top, SWT.NONE);
    }
}