Wicket menuコンポーネントを認証用に、(1)

過去、http://code.google.com/p/wicket-menu/ を使用して書いた以下は、
Wicket-auth 認証には対応していなかった。

http://blog.zaq.ne.jp/oboe2uran/article/513/
http://blog.zaq.ne.jp/oboe2uran/article/514/

これを Wicket-auth に対応させるなら、Horizon menu bar のコンポーネント
Auth 認証用に新しく作成し、MenuItem を継承したいところだが、継承するろ
サブメニューを追加するメソッド名が被って引数の型が異なりタイプセーフにならない弊害もある

(長いので分けて投稿する)

メニュー名とリンク先を宣言する MenuItem → AuthMenuItem

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.authentication.AuthenticatedWebSession;
import org.apache.wicket.markup.html.WebPage;
import com.cooldatasoft.common.DestinationType;
/**
 * AuthMenuItem
 */
public class AuthMenuItem implements Serializable{
   private int destinationType;
   private String menuText;
   private Class<? extends WebPage> responsePageClass;
   private WebPage responsePage;
   private String externalLink;
   private List<AuthMenuItem> subMenuItemList = new ArrayList<AuthMenuItem>();
   private boolean seperator = false;
   private boolean submenuTitle = false;
   private String[] ary;
   
   public AuthMenuItem(boolean seperator,String... roles){
      setSeperator(true);
      setDestinationType(DestinationType.NONE);
      this.ary = roles;
   }
   public AuthMenuItem(String submenuTitle,String... roles){
      setSubmenuTitleTitle(true);
      setMenuText(submenuTitle);
      setDestinationType(DestinationType.NONE);
      this.ary = roles;
   }
   public <T extends WebPage> AuthMenuItem(String menuText,T destinationPage,String... roles){
      setMenuText(menuText);
      setResponsePage(destinationPage);
      setSubMenuItemList(new ArrayList<AuthMenuItem>());
      setDestinationType(DestinationType.WEB_PAGE_INSTANCE);
      this.ary = roles;
    }
   public AuthMenuItem(String menuText,Class<? extends WebPage> destinationPageClass,String... roles){
      setMenuText(menuText);
      setResponsePageClass(destinationPageClass);
      setSubMenuItemList(new ArrayList<AuthMenuItem>());
      setDestinationType(DestinationType.WEB_PAGE_CLASS);
      this.ary = roles;
   }
   public AuthMenuItem(String menuText,Class<? extends WebPage> destinationWebPage
,List<AuthMenuItem> subMenuItemList,String... roles)throws InstantiationException,IllegalAccessException{
      this(menuText,destinationWebPage.newInstance(),subMenuItemList);
      setDestinationType(DestinationType.WEB_PAGE_CLASS);
      this.ary = roles;
   }
   public <T extends WebPage>AuthMenuItem(String menuText
,T destinationPage,List<AuthMenuItem> subMenuItemList,String... roles){
      setMenuText(menuText);
      setResponsePage(destinationPage);
      setSubMenuItemList(subMenuItemList);
      setDestinationType(DestinationType.WEB_PAGE_INSTANCE);
      this.ary = roles;
   }
   // setter や getter を用意する!

   // サブメニュー(DropDownで表示するメニュー)の追加
   public void addSubmenu(AuthMenuItem subMenuItem){
       getSubMenuItemList().add(subMenuItem);
   }
   // メニュー表示させるかどうかを boolean で返す。
   public boolean isView(AuthenticatedWebSession session){
      String role = session.getRoles().toString();
      if (this.ary.length==0) return true;
      boolean rtn = false;
      for(int i=0;i < this.ary.length;i++){
         if (this.ary[i].equals(role)){
            rtn = true;
            break;
         }
      }
      return rtn;
   }

}

AuthMenuItem の重要なところは、
 public boolean isView(AuthenticatedWebSession session)
メソッドである。これを 認証用に用意するHorizon menu bar のコンポーネント
生成する時に、org.apache.wicket.Component.getSession() から取得するセッションオブジェクト
を渡すことで、アクセスしたセッションの Role と AuthMenuItem の Role 群に存在するかを
問い合わせていることだ。

メニューのタイトルとリンク先を定義する時、要件的に 認証 Role が必要であり
String... roles をAuthMenuItemコンストラクタの引数としていている。
Role名 が1つも指定されなければ、無条件にメニューを表示させる。
roles の型が String であるが、必ずしも "ADMIN" のように指定しなくても
  Roles.ADMIN と指定してもよい。

次回は、Horizon menu bar のコンポーネント