Author: nbelaevski
Date: 2011-02-18 15:26:27 -0500 (Fri, 18 Feb 2011)
New Revision: 21786
Modified:
trunk/core/api/src/main/java/org/richfaces/application/configuration/ConfigurationItemSource.java
trunk/core/impl/richfaces-suppressions.xml
trunk/core/impl/src/main/java/org/richfaces/application/CoreConfiguration.java
trunk/core/impl/src/main/java/org/richfaces/application/configuration/ConfigurationServiceImpl.java
trunk/core/impl/src/main/java/org/richfaces/application/push/impl/jms/PushContextImpl.java
Log:
https://issues.jboss.org/browse/RF-10454
Modified:
trunk/core/api/src/main/java/org/richfaces/application/configuration/ConfigurationItemSource.java
===================================================================
---
trunk/core/api/src/main/java/org/richfaces/application/configuration/ConfigurationItemSource.java 2011-02-18
19:37:36 UTC (rev 21785)
+++
trunk/core/api/src/main/java/org/richfaces/application/configuration/ConfigurationItemSource.java 2011-02-18
20:26:27 UTC (rev 21786)
@@ -27,6 +27,8 @@
*/
public enum ConfigurationItemSource {
- contextInitParameter
+ contextInitParameter,
+ webEnvironmentEntry
+
}
Modified: trunk/core/impl/richfaces-suppressions.xml
===================================================================
--- trunk/core/impl/richfaces-suppressions.xml 2011-02-18 19:37:36 UTC (rev 21785)
+++ trunk/core/impl/richfaces-suppressions.xml 2011-02-18 20:26:27 UTC (rev 21786)
@@ -17,4 +17,5 @@
<suppress checks="IllegalThrows"
files="AbstractThreadedTest.java" />
<suppress checks="ModifiedControlVariable"
files="URLCodec.java" />
<suppress checks="IllegalCatch" files="AbstractRequest.java"
/>
+ <suppress checks="IllegalCatch"
files="ConfigurationServiceImpl.java" />
</suppressions>
Modified: trunk/core/impl/src/main/java/org/richfaces/application/CoreConfiguration.java
===================================================================
---
trunk/core/impl/src/main/java/org/richfaces/application/CoreConfiguration.java 2011-02-18
19:37:36 UTC (rev 21785)
+++
trunk/core/impl/src/main/java/org/richfaces/application/CoreConfiguration.java 2011-02-18
20:26:27 UTC (rev 21786)
@@ -22,6 +22,7 @@
package org.richfaces.application;
import org.richfaces.application.configuration.ConfigurationItem;
+import org.richfaces.application.configuration.ConfigurationItemSource;
/**
* @author Nick Belaevski
@@ -84,8 +85,14 @@
@ConfigurationItem(defaultValue = "", names =
"org.richfaces.push.jms.connectionUsername")
pushJMSConnectionUsername,
+ @ConfigurationItem(defaultValue = "", names =
"org.richfaces.push.jms.connectionUsername", source =
ConfigurationItemSource.webEnvironmentEntry)
+ pushJMSConnectionUsernameEnvRef,
+
@ConfigurationItem(defaultValue = "", names =
"org.richfaces.push.jms.connectionPassword")
- pushJMSConnectionPassword
+ pushJMSConnectionPassword,
+ @ConfigurationItem(defaultValue = "", names =
"org.richfaces.push.jms.connectionPassword", source =
ConfigurationItemSource.webEnvironmentEntry)
+ pushJMSConnectionPasswordEnvRef
+
}
}
Modified:
trunk/core/impl/src/main/java/org/richfaces/application/configuration/ConfigurationServiceImpl.java
===================================================================
---
trunk/core/impl/src/main/java/org/richfaces/application/configuration/ConfigurationServiceImpl.java 2011-02-18
19:37:36 UTC (rev 21785)
+++
trunk/core/impl/src/main/java/org/richfaces/application/configuration/ConfigurationServiceImpl.java 2011-02-18
20:26:27 UTC (rev 21786)
@@ -26,12 +26,18 @@
import java.text.MessageFormat;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicBoolean;
import javax.el.ExpressionFactory;
import javax.el.ValueExpression;
import javax.faces.context.FacesContext;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
import org.richfaces.el.util.ELUtils;
+import org.richfaces.log.Logger;
+import org.richfaces.log.RichfacesLogger;
import com.google.common.base.Strings;
import com.google.common.primitives.Primitives;
@@ -42,8 +48,14 @@
*/
public class ConfigurationServiceImpl implements ConfigurationService {
+ private static final Logger LOGGER = RichfacesLogger.APPLICATION.getLogger();
+
+ private static final String JNDI_COMP_PREFIX = "java:comp/env/";
+
private Map<Enum<?>, ValueExpressionHolder> itemsMap = new
ConcurrentHashMap<Enum<?>, ValueExpressionHolder>();
+ private AtomicBoolean webEnvironmentUnavailableLogged = new AtomicBoolean();
+
private final ConfigurationItem getConfigurationItemAnnotation(Enum<?> enumKey)
{
try {
ConfigurationItem item =
enumKey.getClass().getField(enumKey.name()).getAnnotation(ConfigurationItem.class);
@@ -103,37 +115,89 @@
return new ValueExpressionHolder(expression, defaultValue);
}
- private final ValueExpression createValueExpression(FacesContext context,
ConfigurationItem annotation, Class<?> targetType) {
- ConfigurationItemSource source = annotation.source();
+ private String getInitParameterValue(FacesContext context, ConfigurationItem
configurationItem) {
+ for (String name : configurationItem.names()) {
+ String value = (String) context.getExternalContext().getInitParameter(name);
+
+ if (!Strings.isNullOrEmpty(value)) {
+ return value;
+ }
+ }
- if (source == ConfigurationItemSource.contextInitParameter) {
- for (String name : annotation.names()) {
- String value = (String)
context.getExternalContext().getInitParameter(name);
+ return null;
+ }
+
+ private String getWebEnvironmentEntryValue(ConfigurationItem configurationItem) {
+ Context context = null;
+
+ try {
+ context = new InitialContext();
+ } catch (Throwable e) {
+ //Throwable is caught here due to GAE requirements
+ if (!webEnvironmentUnavailableLogged.getAndSet(true)) {
+ LOGGER.error(e.getMessage(), e);
+ }
+ }
+
+ if (context != null) {
+ for (String envName: configurationItem.names()) {
+ String qualifiedName;
- if (Strings.isNullOrEmpty(value)) {
- continue;
+ if (!envName.startsWith(JNDI_COMP_PREFIX)) {
+ qualifiedName = JNDI_COMP_PREFIX + envName;
+ } else {
+ qualifiedName = envName;
}
-
- if (!annotation.literal() && ELUtils.isValueReference(value)) {
- ExpressionFactory expressionFactory =
context.getApplication().getExpressionFactory();
-
- if (expressionFactory == null) {
- throw new IllegalStateException("ExpressionFactory is
null");
+
+ String value = null;
+ try {
+ value = (String) context.lookup(qualifiedName);
+ } catch (NamingException e) {
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug(e.getMessage(), e);
}
-
- return
expressionFactory.createValueExpression(context.getELContext(), value, targetType);
- } else {
- Object coercedValue = coerce(context, value, targetType);
- if (coercedValue != null) {
- return new ConstantValueExpression(coercedValue);
- }
}
+
+ if (!Strings.isNullOrEmpty(value)) {
+ return value;
+ }
}
-
- return null;
+ }
+
+ return null;
+ }
+
+ private final ValueExpression createValueExpression(FacesContext context,
ConfigurationItem annotation, Class<?> targetType) {
+ ConfigurationItemSource source = annotation.source();
+
+ String parameterValue = null;
+
+ if (source == ConfigurationItemSource.contextInitParameter) {
+ parameterValue = getInitParameterValue(context, annotation);
+ } else if (source == ConfigurationItemSource.webEnvironmentEntry) {
+ parameterValue = getWebEnvironmentEntryValue(annotation);
} else {
throw new IllegalArgumentException(source.toString());
}
+
+ if (!Strings.isNullOrEmpty(parameterValue)) {
+ if (!annotation.literal() &&
ELUtils.isValueReference(parameterValue)) {
+ ExpressionFactory expressionFactory =
context.getApplication().getExpressionFactory();
+
+ if (expressionFactory == null) {
+ throw new IllegalStateException("ExpressionFactory is
null");
+ }
+
+ return expressionFactory.createValueExpression(context.getELContext(),
parameterValue, targetType);
+ } else {
+ Object coercedValue = coerce(context, parameterValue, targetType);
+ if (coercedValue != null) {
+ return new ConstantValueExpression(coercedValue);
+ }
+ }
+ }
+
+ return null;
}
protected <T> T getValue(FacesContext facesContext, Enum<?> key,
Class<T> returnType) {
Modified:
trunk/core/impl/src/main/java/org/richfaces/application/push/impl/jms/PushContextImpl.java
===================================================================
---
trunk/core/impl/src/main/java/org/richfaces/application/push/impl/jms/PushContextImpl.java 2011-02-18
19:37:36 UTC (rev 21785)
+++
trunk/core/impl/src/main/java/org/richfaces/application/push/impl/jms/PushContextImpl.java 2011-02-18
20:26:27 UTC (rev 21786)
@@ -23,7 +23,9 @@
import static
org.richfaces.application.CoreConfiguration.Items.pushJMSConnectionFactory;
import static
org.richfaces.application.CoreConfiguration.Items.pushJMSConnectionPassword;
+import static
org.richfaces.application.CoreConfiguration.Items.pushJMSConnectionPasswordEnvRef;
import static
org.richfaces.application.CoreConfiguration.Items.pushJMSConnectionUsername;
+import static
org.richfaces.application.CoreConfiguration.Items.pushJMSConnectionUsernameEnvRef;
import static org.richfaces.application.CoreConfiguration.Items.pushJMSTopicsNamespace;
import javax.faces.FacesException;
@@ -50,6 +52,8 @@
import org.richfaces.log.Logger;
import org.richfaces.log.RichfacesLogger;
+import com.google.common.base.Strings;
+
/**
* @author Nick Belaevski
*
@@ -73,6 +77,24 @@
return servletContext.getContextPath();
}
+ private String getConnectionUserName(FacesContext facesContext, ConfigurationService
service) {
+ String userName = service.getStringValue(facesContext,
pushJMSConnectionUsername);
+ if (Strings.isNullOrEmpty(userName)) {
+ userName = service.getStringValue(facesContext,
pushJMSConnectionUsernameEnvRef);
+ }
+
+ return userName;
+ }
+
+ private String getConnectionPassword(FacesContext facesContext, ConfigurationService
service) {
+ String password = service.getStringValue(facesContext,
pushJMSConnectionPassword);
+ if (Strings.isNullOrEmpty(password)) {
+ password = service.getStringValue(facesContext,
pushJMSConnectionPasswordEnvRef);
+ }
+
+ return password;
+ }
+
public void init(FacesContext facesContext) {
try {
facesContext.getApplication().subscribeToEvent(PreDestroyApplicationEvent.class, this);
@@ -89,8 +111,8 @@
messagingContext = new MessagingContext(initialContext, cnfName,
topicsNamespace,
getApplicationName(facesContext),
- configurationService.getStringValue(facesContext,
pushJMSConnectionUsername),
- configurationService.getStringValue(facesContext,
pushJMSConnectionPassword));
+ getConnectionUserName(facesContext, configurationService),
+ getConnectionPassword(facesContext, configurationService));
messagingContext.shareInstance(facesContext);