Apache Shale リファクタリング

メーリングリストでリファクタするぜ.とあったのでチェックアウトしてみたら変更がありました.

ShaleのViewController周りが,新たにshale-viewとして分離しました.
この部分に関しては,あまり分離する必要はないと思っていたのですが,分離の方向に.
分離されるとしたら,Dialog Managerあたりかと.sandboxで開発が進んでいるので,
後に分離される可能性は高いのですが.

Clayのテンプレートがマルチリンガルに対応しました.
まだ詳しく追っていませんが,コード上では対応が確認されます.
システムのディフォルトエンコーディングを使っているような記述が見えるため,
確認が必要.エンコーディングも指定できるはずですが.

検証を行い,紹介したいと思います.

Apache MyFaces1.1.4 リリース

18日にMyFaces Core 1.1.4がリリースされています.
20日MyFaces Tobago 1.0.8がリリースされています.

リリースノートは,

  • [MYFACES-1070] - NullPointerException in MyFacesGenericPortlet.facesRender method
  • [MYFACES-1194] - mvn install cannot be invoked multiple times
  • [MYFACES-1196] - h:panelGrid columnClasses: classes are not used repetitively
  • [MYFACES-1296] - NullpointerException in JspStateManager
  • [MYFACES-1301] - Check for stale components is effectively broken as implemented in myfaces-impl >1.1.2
  • [MYFACES-1308] - org.apache.myfaces.shared.util._ComponentUtils.findNestingForm() needs to support af:form
  • [MYFACES-1317] - ClassCastException when setting timeZone attribute in using EL
  • [MYFACES-1332] - Documented value of type attribute for does not match the implementation
  • [MYFACES-1340] - wildcard navrule bug in NavigationHandlerImpl
  • [MYFACES-1376] - getScrolling is not defined in simple tree2 example
  • [MYFACES-1377] - h:dataTable with t:dataScroller generates "Row is not available. Rowindex =#" errors on non-full pages.
  • [MYFACES-1404] - TRINIDAD_FORM_COMPONENT_FAMILY has invalid value
  • [MYFACES-1302] - Display class and value of unconvertable object in IllegalArgumentException
  • [MYFACES-1307] - Please add a source distribution to the build and the download page
  • [MYFACES-1319] - Client side compression should be optional
  • [MYFACES-1325] - Restrict Continuum notification to failures only.

ですか...
後は,MavenのGroup IDが"org.apache.myfaces.core"に変わったみたい.

要チェック.

Apache Shale Sandbox

現在,Shale Sandboxではいくつかのプロジェクトが開発されています.
Sandboxは,今後のShaleの動きにも影響があるので少し紹介します.

shale-clay-jpa

ClayのJPA対応のようです.このプロジェクトは,JPA対応だけでなくJSF1.2上で動作を確認しているため,ShaleのJSF1.2対応も確認ができます.

JBoss Seam が標準化「JSR 299: Web Beans」され,JPAEJBとのシームレスな連携を行っているので(みたいなので)Shaleとしても遅れるわけにはいきません.

shale-clay-mailreader

shale-clay-jpaを使用した実験アプリケーションのようです.

shale-dialog2

Shaleのdialog Managerの機能が2として登場・・・
詳しくは追えていません.1もですがね...すいません.確認しておきますよ.

shale-dialog2-legacy

・・・くわしくはわかりませんが,もともとCoreに組み込まれていたDialogManagerの機能を切り出したものに見えます.

shale-dialog2-scxml

これも,想像ですが,Dialogの状態遷移の定義にSCXMLを使用しようということだと思う.
SCXML自体もよくわかりませんが.

shale-test-dialog2-legacy,shale-test-dialog2-scxml

それぞれのサンプルアプリケーションだと思われます.

と,いうようにいくつかのプロジェクトが作成されています.
現在のところ,詳しく追いきれていないのでこれ以上の説明はできません.が,方向性は見えてきます.

