You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@empire-db.apache.org by do...@apache.org on 2012/06/01 19:37:22 UTC
svn commit: r1345284 - in
/empire-db/trunk/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app:
AppStartupListener.java FacesApplication.java
Author: doebele
Date: Fri Jun 1 17:37:22 2012
New Revision: 1345284
URL: http://svn.apache.org/viewvc?rev=1345284&view=rev
Log:
EMPIREDB-140
provide easy access to web context path
Modified:
empire-db/trunk/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/AppStartupListener.java
empire-db/trunk/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/FacesApplication.java
Modified: empire-db/trunk/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/AppStartupListener.java
URL: http://svn.apache.org/viewvc/empire-db/trunk/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/AppStartupListener.java?rev=1345284&r1=1345283&r2=1345284&view=diff
==============================================================================
--- empire-db/trunk/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/AppStartupListener.java (original)
+++ empire-db/trunk/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/AppStartupListener.java Fri Jun 1 17:37:22 2012
@@ -27,12 +27,12 @@ import javax.faces.event.SystemEvent;
import javax.faces.event.SystemEventListener;
import javax.servlet.ServletContext;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class AppStartupListener implements SystemEventListener
{
- final Log log = LogFactory.getLog(AppStartupListener.class);
+ private static final Logger log = LoggerFactory.getLogger(AppStartupListener.class);
@Override
public boolean isListenerForSource(Object source)
@@ -55,9 +55,13 @@ public class AppStartupListener implemen
FacesApplication jsfApp = (FacesApplication)app;
jsfApp.init(servletContext);
// Set Servlet Attribute
- servletContext.setAttribute(jsfApp.getApplicationBeanName(), jsfApp);
+ if (servletContext.getAttribute(FacesApplication.APPLICATION_ATTRIBUTE)!=null)
+ {
+ log.warn("WARNING: Ambiguous application definition. An object of name '{}' already exists on application scope!", FacesApplication.APPLICATION_ATTRIBUTE);
+ }
+ servletContext.setAttribute(FacesApplication.APPLICATION_ATTRIBUTE, jsfApp);
// done
- jsfApp.initComplete();
+ jsfApp.initComplete(servletContext);
}
else if (event instanceof PreDestroyApplicationEvent)
{
Modified: empire-db/trunk/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/FacesApplication.java
URL: http://svn.apache.org/viewvc/empire-db/trunk/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/FacesApplication.java?rev=1345284&r1=1345283&r2=1345284&view=diff
==============================================================================
--- empire-db/trunk/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/FacesApplication.java (original)
+++ empire-db/trunk/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/FacesApplication.java Fri Jun 1 17:37:22 2012
@@ -50,44 +50,45 @@ import com.sun.faces.application.Applica
public abstract class FacesApplication extends ApplicationImpl
{
- private static final Logger log = LoggerFactory.getLogger(FacesApplication.class);
-
- private static final String APPLICATION_ATTRIBUTE = "facesApp";
- private static final String CONNECTION_ATTRIBUTE = "dbConnections";
-
- protected TextResolver[] textResolvers = null;
-
+ private static final Logger log = LoggerFactory.getLogger(FacesApplication.class);
+
+ private static final String CONNECTION_ATTRIBUTE = "dbConnections";
+
+ public static String APPLICATION_ATTRIBUTE = "app";
+
+ protected TextResolver[] textResolvers = null;
+
+ private String webRoot = null;
+
protected FacesApplication(AppStartupListener startupListener)
- { // subscribe
+ { // subscribe
subscribeToEvent(javax.faces.event.PostConstructApplicationEvent.class, startupListener);
- }
-
+ }
+
protected FacesApplication()
- { // subscribe
+ { // subscribe
this(new AppStartupListener());
- }
-
- public String getApplicationBeanName()
- {
- return APPLICATION_ATTRIBUTE;
}
-
+
protected abstract DataSource getAppDataSource(DBDatabase db);
-
- public abstract void init(ServletContext fc);
- public void initComplete()
+ protected abstract void init(ServletContext fc);
+
+ protected void initComplete(ServletContext servletContext)
{
+ // Get Web Root
+ webRoot = servletContext.getContextPath();
+
// Check Text resolvers
- if (textResolvers==null)
- initTextResolvers();
+ if (textResolvers == null)
+ initTextResolvers();
// done
log.info("FacesApplication initialization complete");
}
-
+
/* Context handling */
-
+
public void onChangeView(final FacesContext fc, String viewId)
{
// allow custom view change logic
@@ -97,7 +98,18 @@ public abstract class FacesApplication e
{
throw new NotSupportedException(this, "addJavascriptCall");
}
-
+
+ /**
+ * returns the web context path as returned from ServletContext.getContextPath()
+ */
+ public String getWebRoot()
+ {
+ return webRoot;
+ }
+
+ /**
+ * returns the active locale for a given FacesContext
+ */
public Locale getContextLocale(final FacesContext ctx)
{
UIViewRoot root;
@@ -106,31 +118,34 @@ public abstract class FacesApplication e
Locale defaultLocale = Locale.getDefault();
locale = defaultLocale;
// See if this FacesContext has a ViewRoot
- if (null != (root = ctx.getViewRoot())) {
+ if (null != (root = ctx.getViewRoot()))
+ {
// If so, ask it for its Locale
- if (null == (locale = root.getLocale())) {
+ if (null == (locale = root.getLocale()))
+ {
// If the ViewRoot has no Locale, fall back to the default.
locale = defaultLocale;
}
}
return locale;
}
-
+
/**
* checks if the current context contains an error
- * @param fc the FacesContext
+ *
+ * @param fc
+ * the FacesContext
* @return true if the context has an error set or false otherwise
*/
public boolean hasError(final FacesContext fc)
{
Iterator<FacesMessage> msgIterator = fc.getMessages();
- if (msgIterator!=null)
- { // Check Messages
+ if (msgIterator != null)
+ { // Check Messages
while (msgIterator.hasNext())
- { // Check Severity
+ { // Check Severity
Severity fms = msgIterator.next().getSeverity();
- if (fms==FacesMessage.SEVERITY_ERROR ||
- fms==FacesMessage.SEVERITY_FATAL)
+ if (fms == FacesMessage.SEVERITY_ERROR || fms == FacesMessage.SEVERITY_FATAL)
return true;
}
}
@@ -139,53 +154,56 @@ public abstract class FacesApplication e
/**
* finds a component from with a given id from a given start component
- * @param fc the FacesContext
+ *
+ * @param fc
+ * the FacesContext
* @param componentId
- * @param nearComponent a component within the same naming container
+ * @param nearComponent
+ * a component within the same naming container
* @return
*/
public UIComponent findComponent(FacesContext fc, String componentId, UIComponent nearComponent)
{
if (StringUtils.isEmpty(componentId))
- throw new InvalidArgumentException("forComponentId", componentId);
+ throw new InvalidArgumentException("forComponentId", componentId);
// Search for compoent
UIComponent forComponent = null;
- if (nearComponent!=null)
+ if (nearComponent != null)
{
- // Look for the 'for' component in the nearest parental naming container
- // of the UIComponent (there's actually a bit more to this search - see
- // the docs for the findComponent method
- forComponent = nearComponent.findComponent(componentId);
- // Since the nearest naming container may be nested, search the
- // next-to-nearest parental naming container in a recursive fashion,
- // until we get to the view root
- if (forComponent == null)
- {
- UIComponent nextParent = nearComponent;
- while (true)
- {
- nextParent = nextParent.getParent();
- // avoid extra searching by going up to the next NamingContainer
- // (see the docs for findComponent for an information that will
- // justify this approach)
- while (nextParent != null && !(nextParent instanceof NamingContainer))
- {
- nextParent = nextParent.getParent();
- }
- if (nextParent == null)
- {
- break;
- }
- else
- {
- forComponent = nextParent.findComponent(componentId);
- }
- if (forComponent != null)
- {
- break;
- }
- }
- }
+ // Look for the 'for' component in the nearest parental naming container
+ // of the UIComponent (there's actually a bit more to this search - see
+ // the docs for the findComponent method
+ forComponent = nearComponent.findComponent(componentId);
+ // Since the nearest naming container may be nested, search the
+ // next-to-nearest parental naming container in a recursive fashion,
+ // until we get to the view root
+ if (forComponent == null)
+ {
+ UIComponent nextParent = nearComponent;
+ while (true)
+ {
+ nextParent = nextParent.getParent();
+ // avoid extra searching by going up to the next NamingContainer
+ // (see the docs for findComponent for an information that will
+ // justify this approach)
+ while (nextParent != null && !(nextParent instanceof NamingContainer))
+ {
+ nextParent = nextParent.getParent();
+ }
+ if (nextParent == null)
+ {
+ break;
+ }
+ else
+ {
+ forComponent = nextParent.findComponent(componentId);
+ }
+ if (forComponent != null)
+ {
+ break;
+ }
+ }
+ }
}
// There is one other situation to cover: if the 'for' component
// is not situated inside a NamingContainer then the algorithm above
@@ -225,6 +243,7 @@ public abstract class FacesApplication e
/**
* returns the default control type for a given data Type
+ *
* @param dataType
* @return
*/
@@ -235,54 +254,58 @@ public abstract class FacesApplication e
case CLOB:
return TextAreaInputControl.NAME;
default:
- return TextInputControl.NAME;
+ return TextInputControl.NAME;
}
}
-
+
/* Message handling */
-
+
protected void initTextResolvers()
- {
+ {
int count = 0;
Iterator<Locale> locales = getSupportedLocales();
- for (count=0; locales.hasNext(); count++) { locales.next(); }
-
+ for (count = 0; locales.hasNext(); count++)
+ {
+ locales.next();
+ }
+
// get message bundles
String messageBundle = this.getMessageBundle();
textResolvers = new TextResolver[count];
locales = getSupportedLocales();
- for (int i=0; locales.hasNext(); i++)
+ for (int i = 0; locales.hasNext(); i++)
{
Locale locale = locales.next();
textResolvers[i] = new TextResolver(ResourceBundle.getBundle(messageBundle, locale));
}
}
-
+
public TextResolver getTextResolver(Locale locale)
{
// No text Resolvers provided
- if (textResolvers==null || textResolvers.length==0)
+ if (textResolvers == null || textResolvers.length == 0)
{
throw new NotSupportedException(this, "getTextResolver");
}
// Lookup resolver for locale
- for (int i=0; i<textResolvers.length; i++)
+ for (int i = 0; i < textResolvers.length; i++)
if (locale.equals(textResolvers[i].getLocale()))
return textResolvers[i];
// locale not found: return default
return textResolvers[0];
}
-
+
public TextResolver getTextResolver(FacesContext ctx)
{
return getTextResolver(getContextLocale(ctx));
}
-
+
/**
- * @see javax.faces.application.Application#getResourceBundle(javax.faces.context.FacesContext, String)
+ * @see javax.faces.application.Application#getResourceBundle(javax.faces.context.FacesContext,
+ * String)
*/
@Override
- public ResourceBundle getResourceBundle(FacesContext fc, String var)
+ public ResourceBundle getResourceBundle(FacesContext fc, String var)
{
if (var.equals("msg"))
{
@@ -291,9 +314,10 @@ public abstract class FacesApplication e
}
return null;
}
-
+
/**
* returns a connection from the connection pool
+ *
* @return
*/
protected Connection getConnection(DBDatabase db)
@@ -353,39 +377,41 @@ public abstract class FacesApplication e
*/
public Connection getConnectionForRequest(FacesContext fc, DBDatabase db)
{
- if (fc==null)
+ if (fc == null)
throw new InvalidArgumentException("FacesContext", fc);
- if (db==null)
+ if (db == null)
throw new InvalidArgumentException("DBDatabase", db);
// Get Conneciton map
@SuppressWarnings("unchecked")
- Map<DBDatabase, Connection> connMap = (Map<DBDatabase, Connection>)FacesUtils.getRequestAttribute(fc, CONNECTION_ATTRIBUTE);
- if (connMap!=null && connMap.containsKey(db))
+ Map<DBDatabase, Connection> connMap = (Map<DBDatabase, Connection>) FacesUtils.getRequestAttribute(fc, CONNECTION_ATTRIBUTE);
+ if (connMap != null && connMap.containsKey(db))
return connMap.get(db);
// Pooled Connection
Connection conn = getConnection(db);
- if (conn==null)
+ if (conn == null)
return null;
// Add to map
- if (connMap==null)
- { connMap= new HashMap<DBDatabase, Connection>();
+ if (connMap == null)
+ {
+ connMap = new HashMap<DBDatabase, Connection>();
FacesUtils.setRequestAttribute(fc, CONNECTION_ATTRIBUTE, connMap);
- }
- connMap.put(db, conn);
+ }
+ connMap.put(db, conn);
return conn;
}
-
+
/**
* Releases the current request connection
+ *
* @param fc
* @param commit
*/
public void releaseAllConnections(final FacesContext fc, boolean commit)
{
@SuppressWarnings("unchecked")
- Map<DBDatabase, Connection> connMap = (Map<DBDatabase, Connection>)FacesUtils.getRequestAttribute(fc, CONNECTION_ATTRIBUTE);
+ Map<DBDatabase, Connection> connMap = (Map<DBDatabase, Connection>) FacesUtils.getRequestAttribute(fc, CONNECTION_ATTRIBUTE);
if (connMap != null)
- { // Walk the connection map
+ { // Walk the connection map
for (Map.Entry<DBDatabase, Connection> e : connMap.entrySet())
{
releaseConnection(e.getKey(), e.getValue(), commit);
@@ -403,12 +429,12 @@ public abstract class FacesApplication e
public void releaseConnection(final FacesContext fc, DBDatabase db, boolean commit)
{
@SuppressWarnings("unchecked")
- Map<DBDatabase, Connection> connMap = (Map<DBDatabase, Connection>)FacesUtils.getRequestAttribute(fc, CONNECTION_ATTRIBUTE);
+ Map<DBDatabase, Connection> connMap = (Map<DBDatabase, Connection>) FacesUtils.getRequestAttribute(fc, CONNECTION_ATTRIBUTE);
if (connMap != null && connMap.containsKey(db))
- { // Walk the connection map
+ { // Walk the connection map
releaseConnection(db, connMap.get(db), commit);
connMap.remove(db);
- if (connMap.size()==0)
+ if (connMap.size() == 0)
FacesUtils.setRequestAttribute(fc, CONNECTION_ATTRIBUTE, null);
}
}
@@ -417,5 +443,5 @@ public abstract class FacesApplication e
{
releaseConnection(fc, db, !hasError(fc));
}
-
+
}