« iBatisで動的SQL | メイン | iBatisで使いまわし »

Tapestry Engine Service

Tapestry4になって、Engine Serviceの記述方法ががらっと変わりました。

Tapestry3では、application specificationに記述をしましたが、Tapestry4では、HiveMindに設定をします。 以下の設定では、dataSqueezerや、Engine Service内でVisitオブジェクトを使用したいため、サービスを追加しています。

hivemodule.xml

<contribution configuration-id="tapestry.state.ApplicationObjects">
	<state-object name="AppVisit" scope="session">
		<create-instance class="jp.co.taosoftware.tagraw.tape.AppVisit" />
	</state-object>
</contribution>

  <contribution configuration-id="tapestry.services.ApplicationServices">
    <service name="SessionService" object="service:SessionService"/>
  </contribution>
 	
	<service-point id="SessionService" interface="org.apache.tapestry.engine.IEngineService">
	  <invoke-factory>
	    <construct class="jp.co.taosoftware.tagraw.service.SessionService">
	      <set-object property="exceptionReporter" value="infrastructure:requestExceptionReporter"/>
	      <set-object property="response" value="infrastructure:response"/>
	      <set-object property="linkFactory" value="infrastructure:linkFactory"/>
	      <set-object property="dataSqueezer" value="infrastructure:dataSqueezer"/>
    	  <set-service property="appStateMgr" service-id="tapestry.state.ApplicationStateManager"/> 
	    </construct>
	  </invoke-factory>
	</service-point>
SessionService.java

public class  SessionService extends BaseEngine implements IEngineService {

   public static final String SERVICE_NAME = "SessionService";
	
    /** @since 4.0 */
    private RequestExceptionReporter _exceptionReporter;
    private LinkFactory _linkFactory;
    private WebResponse _response;

    //Inject
    private DataSqueezer squeezer;
    private ApplicationStateManager appStateMgr; 

    public String getName() {
		return SERVICE_NAME;
    }

    public ILink getLink(boolean aPost, Object parameter) {
	    Map parameters = new HashMap();
            parameters.put(ServiceConstants.SERVICE, getName());
            return _linkFactory.constructLink(this, false, parameters, true);
    }
		
    public void service(IRequestCycle aCycle) throws IOException {
	
	String outString = "OK";
		
        AppVisit visit = (AppVisit)getAppStateMgr().get("AppVisit");
      
	OutputStream output = _response.getOutputStream(new ContentType("text/html"));
	output.write(outString.getBytes());
		
    }

    public DataSqueezer getDataSqueezer() {
		return this.squeezer;
    }

    public void setDataSqueezer(DataSqueezer aSqueezer) {
		this.squeezer = aSqueezer;
    }
		
    public UserFacade getUserFacade() {
		return this.userFacade;
    }

    public void setUserFacade(UserFacade aUserFacade) {
		this.userFacade = aUserFacade;
    }

    public ApplicationStateManager getAppStateMgr() {
		return this.appStateMgr;
    }

    public void setAppStateMgr(ApplicationStateManager aAppStateMgr) {
		this.appStateMgr = aAppStateMgr;
    }
	
    public IAuthenticateStrategy getAuthenticateStrategy() {
		return this.authenticateStrategy;
    }

    public void setAuthenticateStrategy(IAuthenticateStrategy aAuthenticateStrategy) {
		this.authenticateStrategy = aAuthenticateStrategy;
    }

    /** @since 4.0 */
    public void setExceptionReporter(RequestExceptionReporter exceptionReporter)
    {
        _exceptionReporter = exceptionReporter;
    }

    /** @since 4.0 */
    public void setLinkFactory(LinkFactory linkFactory)
    {
        _linkFactory = linkFactory;
    }

    /** @since 4.0 */
    public void setResponse(WebResponse response)
    {
        _response = response;
    }

    public RequestExceptionReporter get_exceptionReporter() {
		return this._exceptionReporter;
    }
 
}

実際には、getLinkのparameterのセットや、serviceメソッドを上記ソースコードに記述していくことになります。 http://localhost:8080/tagraw/app?service=SessionServiceにアクセスをすると、serviceメソッドが呼び出されます。

トラックバック

このエントリーのトラックバックURL:
http://www.taosoftware.co.jp/mt/mt-tb.cgi/23

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)