やはり,メインの機能はDialog系なのでしょうかね.しかし,Spring Web Flowとか,状態遷移を定義するフレームワークとかって,使いやすいんでしょうか?自分は,便利だと思わないんですがね.まだまだ勉強不足なんでしょうかね.

精進します.

Apache Shale ExceptionHandler

Shale 1.0.3からExceptionHandlerが用意されました.

例外が発生した場合に,任意の画面に遷移させることが可能になりました.今回はその方法を紹介します.

web.xml

<!-- ApplicationExceptionHandler -->
<context-param>
    <param-name>
        org.apache.shale.view.EXCEPTION_DISPATCH_PATH
    </param-name>
    <param-value>/error.jsp</param-value>
</context-param>

このように設定すると,例外が発生した場合に,error.jspに遷移します.

error.jsp

<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>エラー</title>
</head>
<body>
エラーが発生しました.<br />
<%
javax.faces.context.FacesContext context = javax.faces.context.FacesContext.getCurrentInstance();
javax.faces.context.ExternalContext eContext = context.getExternalContext();
java.util.Map requestMap = eContext.getRequestMap();
%>

<h2>FacesContext</h2>
<table border="1">
    <tr>
        <th>Status Code</th>
        <td><%=requestMap.get("javax.servlet.error.status_code") %></td>
    </tr>
    <tr>
        <th>Exception Type</th>
        <td><%=requestMap.get("javax.servlet.error.exception_type") %></td>
    </tr>
    <tr>
        <th>Message</th>
        <td><%=requestMap.get("javax.servlet.error.message") %></td>
    </tr>
    <tr>
        <th>Exception</th>
        <td><%=requestMap.get("javax.servlet.error.exception") %></td>
    </tr>
    <tr>
        <th>Request URI</th>
        <td><%=requestMap.get("javax.servlet.error.request_uri") %></td>
    </tr>
    <tr>
        <th>Servlet Name</th>
        <td><%=requestMap.get("javax.servlet.error.servlet_name") %></td>
    </tr>
</table>
</body>
</html>

JSPで指定しているキーは,現在のところViewPhaseListenerクラスに直書きされており,とても美しいとはいえない作りになっています.しかも,ResponseCompleteされていないため,裏でさらにExceptionがぶっとんでいます...

Shale内部ではさまざまなところで,ExceptionHandlerを使用しています.ディフォルトでは,
org.apache.shale.view.impl.DefaultExceptionHandlerクラスが使用されます.

ExceptionHandlerを作成する

ExceptionHandlerの動きを変えたい場合は,自分でExceptionHandlerを作成します.

ExceptionHandlerを作成する場合は,org.apache.shale.view.ExceptionHandler.ExceptionHandlerを実装します.

次に,MyExceptionHandlerを登録します.

faces-config.xml

<!-- MyExceptionHandler -->
<managed-bean>
    <managed-bean-name>
        org$apache$shale$view$EXCEPTION_HANDLER
    </managed-bean-name>
    <managed-bean-class>
        org.blackeyes.shale.sample.view.custom.MyExceptionHandler
    </managed-bean-class>
    <managed-bean-scope>application</managed-bean-scope>
</managed-bean>

これで,自作のExceptionHandlerを登録することができました.

感想

ExceptionHandlerが作成されたのは,非常にうれしいことです.しかし,現時点ではあまりにも貧弱で使い勝手が悪すぎます.
使用方法もなかなか難しい作りになっています.

最終的にExceptionを処理しているクラスがViewPhaseListenerなんですが,ここでの処理もやはり雑な作りになっています.

Apache Conを目指しているせいなのかわかりませんが,最近のShaleは作りに粗さが目立ちます.(それだけでなく,一切の多言語対応が考慮されていない・・・)

JSFベースのFrameworkのトップを目指すなら,もう少し洗練させる必要があるのでは?このままでは,JBoss Seamには勝てませんよ...
(Seam自体触ったことがありませんが・・・Shaleに競合するFrameworkかと思いまして・・・)