2007 年 4 月 27 日 22 時 15 分

ルールを追加できるようにする


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


ルールの追加は、/filter/update-rule.do が受ける。
edit-rule.jsp からフォームが送信されると、
FilterRuleForm 型インスタンスとして受け取るので、
このデータを使ってパケットフィルタの設定を更新する。

ま、やることは FilterInfoForm の時と同じだ。
まずは、Struts 設定ファイルの、<action> を修正する。

        <!-- ルール更新 -->
       
        <action path="/filter/update-rule"
                name="filterRuleForm" scope="request"
                input="/WEB-INF/pages/filter/edit-rule.jsp"
                type="jp.loafer.test.actions.UpdateFilterRuleAction"
                cancellable="true">

            <!-- 成功時は一覧画面へ戻る -->
            <forward name="success" path="/filter/list.do" />

            <!-- キャンセル時も一覧画面へ戻る -->
            <forward name="cancel" path="/filter/list.do" />

            <!-- 検証エラー時は、input 属性のパスへ戻る -->

        </action>

追加画面にはキャンセルボタンを配置したので、
cancellable 属性を追加し処理できるようにする。
Action 名は想像通り、UpdateFilterRuleAction とする。

では Action を書く。

========== UpdateFilterInfoAction.java ==========
package jp.loafer.test.actions;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import jp.loafer.test.beans.Filter;
import jp.loafer.test.forms.FilterRuleForm;
import jp.loafer.test.util.FilterManager;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class UpdateFilterRuleAction extends Action {

    public UpdateFilterRuleAction() {
        super();
    }

    @Override
    public ActionForward execute(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)
            throws Exception {

        // キャンセルを押した場合は更新しない
        if (isCancelled(request)) {
            return mapping
                    .findForward(Forwards.CANCEL_KEY);
        }

        // フォームを取得
        FilterRuleForm ruleForm = (FilterRuleForm)form;

        // 現在のフィルタ設定を読み込み
        Filter filter = FilterManager.load();

        if (ruleForm.getIndex() >= 0) {

            // ルールを更新し
            filter.getRules().set(ruleForm.getIndex(),
                    ruleForm.getRule());

        } else {

            // ルールを追加し
            filter.getRules().add(ruleForm.getRule());

        }

        // 保存する
        FilterManager.save(filter);

        // OK
        return mapping
                .findForward(Forwards.SUCCESS_KEY);

    }
}
========== end of UpdateFilterInfoAction.java ==========

UpdateFilterInfoAction によく似ており、
設定読み込み⇒書き換え⇒設定書き込みの手順となっている。

FilterRuleForm には、index というプロパティがある。
この値は、更新対象のルールのインデックスであり、
これが -1 ならば新規追加を表している。
これで分岐すれば、この Action を新規と更新両方に使える。

ここでも、ruleForm.getRule() で取得したインスタンスを、
そのまま filter.getRules().add(…) で割り当てている。

インスタンスの寿命が分からないのであれば、
安全のためにクローンを作成するべきだが、
ここではインスタンスのスコープは明確なので、
参照だけで済ませることにする。

追加が完了すれば、また一覧画面に戻ることになるが、
JSP に一覧を書き出すコードを追加していないので、
画面で結果を確認することができない。

直接 /etc/packet-filter.xml を開いて確認してみよう。

========== /etc/packet-filter.xml ==========
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.6.0_01" class="java.beans.XMLDecoder">
<object class="jp.loafer.test.beans.Filter">
  <void property="info">
   <void property="note">
    <string>内向きフィルタ</string>
   </void>
  </void>
  <void property="rules">
   <void method="add">
    <object class="jp.loafer.test.beans.FilterRule">
     <void property="action">
      <string>allow</string>
     </void>
     <void property="destination">
      <void property="network">
       <string>192.168.0.240</string>
      </void>
      <void property="port">
       <string>80</string>
      </void>
     </void>
     <void property="enabled">
      <boolean>true</boolean>
     </void>
     <void property="note">
      <string>Web サーバ</string>
     </void>
     <void property="protocols">
      <array class="java.lang.String" length="1">
       <void index="0">
        <string>tcp</string>
       </void>
      </array>
     </void>
    </object>
   </void>
  </void>
</object>
</java>
========== end of /etc/packet-filter.xml ==========

ファイルには、ちゃんと追加されていることが確認できた。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.