/* *************************************************************************
IT Mill Toolkit
Development of Browser User Intarfaces Made Easy
Copyright (C) 2000-2006 IT Mill Ltd
*************************************************************************
This product is distributed under commercial license that can be found
from the product package on license/license.txt. Use of this product might
require purchasing a commercial license from IT Mill Ltd. For guidelines
on usage, see license/licensing-guidelines.html
*************************************************************************
For more information, contact:
IT Mill Ltd phone: +358 2 4802 7180
Ruukinkatu 2-4 fax: +358 2 4802 7181
20540, Turku email: info@itmill.com
Finland company www: www.itmill.com
Primary source for information and releases: www.itmill.com
********************************************************************** */
package com.itmill.toolkit.terminal.web;
import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.WeakHashMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import com.itmill.toolkit.Application;
import com.itmill.toolkit.service.ApplicationContext;
import com.itmill.toolkit.ui.Window;
/**
* Web application context for the IT Mill Toolkit applications.
*
* @author IT Mill Ltd.
* @version
* @VERSION@
* @since 3.1
*/
public class WebApplicationContext implements ApplicationContext {
private List listeners;
private HttpSession session;
private WeakHashMap formActions = new WeakHashMap();
/** Create a new Web Application Context. */
WebApplicationContext(HttpSession session) {
this.session = session;
}
/**
* Get the form action for given window.
*
* By default, this action is "", which preserves the current url. Commonly
* this is wanted to be set to application.getUrl().toString()
* or window.getUrl().toString()
in order to clean any local
* links or parameters set from the action.
*
* @param window
* Window for which the action is queried
* @return Action to be set into Form action attribute
*/
public String getWindowFormAction(Window window) {
String action = (String) formActions.get(window);
return action == null ? "" : action;
}
/**
* Set the form action for given window.
*
* By default, this action is "", which preserves the current url. Commonly
* this is wanted to be set to application.getUrl().toString()
* or window.getUrl().toString()
in order to clean any local
* links or parameters set from the action.
*
* @param window
* Window for which the action is set
* @param action
* New action for the window.
*/
public void setWindowFormAction(Window window, String action) {
if (action == null || action == "")
formActions.remove(window);
else
formActions.put(window, action);
}
/*
* (non-Javadoc)
*
* @see com.itmill.toolkit.service.ApplicationContext#getBaseDirectory()
*/
public File getBaseDirectory() {
String realPath = session.getServletContext().getRealPath("/");
if (realPath == null)
return null;
return new File(realPath);
}
/**
* Get the http-session application is running in.
*
* @return HttpSession this application context resides in
*/
public HttpSession getHttpSession() {
return session;
}
/*
* (non-Javadoc)
*
* @see com.itmill.toolkit.service.ApplicationContext#getApplications()
*/
public Collection getApplications() {
LinkedList applications = (LinkedList) session
.getAttribute(ApplicationServlet.SESSION_ATTR_APPS);
return Collections
.unmodifiableCollection(applications == null ? (new LinkedList())
: applications);
}
/**
* Get application context for HttpSession.
*
* @return application context for HttpSession.
*/
static public WebApplicationContext getApplicationContext(
HttpSession session) {
return new WebApplicationContext(session);
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object obj) {
return session.equals(obj);
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
public int hashCode() {
return session.hashCode();
}
/*
* (non-Javadoc)
*
* @see com.itmill.toolkit.service.ApplicationContext#addTransactionListener(com.itmill.toolkit.service.ApplicationContext.TransactionListener)
*/
public void addTransactionListener(TransactionListener listener) {
if (this.listeners == null)
this.listeners = new LinkedList();
this.listeners.add(listener);
}
/*
* (non-Javadoc)
*
* @see com.itmill.toolkit.service.ApplicationContext#removeTransactionListener(com.itmill.toolkit.service.ApplicationContext.TransactionListener)
*/
public void removeTransactionListener(TransactionListener listener) {
if (this.listeners != null)
this.listeners.remove(listener);
}
/** Notify transaction start */
protected void startTransaction(Application application,
HttpServletRequest request) {
if (this.listeners == null)
return;
for (Iterator i = this.listeners.iterator(); i.hasNext();) {
((ApplicationContext.TransactionListener) i.next())
.transactionStart(application, request);
}
}
/** Notify transaction end */
protected void endTransaction(Application application,
HttpServletRequest request) {
if (this.listeners == null)
return;
LinkedList exceptions = null;
for (Iterator i = this.listeners.iterator(); i.hasNext();)
try {
((ApplicationContext.TransactionListener) i.next())
.transactionEnd(application, request);
} catch (RuntimeException t) {
if (exceptions == null)
exceptions = new LinkedList();
exceptions.add(t);
}
// If any runtime exceptions occurred, throw a combined exception
if (exceptions != null) {
StringBuffer msg = new StringBuffer();
for (Iterator i = listeners.iterator(); i.hasNext();) {
RuntimeException e = (RuntimeException) i.next();
if (msg.length() == 0)
msg.append("\n\n--------------------------\n\n");
msg.append(e.getMessage() + "\n");
StringWriter trace = new StringWriter();
e.printStackTrace(new PrintWriter(trace,true));
msg.append(trace.toString());
}
throw new RuntimeException(msg.toString());
}
}
}