このアーカイブは同期化されません。 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 ==========
ファイルには、ちゃんと追加されていることが確認できた。