/***
 * Excerpted from "Domain-Driven Design Using Naked Objects",
 * published by The Pragmatic Bookshelf.
 * Copyrights apply to this code. It may not be used to create training material, 
 * courses, books, articles, and the like. Contact us if you are in doubt.
 * We make no guarantees that this code is fit for any purpose. 
 * Visit http://www.pragmaticprogrammer.com/titles/dhnako for more book information.
***/
package com.pragprog.dhnako.carserv.wicket.app;

import org.apache.wicket.Response;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.protocol.http.WebRequest;
import org.apache.wicket.protocol.http.WebRequestCycle;
import org.nakedobjects.metamodel.authentication.AuthenticationSession;
import org.nakedobjects.runtime.context.NakedObjectsContext;
import org.nakedobjects.runtime.transaction.NakedObjectTransaction;
import org.nakedobjects.runtime.transaction.NakedObjectTransactionManager;

public class NakedObjectsWebRequestCycle extends WebRequestCycle {

	public NakedObjectsWebRequestCycle(
			WebApplication application,
			WebRequest request, 
			Response response) {
		super(application, request, response);
	}
	
	@Override
	protected void onBeginRequest() {
		super.onBeginRequest();
		NakedObjectsAuthenticatedWebSession wicketSession = NakedObjectsAuthenticatedWebSession.get();
		if (wicketSession == null) {
			return;
		}
		AuthenticationSession nakedObjectsSession = wicketSession.getAuthenticationSession();
		if (nakedObjectsSession == null) {
			return;
		}
		NakedObjectsContext.openSession(nakedObjectsSession);
		getTransactionManager().startTransaction();
	}

	@Override
	protected void onEndRequest() {
		if (NakedObjectsContext.inSession()) {
			NakedObjectTransaction transaction = getTransactionManager().getTransaction();
			if (transaction != null) {
				getTransactionManager().endTransaction();
			}
			NakedObjectsContext.closeSession();
		}
		super.onEndRequest();
	}

	private static NakedObjectTransactionManager getTransactionManager() {
		return NakedObjectsContext.getTransactionManager();
	}
}
