Author: nbelaevski
Date: 2011-02-18 18:23:45 -0500 (Fri, 18 Feb 2011)
New Revision: 21788
Added:
trunk/core/api/src/main/java/org/richfaces/application/configuration/ConfigurationItemsBundle.java
Modified:
trunk/core/api/src/main/java/org/richfaces/application/configuration/ConfigurationItem.java
trunk/core/api/src/main/java/org/richfaces/application/configuration/ConfigurationItemSource.java
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/ConfigurationItem.java
===================================================================
---
trunk/core/api/src/main/java/org/richfaces/application/configuration/ConfigurationItem.java 2011-02-18
23:13:24 UTC (rev 21787)
+++
trunk/core/api/src/main/java/org/richfaces/application/configuration/ConfigurationItem.java 2011-02-18
23:23:45 UTC (rev 21788)
@@ -38,7 +38,7 @@
@Documented
public @interface ConfigurationItem {
- public ConfigurationItemSource source() default
ConfigurationItemSource.contextInitParameter;
+ public ConfigurationItemSource source() default
ConfigurationItemSource.defaultSource;
public String[] names();
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
23:13:24 UTC (rev 21787)
+++
trunk/core/api/src/main/java/org/richfaces/application/configuration/ConfigurationItemSource.java 2011-02-18
23:23:45 UTC (rev 21788)
@@ -27,6 +27,8 @@
*/
public enum ConfigurationItemSource {
+ defaultSource,
+
contextInitParameter,
webEnvironmentEntry
Added:
trunk/core/api/src/main/java/org/richfaces/application/configuration/ConfigurationItemsBundle.java
===================================================================
---
trunk/core/api/src/main/java/org/richfaces/application/configuration/ConfigurationItemsBundle.java
(rev 0)
+++
trunk/core/api/src/main/java/org/richfaces/application/configuration/ConfigurationItemsBundle.java 2011-02-18
23:23:45 UTC (rev 21788)
@@ -0,0 +1,41 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2011, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.application.configuration;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+(a)Retention(RetentionPolicy.RUNTIME)
+(a)Target(ElementType.TYPE)
+@Documented
+public @interface ConfigurationItemsBundle {
+
+ public String propertiesFile() default "";
+
+}
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
23:13:24 UTC (rev 21787)
+++
trunk/core/impl/src/main/java/org/richfaces/application/CoreConfiguration.java 2011-02-18
23:23:45 UTC (rev 21788)
@@ -23,6 +23,7 @@
import org.richfaces.application.configuration.ConfigurationItem;
import org.richfaces.application.configuration.ConfigurationItemSource;
+import org.richfaces.application.configuration.ConfigurationItemsBundle;
/**
* @author Nick Belaevski
@@ -95,4 +96,21 @@
pushJMSConnectionPasswordEnvRef
}
+
+ @ConfigurationItemsBundle(propertiesFile =
"org/richfaces/push.properties")
+ public enum PushPropertiesItems {
+
+ @ConfigurationItem(names = "jms.connectionFactory")
+ pushPropertiesJMSConnectionFactory,
+
+ @ConfigurationItem(names = "jms.topicsNamespace")
+ pushPropertiesJMSTopicsNamespace,
+
+ @ConfigurationItem(names = "jms.connectionUsername")
+ pushPropertiesJMSConnectionUsername,
+
+ @ConfigurationItem(names = "jms.connectionPassword")
+ pushPropertiesJMSConnectionPassword
+
+ }
}
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
23:13:24 UTC (rev 21787)
+++
trunk/core/impl/src/main/java/org/richfaces/application/configuration/ConfigurationServiceImpl.java 2011-02-18
23:23:45 UTC (rev 21788)
@@ -23,8 +23,14 @@
import java.beans.PropertyEditor;
import java.beans.PropertyEditorManager;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
import java.text.MessageFormat;
+import java.util.EnumSet;
+import java.util.Iterator;
import java.util.Map;
+import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -35,11 +41,13 @@
import javax.naming.InitialContext;
import javax.naming.NamingException;
+import org.ajax4jsf.resource.util.URLToStreamHelper;
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.io.Closeables;
import com.google.common.primitives.Primitives;
/**
@@ -56,7 +64,7 @@
private AtomicBoolean webEnvironmentUnavailableLogged = new AtomicBoolean();
- private final ConfigurationItem getConfigurationItemAnnotation(Enum<?> enumKey)
{
+ private final ConfigurationItem getConfigurationItem(Enum<?> enumKey) {
try {
ConfigurationItem item =
enumKey.getClass().getField(enumKey.name()).getAnnotation(ConfigurationItem.class);
if (item != null) {
@@ -98,17 +106,12 @@
throw new IllegalArgumentException(MessageFormat.format("Cannot convert {0}
to object of {1} type", value, targetType.getName()));
}
- protected ValueExpressionHolder createValueExpressionHolder(FacesContext context,
Enum<?> key, Class<?> targetType) {
- ConfigurationItem annotation = getConfigurationItemAnnotation(key);
-
- ValueExpression expression = createValueExpression(context, annotation,
targetType);
-
+ protected ValueExpressionHolder createValueExpressionHolder(FacesContext context,
ValueExpression expression, String defaultValueString, Class<?> returnType) {
Object defaultValue = null;
if (expression == null || !expression.isLiteralText()) {
- String defaultValueString = annotation.defaultValue();
if (!Strings.isNullOrEmpty(defaultValueString)) {
- defaultValue = coerce(context, defaultValueString, targetType);
+ defaultValue = coerce(context, defaultValueString, returnType);
}
}
@@ -167,9 +170,13 @@
return null;
}
- private final ValueExpression createValueExpression(FacesContext context,
ConfigurationItem annotation, Class<?> targetType) {
+ private final ValueExpression createContextValueExpression(FacesContext context,
ConfigurationItem annotation, Class<?> targetType) {
ConfigurationItemSource source = annotation.source();
+ if (source == ConfigurationItemSource.defaultSource) {
+ source = ConfigurationItemSource.contextInitParameter;
+ }
+
String parameterValue = null;
if (source == ConfigurationItemSource.contextInitParameter) {
@@ -181,36 +188,125 @@
}
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 createValueExpression(context, parameterValue, annotation.literal(),
targetType);
}
return null;
}
+
+ private ValueExpression createValueExpression(FacesContext context, String
parameterValue, boolean literal,
+ Class<?> targetType) {
+
+ ValueExpression result = null;
+
+ if (!literal && ELUtils.isValueReference(parameterValue)) {
+ ExpressionFactory expressionFactory =
context.getApplication().getExpressionFactory();
+
+ if (expressionFactory == null) {
+ throw new IllegalStateException("ExpressionFactory is null");
+ }
+
+ result = expressionFactory.createValueExpression(context.getELContext(),
parameterValue, targetType);
+ } else {
+ Object coercedValue = coerce(context, parameterValue, targetType);
+ if (coercedValue != null) {
+ result = new ConstantValueExpression(coercedValue);
+ }
+ }
+
+ return result;
+ }
protected <T> T getValue(FacesContext facesContext, Enum<?> key,
Class<T> returnType) {
ValueExpressionHolder holder = itemsMap.get(key);
if (holder == null) {
- holder = createValueExpressionHolder(facesContext, key, returnType);
- itemsMap.put(key, holder);
+ ConfigurationItemsBundle configurationItemsBundle =
getConfigurationItemsBundle(key);
+
+ if (configurationItemsBundle == null) {
+ ConfigurationItem item = getConfigurationItem(key);
+ ValueExpression expression = createContextValueExpression(facesContext,
item, returnType);
+ holder = createValueExpressionHolder(facesContext, expression,
item.defaultValue(), returnType);
+ itemsMap.put(key, holder);
+ } else {
+ synchronized (key.getClass()) {
+ Properties properties =
loadProperties(configurationItemsBundle.propertiesFile());
+
+ Iterator<Object> keys =
EnumSet.allOf(key.getClass()).iterator();
+ while (keys.hasNext()) {
+ Enum<?> nextBundleKey = (Enum<?>) keys.next();
+
+ ConfigurationItem item = getConfigurationItem(nextBundleKey);
+
+ if (item.source() != ConfigurationItemSource.defaultSource) {
+ throw new IllegalArgumentException(item.toString());
+ }
+
+ String parameterValue = null;
+
+ for (String propertyName: item.names()) {
+ parameterValue = properties.getProperty(propertyName);
+
+ if (parameterValue != null) {
+ break;
+ }
+ }
+
+ ValueExpression expression = null;
+
+ if (parameterValue != null) {
+ expression = createValueExpression(facesContext,
parameterValue, item.literal(), returnType);
+ }
+
+ ValueExpressionHolder siblingHolder =
createValueExpressionHolder(facesContext, expression, item.defaultValue(),
+ returnType);
+
+ itemsMap.put(nextBundleKey, siblingHolder);
+
+ if (key == nextBundleKey) {
+ holder = siblingHolder;
+ }
+ }
+ }
+ }
}
return returnType.cast(holder.getValue(facesContext));
}
+ private Properties loadProperties(String resourceName) {
+ Properties properties = new Properties();
+
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ if (classLoader != null) {
+ URL url = classLoader.getResource(resourceName);
+ if (url != null) {
+ InputStream is = null;
+ try {
+ is = URLToStreamHelper.urlToStream(url);
+ properties.load(is);
+ } catch (IOException e) {
+ LOGGER.error(e.getMessage(), e);
+ } finally {
+ Closeables.closeQuietly(is);
+ }
+ }
+ }
+
+ return properties;
+ }
+
+ private ConfigurationItemsBundle getConfigurationItemsBundle(Enum<?> key) {
+ ConfigurationItem item = getConfigurationItem(key);
+ ConfigurationItemSource source = item.source();
+ if (source == ConfigurationItemSource.defaultSource) {
+ Class<?> enclosingClass = key.getClass();
+ return enclosingClass.getAnnotation(ConfigurationItemsBundle.class);
+ }
+
+ return null;
+ }
+
public Boolean getBooleanValue(FacesContext facesContext, Enum<?> key) {
return getValue(facesContext, key, Boolean.class);
}
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
23:13:24 UTC (rev 21787)
+++
trunk/core/impl/src/main/java/org/richfaces/application/push/impl/jms/PushContextImpl.java 2011-02-18
23:23:45 UTC (rev 21788)
@@ -27,6 +27,10 @@
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 static
org.richfaces.application.CoreConfiguration.PushPropertiesItems.pushPropertiesJMSConnectionFactory;
+import static
org.richfaces.application.CoreConfiguration.PushPropertiesItems.pushPropertiesJMSConnectionPassword;
+import static
org.richfaces.application.CoreConfiguration.PushPropertiesItems.pushPropertiesJMSConnectionUsername;
+import static
org.richfaces.application.CoreConfiguration.PushPropertiesItems.pushPropertiesJMSTopicsNamespace;
import javax.faces.FacesException;
import javax.faces.context.FacesContext;
@@ -77,24 +81,17 @@
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);
+ private String getFirstNonEmptyConfgirutationValue(FacesContext facesContext,
ConfigurationService service, Enum<?>... keys) {
+ for (Enum<?> key : keys) {
+ String value = service.getStringValue(facesContext, key);
+ if (!Strings.isNullOrEmpty(value)) {
+ return value;
+ }
}
- return userName;
+ return "";
}
- 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);
@@ -106,13 +103,14 @@
NameParser nameParser = initialContext.getNameParser("");
- Name cnfName =
nameParser.parse(configurationService.getStringValue(facesContext,
pushJMSConnectionFactory));
- Name topicsNamespace =
nameParser.parse(configurationService.getStringValue(facesContext,
pushJMSTopicsNamespace));
+ Name cnfName = nameParser.parse(getConnectionFactory(facesContext,
configurationService));
+ Name topicsNamespace = nameParser.parse(getTopicsNamespace(facesContext,
configurationService));
messagingContext = new MessagingContext(initialContext, cnfName,
topicsNamespace,
getApplicationName(facesContext),
- getConnectionUserName(facesContext, configurationService),
- getConnectionPassword(facesContext, configurationService));
+ getUserName(facesContext, configurationService),
+ getPassword(facesContext, configurationService)
+ );
messagingContext.shareInstance(facesContext);
@@ -126,6 +124,26 @@
}
}
+ private String getPassword(FacesContext facesContext, ConfigurationService
configurationService) {
+ return getFirstNonEmptyConfgirutationValue(facesContext, configurationService,
+ pushPropertiesJMSConnectionPassword, pushJMSConnectionPasswordEnvRef,
pushJMSConnectionPassword);
+ }
+
+ private String getUserName(FacesContext facesContext, ConfigurationService
configurationService) {
+ return getFirstNonEmptyConfgirutationValue(facesContext, configurationService,
+ pushPropertiesJMSConnectionUsername, pushJMSConnectionUsernameEnvRef,
pushJMSConnectionUsername);
+ }
+
+ private String getConnectionFactory(FacesContext facesContext, ConfigurationService
configurationService) {
+ return getFirstNonEmptyConfgirutationValue(facesContext, configurationService,
+ pushPropertiesJMSConnectionFactory, pushJMSConnectionFactory);
+ }
+
+ private String getTopicsNamespace(FacesContext facesContext, ConfigurationService
configurationService) {
+ return getFirstNonEmptyConfgirutationValue(facesContext, configurationService,
+ pushPropertiesJMSTopicsNamespace, pushJMSTopicsNamespace);
+ }
+
public void destroy() {
if (pushHandlerImpl != null) {
try {