Aipoにおけるセッションの管理

Aipoではセッションに入れた情報の取り出しなどをALEipUtilsの中で行っています。

https://github.com/aipocom/aipo/blob/master/core/src/main/java/com/aimluck/eip/util/ALEipUtils.java

 

セッションにセットする

  public static void setTemp(RunData rundata, Context context, String key,
      String value) {

    JetspeedRunData jdata = (JetspeedRunData) rundata;
    VelocityPortlet portlet =
      ((VelocityPortlet) context.get(JetspeedResources.PATH_PORTLET_KEY));

    if (portlet == null) {
      // Screen の場合
      String js_peid =
        rundata.getParameters().getString(JetspeedResources.PATH_PORTLETID_KEY);
      jdata.getUser().setTemp(
        new StringBuffer().append(js_peid).append(key).toString(),
        value);
    } else {
      // Action の場合
      jdata.getUser().setTemp(
        new StringBuffer().append(portlet.getID()).append(key).toString(),
        value);
    }
  }

 

セッションから取り出す

  public static String getTemp(RunData rundata, Context context, String key) {
    JetspeedRunData jdata = (JetspeedRunData) rundata;
    Object obj = null;
    VelocityPortlet portlet =
      ((VelocityPortlet) context.get(JetspeedResources.PATH_PORTLET_KEY));
    if (portlet == null) {
      // Screen の場合
      String js_peid =
        rundata.getParameters().getString(JetspeedResources.PATH_PORTLETID_KEY);
      obj =
        jdata.getUser().getTemp(
          new StringBuffer().append(js_peid).append(key).toString());
    } else {
      // Action の場合
      obj =
        jdata.getUser().getTemp(
          new StringBuffer().append(portlet.getID()).append(key).toString());
    }
    return (obj == null) ? null : obj.toString();
  }

セッションから削除する

  public static void removeTemp(RunData rundata, Context context, String key) {
    JetspeedRunData jdata = (JetspeedRunData) rundata;
    VelocityPortlet portlet =
      ((VelocityPortlet) context.get(JetspeedResources.PATH_PORTLET_KEY));
    if (portlet == null) {
      // Screen の場合
      String js_peid =
        rundata.getParameters().getString(JetspeedResources.PATH_PORTLETID_KEY);
      jdata.getUser().removeTemp(
        new StringBuffer().append(js_peid).append(key).toString());
    } else {
      // Action の場合
      jdata.getUser().removeTemp(
        new StringBuffer().append(portlet.getID()).append(key).toString());
    }
  }

Aipoでは各ポートレットで似たような構成になっており、セッションのキーがポートレットをまたいで他の機能に影響を与えてしまわないようなつくりになっています。

例えば

ALEipUtils.setTemp(rundata, context, "key", "hoge");

などのようにした場合、セッションのキーはクラス名が勝手に接頭詞として付けられるようになっています。BlogSelectDataとかで呼び出した場合は

com.aimluck.eip.blog.BlogSelectDatakey

とかのキーになるので、他の機能に影響を与えません。また、キーにはポートレットIDも付与されるため、同じ機能を複数配置している場合でも影響を与えないようになっています。

逆に言えばちょっと別のクラスのセッションの値を使いたい場合には

ALEipUtils.getTemp(rundata, context, "key");

で呼べなくなるため、

ALEipUtils.getTemp(rundata, context, new StringBuffer()
    .append(BlogSelectData.class.getName())
    .append("key")
    .toString());

などのようにして、クラス名を指定して呼ぶことになるかと思います。